mirror of
https://github.com/git/git.git
synced 2024-11-30 21:44:02 +08:00
aa32939fea
The bitmap reachability index used to speed up the counting objects phase during `pack-objects` can also be used to optimize a normal rev-list if the only thing required are the SHA1s of the objects during the list (i.e., not the path names at which trees and blobs were found). Calling `git rev-list --objects --use-bitmap-index [committish]` will perform an object iteration based on a bitmap result instead of actually walking the object graph. These are some example timings for `torvalds/linux` (warm cache, best-of-five): $ time git rev-list --objects master > /dev/null real 0m34.191s user 0m33.904s sys 0m0.268s $ time git rev-list --objects --use-bitmap-index master > /dev/null real 0m1.041s user 0m0.976s sys 0m0.064s Likewise, using `git rev-list --count --use-bitmap-index` will speed up the counting operation by building the resulting bitmap and performing a fast popcount (number of bits set on the bitmap) on the result. Here are some sample timings of different ways to count commits in `torvalds/linux`: $ time git rev-list master | wc -l 399882 real 0m6.524s user 0m6.060s sys 0m3.284s $ time git rev-list --count master 399882 real 0m4.318s user 0m4.236s sys 0m0.076s $ time git rev-list --use-bitmap-index --count master 399882 real 0m0.217s user 0m0.176s sys 0m0.040s This also respects negative refs, so you can use it to count a slice of history: $ time git rev-list --count v3.0..master 144843 real 0m1.971s user 0m1.932s sys 0m0.036s $ time git rev-list --use-bitmap-index --count v3.0..master real 0m0.280s user 0m0.220s sys 0m0.056s Though note that the closer the endpoints, the less it helps. In the traversal case, we have fewer commits to cross, so we take less time. But the bitmap time is dominated by generating the pack revindex, which is constant with respect to the refs given. Note that you cannot yet get a fast --left-right count of a symmetric difference (e.g., "--count --left-right master...topic"). The slow part of that walk actually happens during the merge-base determination when we parse "master...topic". Even though a count does not actually need to know the real merge base (it only needs to take the symmetric difference of the bitmaps), the revision code would require some refactoring to handle this case. Additionally, a `--test-bitmap` flag has been added that will perform the same rev-list manually (i.e. using a normal revwalk) and using bitmaps, and verify that the results are the same. This can be used to exercise the bitmap code, and also to verify that the contents of the .bitmap file are sane. Signed-off-by: Vicent Marti <tanoku@gmail.com> Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
120 lines
3.6 KiB
Plaintext
120 lines
3.6 KiB
Plaintext
git-rev-list(1)
|
|
===============
|
|
|
|
NAME
|
|
----
|
|
git-rev-list - Lists commit objects in reverse chronological order
|
|
|
|
|
|
SYNOPSIS
|
|
--------
|
|
[verse]
|
|
'git rev-list' [ \--max-count=<number> ]
|
|
[ \--skip=<number> ]
|
|
[ \--max-age=<timestamp> ]
|
|
[ \--min-age=<timestamp> ]
|
|
[ \--sparse ]
|
|
[ \--merges ]
|
|
[ \--no-merges ]
|
|
[ \--min-parents=<number> ]
|
|
[ \--no-min-parents ]
|
|
[ \--max-parents=<number> ]
|
|
[ \--no-max-parents ]
|
|
[ \--first-parent ]
|
|
[ \--remove-empty ]
|
|
[ \--full-history ]
|
|
[ \--not ]
|
|
[ \--all ]
|
|
[ \--branches[=<pattern>] ]
|
|
[ \--tags[=<pattern>] ]
|
|
[ \--remotes[=<pattern>] ]
|
|
[ \--glob=<glob-pattern> ]
|
|
[ \--ignore-missing ]
|
|
[ \--stdin ]
|
|
[ \--quiet ]
|
|
[ \--topo-order ]
|
|
[ \--parents ]
|
|
[ \--timestamp ]
|
|
[ \--left-right ]
|
|
[ \--left-only ]
|
|
[ \--right-only ]
|
|
[ \--cherry-mark ]
|
|
[ \--cherry-pick ]
|
|
[ \--encoding=<encoding> ]
|
|
[ \--(author|committer|grep)=<pattern> ]
|
|
[ \--regexp-ignore-case | -i ]
|
|
[ \--extended-regexp | -E ]
|
|
[ \--fixed-strings | -F ]
|
|
[ \--date=(local|relative|default|iso|rfc|short) ]
|
|
[ [\--objects | \--objects-edge] [ \--unpacked ] ]
|
|
[ \--pretty | \--header ]
|
|
[ \--bisect ]
|
|
[ \--bisect-vars ]
|
|
[ \--bisect-all ]
|
|
[ \--merge ]
|
|
[ \--reverse ]
|
|
[ \--walk-reflogs ]
|
|
[ \--no-walk ] [ \--do-walk ]
|
|
[ \--use-bitmap-index ]
|
|
<commit>... [ \-- <paths>... ]
|
|
|
|
DESCRIPTION
|
|
-----------
|
|
|
|
List commits that are reachable by following the `parent` links from the
|
|
given commit(s), but exclude commits that are reachable from the one(s)
|
|
given with a '{caret}' in front of them. The output is given in reverse
|
|
chronological order by default.
|
|
|
|
You can think of this as a set operation. Commits given on the command
|
|
line form a set of commits that are reachable from any of them, and then
|
|
commits reachable from any of the ones given with '{caret}' in front are
|
|
subtracted from that set. The remaining commits are what comes out in the
|
|
command's output. Various other options and paths parameters can be used
|
|
to further limit the result.
|
|
|
|
Thus, the following command:
|
|
|
|
-----------------------------------------------------------------------
|
|
$ git rev-list foo bar ^baz
|
|
-----------------------------------------------------------------------
|
|
|
|
means "list all the commits which are reachable from 'foo' or 'bar', but
|
|
not from 'baz'".
|
|
|
|
A special notation "'<commit1>'..'<commit2>'" can be used as a
|
|
short-hand for "{caret}'<commit1>' '<commit2>'". For example, either of
|
|
the following may be used interchangeably:
|
|
|
|
-----------------------------------------------------------------------
|
|
$ git rev-list origin..HEAD
|
|
$ git rev-list HEAD ^origin
|
|
-----------------------------------------------------------------------
|
|
|
|
Another special notation is "'<commit1>'...'<commit2>'" which is useful
|
|
for merges. The resulting set of commits is the symmetric difference
|
|
between the two operands. The following two commands are equivalent:
|
|
|
|
-----------------------------------------------------------------------
|
|
$ git rev-list A B --not $(git merge-base --all A B)
|
|
$ git rev-list A...B
|
|
-----------------------------------------------------------------------
|
|
|
|
'rev-list' is a very essential Git command, since it
|
|
provides the ability to build and traverse commit ancestry graphs. For
|
|
this reason, it has a lot of different options that enables it to be
|
|
used by commands as different as 'git bisect' and
|
|
'git repack'.
|
|
|
|
OPTIONS
|
|
-------
|
|
|
|
:git-rev-list: 1
|
|
include::rev-list-options.txt[]
|
|
|
|
include::pretty-formats.txt[]
|
|
|
|
GIT
|
|
---
|
|
Part of the linkgit:git[1] suite
|