git/list[1] front-page[2] threads[3] people[4] search[5] about
 

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

From
Junio C Hamano <junkio@cox.net>
Date
Apr 14, 2006, 22:40 UTC
Message-ID
<7vhd4vok6q.fsf@assigned-by-dhcp.cox.net>

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(-)
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)
Message 1 of 1 in “rev-list --bisect: limit list before bisecting.”
  1. rev-list --bisect: limit list before bisecting.Junio C Hamano, Apr 14, 2006

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.