Re: Passing rev-list options in git-filter-branch broken

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Junio C Hamano <gitster@xxxxxxxxx> writes:

> Felix Eckhofer <felix@xxxxxxxxx> writes:
>
>> This seems to have been caused by 3361a548db. After reverting this
>> commit, using --date-order appears to work again.
>
> Hmph, unfortunate.
>
> 3361a548 (Allow git-filter-branch to process large repositories with
> lots of branches., 2013-09-10) has this change:
>
>  
>     -rev_args=$(git rev-parse --revs-only "$@")
>     +git rev-parse --revs-only "$@" >../parse
>
> and then later feeds ../parse from the standard input of rev-list.
>
> The --revs-only option, because --date-order *is* a rev-list related
> argument, is emitted by the above rev-parse, along with the tip of
> refs (which come from --all).  But --stdin mode of rev-list is meant
> to receive *only* revisions, not options.  When it gets to the point
> to accept the list of tips to start traversing from, it is too late
> to give it an option.
>
> Changing the above to something like:
>
> 	git rev-parse --revs-only --no-flags "$@" >../parse
>
> would be a better workaround that would not break repositories with
> large number of references, but it obviously will lose --date-order
> option (why would it be even necessary, though?  I suspect that
> forcing the date-order will make the resulting pack a lot worse by
> robbing the data stream of locality).

As the original "../parse" file will have mixture of revs (i.e. the
object names) and whatever rev-list options (e.g. "--date-order")
you gave from the command line, here is a band-aid to sift them into
two, to be applied on top of 3361a548 (Allow git-filter-branch to
process large repositories with lots of branches., 2013-09-10).

I wish there was a way to tell rev-parse "give us only flags
relevant to rev-list, don't include revs in the output", but I do
not think there was ever any such option (we can get revs without
any flags with --no-flags, though).


 git-filter-branch.sh | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/git-filter-branch.sh b/git-filter-branch.sh
index ca3d539..ed55c01 100755
--- a/git-filter-branch.sh
+++ b/git-filter-branch.sh
@@ -255,7 +255,9 @@ else
 	remap_to_ancestor=t
 fi
 
-git rev-parse --revs-only "$@" >../parse
+git rev-parse --revs-only "$@" >../parse.revs.flags
+sed -ne '/^[0-9a-f][0-9a-f][0-9a-f]*[0-9a-f]$/p' <../parse.revs.flags >../parse.revs
+sed -e '/^[0-9a-f][0-9a-f][0-9a-f]*[0-9a-f]$/d' <../parse.revs.flags >../parse.flags
 
 case "$filter_subdir" in
 "")
@@ -268,7 +270,8 @@ case "$filter_subdir" in
 esac
 
 git rev-list --reverse --topo-order --default HEAD \
-	--parents --simplify-merges --stdin "$@" <../parse >../revs ||
+	--parents --simplify-merges --stdin "$@" \
+	$(cat ../parse.flags) <../parse.revs >../revs ||
 	die "Could not get the commits"
 commits=$(wc -l <../revs | tr -d " ")
 
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]