threads / patch / 3872

patchrev-list --bisect: limit list before bisecting.

Subject: [PATCH] rev-list --bisect: limit list before bisecting.

## tl;dr

One message between Apr 14, 2006 and Apr 14, 2006. Diffs are folded; open one to read it.

replies: 0people: 1as markdown or json

Junio C Hamano· Apr 14, 2006, 22:40 UTC · lore

I noticed bisect does not work well without both good and bad. Running this script in git.git repository would give you quite different results:

	#!/bin/sh
        initial=e83c5163316f89bfbde7d9ab23ca2e25604af290
        mid0=`git rev-list --bisect ^$initial --all`
        git rev-list $mid0 | wc -l
        git rev-list ^$mid0 --all | wc -l
        mid1=`git rev-list --bisect --all`
        git rev-list $mid1 | wc -l
        git rev-list ^$mid1 --all | wc -l

The $initial commit is the very first commit you made. The first midpoint bisects things evenly as designed, but the latter does not.

The reason I got interested in this was because I was wondering if something like the following would help people converting a huge repository from foreign SCM, or preparing a repository to be fetched over plain dumb HTTP only:

        #!/bin/sh
        N=4
        P=.git/objects/pack
        bottom=
        while test 0 \< $N
        do
                N=$((N-1))
                if test -z "$bottom"
                then
                        newbottom=`git rev-list --bisect --all`
                else
                        newbottom=`git rev-list --bisect ^$bottom --all`
                fi
                if test -z "$bottom"
                then
                        rev_list="$newbottom"
                elif test 0 = $N
                then
                        rev_list="^$bottom --all"
                else
                        rev_list="^$bottom $newbottom"
                fi
                p=$(git rev-list --unpacked --objects $rev_list |
                    git pack-objects $P/pack)
                git show-index <$P/pack-$p.idx | wc -l
                bottom=$newbottom
        done

The idea is to pack older half of the history to one pack, then older half of the remaining history to another, to continue a few times, using finer granularity as we get closer to the tip.

This may not matter, since for a truly huge history, running bisect number of times could be quite time consuming, and we might be better off running "git rev-list --all" once into a temporary file, and manually pick cut-off points from the resulting list of commits. After all we are talking about "approximately half" for such an usage, and older history does not matter much.

Signed-off-by: Junio C Hamano <junkio@cox.net>
---
 rev-list.c |    2 ++
 1 files changed, 2 insertions(+), 0 deletions(-)
Show changes to rev-list.c +2 −0
diff --git a/rev-list.c b/rev-list.c
index 963707a..cb67b39 100644
--- a/rev-list.c
+++ b/rev-list.c
@@ -371,6 +371,8 @@ int main(int argc, const char **argv)
 
 	save_commit_buffer = verbose_header;
 	track_object_refs = 0;
+	if (bisect_list)
+		revs.limited = 1;
 
 	prepare_revision_walk(&revs);
 	if (revs.tree_objects)

← back to recent threads