From: Junio C Hamano Date: Thu, 7 Jan 2010 23:40:30 +0000 (-0800) Subject: Merge branch 'js/filter-branch-prime' X-Git-Tag: v1.7.0-rc0~122 X-Git-Url: https://git.lorimer.id.au/gitweb.git/diff_plain/f012d27ff3e37d0412bba34ca53a2d444fd3c563?ds=inline;hp=-c Merge branch 'js/filter-branch-prime' * js/filter-branch-prime: filter-branch: remove an unnecessary use of 'git read-tree' --- f012d27ff3e37d0412bba34ca53a2d444fd3c563 diff --combined git-filter-branch.sh index cb9d2022cc,cfead301ee..195b5ef48e --- a/git-filter-branch.sh +++ b/git-filter-branch.sh @@@ -125,7 -125,6 +125,7 @@@ filter_subdir orig_namespace=refs/original/ force= prune_empty= +remap_to_ancestor= while : do case "$1" in @@@ -138,11 -137,6 +138,11 @@@ force=t continue ;; + --remap-to-ancestor) + shift + remap_to_ancestor=t + continue + ;; --prune-empty) shift prune_empty=t @@@ -188,7 -182,6 +188,7 @@@ ;; --subdirectory-filter) filter_subdir="$OPTARG" + remap_to_ancestor=t ;; --original) orig_namespace=$(expr "$OPTARG/" : '\(.*[^/]\)/*$')/ @@@ -259,29 -252,19 +259,28 @@@ test -s "$tempdir"/heads | GIT_INDEX_FILE="$(pwd)/../index" export GIT_INDEX_FILE - 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" @@@ -361,19 -344,19 +360,19 @@@ while read commit parents; d die "could not write rewritten commit" done <../revs -# In case of a subdirectory filter, it is possible that a specified head -# is not in the set of rewritten commits, because it was pruned by the -# revision walker. Fix it by mapping these heads to the unique nearest -# ancestor that survived the pruning. +# If we are filtering for paths, as in the case of a subdirectory +# filter, it is possible that a specified head is not in the set of +# rewritten commits, because it was pruned by the revision walker. +# Ancestor remapping fixes this by mapping these heads to the unique +# nearest ancestor that survived the pruning. -if test "$filter_subdir" +if test "$remap_to_ancestor" = t then while read ref 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