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=e83c5163316f89bfbde7d9ab23ca2e25604af290mid0=`git rev-list --bisect ^$initial --all`
git rev-list $mid0 | wc -l
git rev-list ^$mid0 --all | wc -lmid1=`git rev-list --bisect --all`
git rev-list $mid1 | wc -l
git rev-list ^$mid1 --all | wc -lThe $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
doneThe 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)