diff options
author | Junio C Hamano <junkio@cox.net> | 2006-04-14 15:57:32 -0700 |
---|---|---|
committer | Junio C Hamano <junkio@cox.net> | 2006-04-14 21:52:50 -0700 |
commit | 4e1dc640097d4e389f12bcf12f75cdf7e4ceae61 (patch) | |
tree | 118a499ce04ff9d86e502727931c955bbe8b405a | |
parent | 40c2fe003ce2af3ec522f239be274fd1a27422f6 (diff) | |
download | git-4e1dc640097d4e389f12bcf12f75cdf7e4ceae61.tar.gz |
rev-list --bisect: limit list before bisecting.
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>
-rw-r--r-- | rev-list.c | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/rev-list.c b/rev-list.c index 963707a495..cb67b399fc 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) |