filter-branch: stop special-casing $filter_subdir argument
Handling $filter_subdir in the usual way requires a separate case at every use, because the variable is empty when unused. Furthermore, --subdirectory-filter supplies its own '--', and if the user provided one himself, such as in git filter-branch --subdirectory-filter subdir -- --all -- subdir/file an extra '--' was used as path filter in the call to git-rev-list that determines the commits that shall be rewritten. To keep the argument handling sane, we filter $@ to contain only the non-revision arguments, and store all revisions in $ref_args. The $ref_args are easy to handle since only the SHA1s are needed; the actual branch names have already been stored in $tempdir/heads at this point. An extra separating -- is only required if the user did not provide any non-revision arguments, as the latter disambiguate the $filter_subdir following after them (or fail earlier because they are ambiguous themselves). Thanks to Johannes Sixt for suggesting this solution. Signed-off-by: Thomas Rast <trast@student.ethz.ch> Signed-off-by: Johannes Sixt <j6t@kdbg.org> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
78d553b7d7
commit
2c1d2d8188
@ -257,15 +257,24 @@ git read-tree || die "Could not seed the index"
|
||||
# map old->new commit ids for rewriting parents
|
||||
mkdir ../map || die "Could not create map/ directory"
|
||||
|
||||
# we need "--" only if there are no path arguments in $@
|
||||
nonrevs=$(git rev-parse --no-revs "$@") || exit
|
||||
test -z "$nonrevs" && dashdash=-- || dashdash=
|
||||
rev_args=$(git rev-parse --revs-only "$@")
|
||||
|
||||
case "$filter_subdir" in
|
||||
"")
|
||||
git rev-list --reverse --topo-order --default HEAD \
|
||||
--parents --simplify-merges "$@"
|
||||
eval set -- "$(git rev-parse --sq --no-revs "$@")"
|
||||
;;
|
||||
*)
|
||||
git rev-list --reverse --topo-order --default HEAD \
|
||||
--parents --simplify-merges "$@" -- "$filter_subdir"
|
||||
esac > ../revs || die "Could not get the commits"
|
||||
eval set -- "$(git rev-parse --sq --no-revs "$@" $dashdash \
|
||||
"$filter_subdir")"
|
||||
;;
|
||||
esac
|
||||
|
||||
git rev-list --reverse --topo-order --default HEAD \
|
||||
--parents --simplify-merges $rev_args "$@" > ../revs ||
|
||||
die "Could not get the commits"
|
||||
commits=$(wc -l <../revs | tr -d " ")
|
||||
|
||||
test $commits -eq 0 && die "Found nothing to rewrite"
|
||||
@ -356,8 +365,7 @@ then
|
||||
do
|
||||
sha1=$(git rev-parse "$ref"^0)
|
||||
test -f "$workdir"/../map/$sha1 && continue
|
||||
ancestor=$(git rev-list --simplify-merges -1 \
|
||||
$ref -- "$filter_subdir")
|
||||
ancestor=$(git rev-list --simplify-merges -1 "$ref" "$@")
|
||||
test "$ancestor" && echo $(map $ancestor) >> "$workdir"/../map/$sha1
|
||||
done < "$tempdir"/heads
|
||||
fi
|
||||
|
Loading…
Reference in New Issue
Block a user