rev-list --bisect: limit list before bisecting.
authorJunio C Hamano <junkio@cox.net>
Fri, 14 Apr 2006 22:57:32 +0000 (15:57 -0700)
committerJunio C Hamano <junkio@cox.net>
Sat, 15 Apr 2006 04:52:50 +0000 (21:52 -0700)
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
index 963707a495092405c3eb5b155c195b2968afdac7..cb67b399fc560c17e1611139aeebb0a51553ecfa 100644 (file)
@@ -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)