Go to file
Taylor Blau 5421e7c3a1 commit-graph: reuse existing Bloom filters where possible
In an earlier commit, a bug was described where it's possible for Git to
produce non-murmur3 hashes when the platform's "char" type is signed,
and there are paths with characters whose highest bit is set (i.e. all
characters >= 0x80).

That patch allows the caller to control which version of Bloom filters
are read and written. However, even on platforms with a signed "char"
type, it is possible to reuse existing Bloom filters if and only if
there are no changed paths in any commit's first parent tree-diff whose
characters have their highest bit set.

When this is the case, we can reuse the existing filter without having
to compute a new one. This is done by marking trees which are known to
have (or not have) any such paths. When a commit's root tree is verified
to not have any such paths, we mark it as such and declare that the
commit's Bloom filter is reusable.

Note that this heuristic only goes in one direction. If neither a commit
nor its first parent have any paths in their trees with non-ASCII
characters, then we know for certain that a path with non-ASCII
characters will not appear in a tree-diff against that commit's first
parent. The reverse isn't necessarily true: just because the tree-diff
doesn't contain any such paths does not imply that no such paths exist
in either tree.

So we end up recomputing some Bloom filters that we don't strictly have
to (i.e. their bits are the same no matter which version of murmur3 we
use). But culling these out is impossible, since we'd have to perform
the full tree-diff, which is the same effort as computing the Bloom
filter from scratch.

But because we can cache our results in each tree's flag bits, we can
often avoid recomputing many filters, thereby reducing the time it takes
to run

    $ git commit-graph write --changed-paths --reachable

when upgrading from v1 to v2 Bloom filters.

To benchmark this, let's generate a commit-graph in linux.git with v1
changed-paths in generation order[^1]:

    $ git clone git@github.com:torvalds/linux.git
    $ cd linux
    $ git commit-graph write --reachable --changed-paths
    $ graph=".git/objects/info/commit-graph"
    $ mv $graph{,.bak}

Then let's time how long it takes to go from v1 to v2 filters (with and
without the upgrade path enabled), resetting the state of the
commit-graph each time:

    $ git config commitGraph.changedPathsVersion 2
    $ hyperfine -p 'cp -f $graph.bak $graph' -L v 0,1 \
        'GIT_TEST_UPGRADE_BLOOM_FILTERS={v} git.compile commit-graph write --reachable --changed-paths'

On linux.git (where there aren't any non-ASCII paths), the timings
indicate that this patch represents a speed-up over recomputing all
Bloom filters from scratch:

    Benchmark 1: GIT_TEST_UPGRADE_BLOOM_FILTERS=0 git.compile commit-graph write --reachable --changed-paths
      Time (mean ± σ):     124.873 s ±  0.316 s    [User: 124.081 s, System: 0.643 s]
      Range (min … max):   124.621 s … 125.227 s    3 runs

    Benchmark 2: GIT_TEST_UPGRADE_BLOOM_FILTERS=1 git.compile commit-graph write --reachable --changed-paths
      Time (mean ± σ):     79.271 s ±  0.163 s    [User: 74.611 s, System: 4.521 s]
      Range (min … max):   79.112 s … 79.437 s    3 runs

    Summary
      'GIT_TEST_UPGRADE_BLOOM_FILTERS=1 git.compile commit-graph write --reachable --changed-paths' ran
        1.58 ± 0.01 times faster than 'GIT_TEST_UPGRADE_BLOOM_FILTERS=0 git.compile commit-graph write --reachable --changed-paths'

On git.git, we do have some non-ASCII paths, giving us a more modest
improvement from 4.163 seconds to 3.348 seconds, for a 1.24x speed-up.
On my machine, the stats for git.git are:

  - 8,285 Bloom filters computed from scratch
  - 10 Bloom filters generated as empty
  - 4 Bloom filters generated as truncated due to too many changed paths
  - 65,114 Bloom filters were reused when transitioning from v1 to v2.

[^1]: Note that this is is important, since `--stdin-packs` or
  `--stdin-commits` orders commits in the commit-graph by their pack
  position (with `--stdin-packs`) or in the raw input (with
  `--stdin-commits`).

  Since we compute Bloom filters in the same order that commits appear
  in the graph, we must see a commit's (first) parent before we process
  the commit itself. This is only guaranteed to happen when sorting
  commits by their generation number.

Signed-off-by: Taylor Blau <me@ttaylorr.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2024-06-25 13:52:06 -07:00
.github
Documentation commit-graph: new Bloom filter version that fixes murmur3 2024-06-25 13:52:06 -07:00
block-sha1
builtin Merge branch 'tb/multi-pack-verbatim-reuse' 2024-01-12 16:09:56 -08:00
ci Merge branch 'js/ci-discard-prove-state' 2023-12-09 16:37:48 -08:00
compat Merge branch 'en/header-cleanup' 2024-01-08 14:05:15 -08:00
contrib Merge branch 'sh/completion-with-reftable' 2024-01-02 13:51:28 -08:00
ewah ewah: implement `bitmap_is_empty()` 2023-12-14 14:38:07 -08:00
git-gui Merge branch 'js/update-urls-in-doc-and-comment' 2023-12-18 14:10:12 -08:00
gitk-git doc: switch links to https 2023-11-26 10:07:05 +09:00
gitweb Merge branch 'js/update-urls-in-doc-and-comment' 2023-12-18 14:10:12 -08:00
mergetools
negotiator treewide: remove unnecessary includes in source files 2023-12-26 12:04:31 -08:00
oss-fuzz repo-settings: introduce commitgraph.changedPathsVersion 2024-06-25 13:52:06 -07:00
perl Merge branch 'js/update-urls-in-doc-and-comment' 2023-12-18 14:10:12 -08:00
po Merge branch 'l10n/zh-TW/2023-11-19' of github.com:l10n-tw/git-po 2023-11-20 07:57:09 +08:00
refs Merge branch 'en/header-cleanup' 2024-01-08 14:05:15 -08:00
reftable Merge branch 'en/header-cleanup' 2024-01-08 14:05:15 -08:00
sha1
sha1collisiondetection@855827c583
sha1dc doc: refer to internet archive 2023-11-26 10:07:06 +09:00
sha256
t commit-graph: reuse existing Bloom filters where possible 2024-06-25 13:52:06 -07:00
templates Merge branch 'jp/use-diff-index-in-pre-commit-sample' 2023-12-20 10:14:52 -08:00
trace2 Merge branch 'en/header-cleanup' 2024-01-08 14:05:15 -08:00
xdiff
.cirrus.yml ci: run unit tests in CI 2023-11-10 08:15:32 +09:00
.clang-format
.editorconfig
.gitattributes
.gitignore replay: introduce new builtin 2023-11-26 10:10:48 +09:00
.gitlab-ci.yml ci: add support for GitLab CI 2023-11-09 18:56:10 +09:00
.gitmodules
.mailmap
.tsan-suppressions
CODE_OF_CONDUCT.md
COPYING
GIT-VERSION-GEN Start the 2.44 cycle 2023-12-09 16:37:51 -08:00
INSTALL Merge branch 'js/update-urls-in-doc-and-comment' 2023-12-18 14:10:12 -08:00
LGPL-2.1
Makefile mem-pool: fix big allocations 2023-12-28 12:22:43 -08:00
README.md doc: switch links to https 2023-11-26 10:07:05 +09:00
RelNotes Start the 2.44 cycle 2023-12-09 16:37:51 -08:00
SECURITY.md
abspath.c
abspath.h
aclocal.m4
add-interactive.c
add-interactive.h
add-patch.c treewide: remove unnecessary includes in source files 2023-12-26 12:04:31 -08:00
advice.c
advice.h
alias.c
alias.h
alloc.c
alloc.h
apply.c treewide: remove unnecessary includes in source files 2023-12-26 12:04:31 -08:00
apply.h
archive-tar.c archive.h: remove unnecessary include 2023-12-26 12:04:31 -08:00
archive-zip.c archive.h: remove unnecessary include 2023-12-26 12:04:31 -08:00
archive.c Merge branch 'en/header-cleanup' 2024-01-08 14:05:15 -08:00
archive.h archive.h: remove unnecessary include 2023-12-26 12:04:31 -08:00
attr.c attr: add builtin objectmode values support 2023-12-28 13:21:52 -08:00
attr.h
banned.h
base85.c
base85.h
bisect.c Merge branch 'en/header-cleanup' 2024-01-08 14:05:15 -08:00
bisect.h
blame.c blame.h: remove unnecessary includes 2023-12-26 12:04:32 -08:00
blame.h blame.h: remove unnecessary includes 2023-12-26 12:04:32 -08:00
blob.c treewide: remove unnecessary includes in source files 2023-12-26 12:04:31 -08:00
blob.h
bloom.c commit-graph: reuse existing Bloom filters where possible 2024-06-25 13:52:06 -07:00
bloom.h commit-graph: reuse existing Bloom filters where possible 2024-06-25 13:52:06 -07:00
branch.c Merge branch 'rj/status-bisect-while-rebase' 2024-01-02 13:51:29 -08:00
branch.h
builtin.h replay: introduce new builtin 2023-11-26 10:10:48 +09:00
bulk-checkin.c treewide: remove unnecessary includes in source files 2023-12-26 12:04:31 -08:00
bulk-checkin.h
bundle-uri.c treewide: remove unnecessary includes in source files 2023-12-26 12:04:31 -08:00
bundle-uri.h
bundle.c
bundle.h
cache-tree.c treewide: remove unnecessary includes in source files 2023-12-26 12:04:31 -08:00
cache-tree.h
cbtree.c
cbtree.h
chdir-notify.c
chdir-notify.h
check-builtins.sh
checkout.c
checkout.h
chunk-format.c
chunk-format.h
color.c
color.h
column.c
column.h
combine-diff.c treewide: remove unnecessary includes in source files 2023-12-26 12:04:31 -08:00
command-list.txt replay: introduce new builtin 2023-11-26 10:10:48 +09:00
commit-graph.c commit-graph: reuse existing Bloom filters where possible 2024-06-25 13:52:06 -07:00
commit-graph.h Merge branch 'ps/do-not-trust-commit-graph-blindly-for-existence' 2023-11-08 11:03:59 +09:00
commit-reach.c treewide: remove unnecessary includes in source files 2023-12-26 12:04:31 -08:00
commit-reach.h
commit-slab-decl.h
commit-slab-impl.h
commit-slab.h
commit.c Merge branch 'en/header-cleanup' 2024-01-08 14:05:15 -08:00
commit.h
common-main.c
config.c Merge branch 'en/header-cleanup' 2024-01-08 14:05:15 -08:00
config.h
config.mak.dev
config.mak.in
config.mak.uname
configure.ac global: convert trivial usages of `test <expr> -a/-o <expr>` 2023-11-11 09:21:00 +09:00
connect.c
connect.h
connected.c
connected.h
convert.c
convert.h config: use git_config_string() for core.checkRoundTripEncoding 2023-12-09 08:26:22 +09:00
copy.c
copy.h
credential.c
credential.h
csum-file.c
csum-file.h
ctype.c
daemon.c
date.c
date.h
decorate.c
decorate.h
delta-islands.c treewide: remove unnecessary includes in source files 2023-12-26 12:04:31 -08:00
delta-islands.h
delta.h
detect-compiler
diagnose.c
diagnose.h
diff-delta.c
diff-lib.c Merge branch 'en/header-cleanup' 2024-01-08 14:05:15 -08:00
diff-merges.c
diff-merges.h
diff-no-index.c treewide: remove unnecessary includes in source files 2023-12-26 12:04:31 -08:00
diff.c Merge branch 'en/header-cleanup' 2024-01-08 14:05:15 -08:00
diff.h
diffcore-break.c treewide: remove unnecessary includes in source files 2023-12-26 12:04:31 -08:00
diffcore-delta.c treewide: remove unnecessary includes in source files 2023-12-26 12:04:31 -08:00
diffcore-order.c
diffcore-pickaxe.c
diffcore-rename.c
diffcore-rotate.c
diffcore.h
dir-iterator.c
dir-iterator.h
dir.c Merge branch 'en/header-cleanup' 2024-01-08 14:05:15 -08:00
dir.h
editor.c
editor.h
entry.c treewide: remove unnecessary includes in source files 2023-12-26 12:04:31 -08:00
entry.h
environment.c config: use git_config_string() for core.checkRoundTripEncoding 2023-12-09 08:26:22 +09:00
environment.h
exec-cmd.c treewide: remove unnecessary includes in source files 2023-12-26 12:04:31 -08:00
exec-cmd.h
fetch-negotiator.c
fetch-negotiator.h
fetch-pack.c Merge branch 'en/header-cleanup' 2024-01-08 14:05:15 -08:00
fetch-pack.h treewide: remove unnecessary includes from header files 2023-12-26 12:04:31 -08:00
fmt-merge-msg.c
fmt-merge-msg.h
fsck.c Merge branch 'en/header-cleanup' 2024-01-08 14:05:15 -08:00
fsck.h
fsmonitor--daemon.h fsmonitor--daemon.h: remove unnecessary includes 2023-12-26 12:04:32 -08:00
fsmonitor-ipc.c treewide: remove unnecessary includes in source files 2023-12-26 12:04:33 -08:00
fsmonitor-ipc.h
fsmonitor-ll.h
fsmonitor-path-utils.h
fsmonitor-settings.c
fsmonitor-settings.h
fsmonitor.c
fsmonitor.h
generate-cmdlist.sh
generate-configlist.sh
generate-hooklist.sh
gettext.c treewide: remove unnecessary includes in source files 2023-12-26 12:04:31 -08:00
gettext.h
git-archimport.perl perl: bump the required Perl version to 5.8.1 from 5.8.0 2023-11-17 07:26:32 +09:00
git-compat-util.h Merge branch 'tb/multi-pack-verbatim-reuse' 2024-01-12 16:09:56 -08:00
git-curl-compat.h
git-cvsexportcommit.perl perl: bump the required Perl version to 5.8.1 from 5.8.0 2023-11-17 07:26:32 +09:00
git-cvsimport.perl Merge branch 'js/update-urls-in-doc-and-comment' 2023-12-18 14:10:12 -08:00
git-cvsserver.perl perl: bump the required Perl version to 5.8.1 from 5.8.0 2023-11-17 07:26:32 +09:00
git-difftool--helper.sh
git-filter-branch.sh
git-instaweb.sh doc: switch links to https 2023-11-26 10:07:05 +09:00
git-merge-octopus.sh
git-merge-one-file.sh
git-merge-resolve.sh
git-mergetool--lib.sh
git-mergetool.sh
git-p4.py
git-quiltimport.sh
git-request-pull.sh
git-send-email.perl Merge branch 'tz/send-email-negatable-options' 2023-12-09 16:37:51 -08:00
git-sh-i18n.sh
git-sh-setup.sh
git-submodule.sh
git-svn.perl Merge branch 'tz/send-email-negatable-options' 2023-12-09 16:37:51 -08:00
git-web--browse.sh
git-zlib.c
git-zlib.h
git.c replay: introduce new builtin 2023-11-26 10:10:48 +09:00
git.rc
gpg-interface.c Merge branch 'en/header-cleanup' 2024-01-08 14:05:15 -08:00
gpg-interface.h
graph.c
graph.h doc: switch links to https 2023-11-26 10:07:05 +09:00
grep.c treewide: remove unnecessary includes in source files 2023-12-26 12:04:31 -08:00
grep.h
hash-ll.h
hash-lookup.c
hash-lookup.h
hash.h
hashmap.c
hashmap.h
help.c help: handle NULL value for alias.* config 2023-12-09 08:24:47 +09:00
help.h
hex-ll.c
hex-ll.h
hex.c
hex.h
hook.c
hook.h
http-backend.c
http-fetch.c http.h: remove unnecessary include 2023-12-26 12:04:32 -08:00
http-push.c http.h: remove unnecessary include 2023-12-26 12:04:32 -08:00
http-walker.c treewide: remove unnecessary includes in source files 2023-12-26 12:04:31 -08:00
http.c Merge branch 'en/header-cleanup' 2024-01-08 14:05:15 -08:00
http.h http.h: remove unnecessary include 2023-12-26 12:04:32 -08:00
ident.c
ident.h
imap-send.c Merge branch 'en/header-cleanup' 2024-01-08 14:05:15 -08:00
iterator.h
json-writer.c
json-writer.h doc: switch links to https 2023-11-26 10:07:05 +09:00
khash.h
kwset.c doc: switch links to https 2023-11-26 10:07:05 +09:00
kwset.h doc: switch links to https 2023-11-26 10:07:05 +09:00
levenshtein.c
levenshtein.h
line-log.c treewide: remove unnecessary includes in source files 2023-12-26 12:04:33 -08:00
line-log.h line-log.h: remove unnecessary include 2023-12-26 12:04:32 -08:00
line-range.c treewide: remove unnecessary includes in source files 2023-12-26 12:04:31 -08:00
line-range.h
linear-assignment.c
linear-assignment.h
list-objects-filter-options.c treewide: remove unnecessary includes in source files 2023-12-26 12:04:31 -08:00
list-objects-filter-options.h
list-objects-filter.c treewide: remove unnecessary includes in source files 2023-12-26 12:04:31 -08:00
list-objects-filter.h
list-objects.c Merge branch 'tb/rev-list-unpacked-fix' 2023-11-08 15:04:42 +09:00
list-objects.h
list.h doc: switch links to https 2023-11-26 10:07:05 +09:00
lockfile.c
lockfile.h
log-tree.c line-log.h: remove unnecessary include 2023-12-26 12:04:32 -08:00
log-tree.h
ls-refs.c treewide: remove unnecessary includes in source files 2023-12-26 12:04:31 -08:00
ls-refs.h
mailinfo.c Merge branch 'jk/mailinfo-iterative-unquote-comment' 2023-12-27 14:52:26 -08:00
mailinfo.h
mailmap.c
mailmap.h
match-trees.c
match-trees.h
mem-pool.c mem-pool: simplify alignment calculation 2023-12-28 12:22:58 -08:00
mem-pool.h
merge-blobs.c treewide: remove unnecessary includes in source files 2023-12-26 12:04:31 -08:00
merge-blobs.h
merge-ll.c config: use config_error_nonbool() instead of custom messages 2023-12-09 08:26:22 +09:00
merge-ll.h
merge-ort-wrappers.c
merge-ort-wrappers.h
merge-ort.c treewide: remove unnecessary includes in source files 2023-12-26 12:04:33 -08:00
merge-ort.h
merge-recursive.c treewide: remove unnecessary includes in source files 2023-12-26 12:04:31 -08:00
merge-recursive.h
merge.c treewide: remove unnecessary includes in source files 2023-12-26 12:04:31 -08:00
merge.h
mergesort.h
midx.c midx: implement `midx_preferred_pack()` 2023-12-14 14:38:08 -08:00
midx.h Merge branch 'tb/multi-pack-verbatim-reuse' 2024-01-12 16:09:56 -08:00
name-hash.c
name-hash.h
neue attr: add builtin objectmode values support 2023-12-28 13:21:52 -08:00
notes-cache.c
notes-cache.h
notes-merge.c
notes-merge.h
notes-utils.c Merge branch 'en/header-cleanup' 2024-01-08 14:05:15 -08:00
notes-utils.h
notes.c treewide: remove unnecessary includes in source files 2023-12-26 12:04:31 -08:00
notes.h
object-file.c treewide: remove unnecessary includes in source files 2023-12-26 12:04:31 -08:00
object-file.h
object-name.c treewide: remove unnecessary includes in source files 2023-12-26 12:04:31 -08:00
object-name.h
object-store-ll.h
object-store.h
object.c
object.h commit-graph: reuse existing Bloom filters where possible 2024-06-25 13:52:06 -07:00
oid-array.c
oid-array.h
oidmap.c
oidmap.h
oidset.c
oidset.h
oidtree.c
oidtree.h
pack-bitmap-write.c Merge branch 'tb/multi-pack-verbatim-reuse' 2024-01-12 16:09:56 -08:00
pack-bitmap.c pack-bitmap: enable reuse from all bitmapped packs 2023-12-14 14:38:09 -08:00
pack-bitmap.h pack-bitmap: enable reuse from all bitmapped packs 2023-12-14 14:38:09 -08:00
pack-check.c treewide: remove unnecessary includes in source files 2023-12-26 12:04:31 -08:00
pack-mtimes.c
pack-mtimes.h
pack-objects.c pack-objects: free packing_data in more places 2023-12-14 14:38:07 -08:00
pack-objects.h pack-objects: free packing_data in more places 2023-12-14 14:38:07 -08:00
pack-revindex.c pack-revindex: implement `midx_pair_to_pack_pos()` 2023-12-14 14:38:08 -08:00
pack-revindex.h pack-revindex: implement `midx_pair_to_pack_pos()` 2023-12-14 14:38:08 -08:00
pack-write.c treewide: remove unnecessary includes in source files 2023-12-26 12:04:31 -08:00
pack.h
packfile.c treewide: remove unnecessary includes in source files 2023-12-26 12:04:31 -08:00
packfile.h packfile.c: fix a typo in `each_file_in_pack_dir_fn()`'s declaration 2023-11-20 08:15:50 +09:00
pager.c
pager.h
parallel-checkout.c
parallel-checkout.h
parse-options-cb.c
parse-options.c Merge branch 'en/header-cleanup' 2024-01-08 14:05:15 -08:00
parse-options.h
parse.c
parse.h
patch-delta.c
patch-ids.c treewide: remove unnecessary includes in source files 2023-12-26 12:04:31 -08:00
patch-ids.h
path.c
path.h
pathspec.c
pathspec.h
pkt-line.c Merge branch 'jx/sideband-chomp-newline-fix' 2024-01-12 16:09:56 -08:00
pkt-line.h Merge branch 'jx/sideband-chomp-newline-fix' 2024-01-12 16:09:56 -08:00
preload-index.c
preload-index.h
pretty.c
pretty.h
prio-queue.c
prio-queue.h
progress.c
progress.h
promisor-remote.c
promisor-remote.h
prompt.c
prompt.h
protocol-caps.c treewide: remove unnecessary includes in source files 2023-12-26 12:04:31 -08:00
protocol-caps.h
protocol.c
protocol.h doc: switch links to https 2023-11-26 10:07:05 +09:00
prune-packed.c
prune-packed.h
quote.c
quote.h
range-diff.c
range-diff.h
reachable.c treewide: remove unnecessary includes in source files 2023-12-26 12:04:31 -08:00
reachable.h
read-cache-ll.h
read-cache.c Merge branch 'en/header-cleanup' 2024-01-08 14:05:15 -08:00
read-cache.h
rebase-interactive.c
rebase-interactive.h
rebase.c
rebase.h
ref-filter.c Merge branch 'en/header-cleanup' 2024-01-08 14:05:15 -08:00
ref-filter.h Merge branch 'en/header-cleanup' 2024-01-08 14:05:15 -08:00
reflog-walk.c
reflog-walk.h
reflog.c treewide: remove unnecessary includes in source files 2023-12-26 12:04:31 -08:00
reflog.h
refs.c Merge branch 'ps/pseudo-refs' 2024-01-02 13:51:30 -08:00
refs.h refs.h: HEAD is not that special 2023-12-15 14:08:28 -08:00
refspec.c
refspec.h
remote-curl.c Merge branch 'en/header-cleanup' 2024-01-08 14:05:15 -08:00
remote.c Merge branch 'en/header-cleanup' 2024-01-08 14:05:15 -08:00
remote.h Merge branch 'jc/retire-cas-opt-name-constant' 2024-01-02 13:51:29 -08:00
replace-object.c
replace-object.h
repo-settings.c repo-settings: introduce commitgraph.changedPathsVersion 2024-06-25 13:52:06 -07:00
repository.c
repository.h repo-settings: introduce commitgraph.changedPathsVersion 2024-06-25 13:52:06 -07:00
rerere.c treewide: remove unnecessary includes in source files 2023-12-26 12:04:31 -08:00
rerere.h
reset.c treewide: remove unnecessary includes in source files 2023-12-26 12:04:31 -08:00
reset.h
resolve-undo.c
resolve-undo.h
revision.c revision.c: consult Bloom filters for root commits 2024-06-25 13:52:05 -07:00
revision.h
run-command.c treewide: remove unnecessary includes in source files 2023-12-26 12:04:31 -08:00
run-command.h
sane-ctype.h
scalar.c
send-pack.c treewide: remove unnecessary includes in source files 2023-12-26 12:04:31 -08:00
send-pack.h
sequencer.c Merge branch 'en/header-cleanup' 2024-01-08 14:05:15 -08:00
sequencer.h
serve.c
serve.h
server-info.c
server-info.h
setup.c Merge branch 'en/header-cleanup' 2024-01-08 14:05:15 -08:00
setup.h builtin/clone: create the refdb with the correct object format 2023-12-12 11:16:54 -08:00
sh-i18n--envsubst.c doc: switch links to https 2023-11-26 10:07:05 +09:00
sha1dc_git.c
sha1dc_git.h
shallow.c treewide: remove unnecessary includes in source files 2023-12-26 12:04:31 -08:00
shallow.h
shared.mak
shell.c treewide: remove unnecessary includes in source files 2023-12-26 12:04:31 -08:00
shortlog.h
sideband.c
sideband.h
sigchain.c
sigchain.h
simple-ipc.h
sparse-index.c
sparse-index.h
split-index.c
split-index.h
stable-qsort.c
statinfo.c Merge branch 'jc/fake-lstat' 2023-12-27 14:52:24 -08:00
statinfo.h
strbuf.c
strbuf.h
streaming.c
streaming.h
string-list.c
string-list.h
strmap.c
strmap.h
strvec.c
strvec.h
sub-process.c
sub-process.h
submodule-config.c submodule: handle NULL value when parsing submodule.*.branch 2023-12-09 08:24:47 +09:00
submodule-config.h submodule-config.h: remove unnecessary include 2023-12-26 12:04:32 -08:00
submodule.c treewide: remove unnecessary includes in source files 2023-12-26 12:04:31 -08:00
submodule.h
symlinks.c
symlinks.h
tag.c
tag.h
tar.h
tempfile.c
tempfile.h
thread-utils.c
thread-utils.h
tmp-objdir.c treewide: remove unnecessary includes in source files 2023-12-26 12:04:31 -08:00
tmp-objdir.h
trace.c doc: switch links to https 2023-11-26 10:07:05 +09:00
trace.h
trace2.c Merge branch 'en/header-cleanup' 2024-01-08 14:05:15 -08:00
trace2.h trace2: fix signature of trace2_def_param() macro 2023-11-23 10:30:32 +09:00
trailer.c Merge branch 'la/trailer-cleanups' 2024-01-02 13:51:29 -08:00
trailer.h trailer: use offsets for trailer_start/trailer_end 2023-12-20 11:55:04 -08:00
transport-helper.c treewide: remove unnecessary includes in source files 2023-12-26 12:04:31 -08:00
transport-internal.h
transport.c treewide: remove unnecessary includes in source files 2023-12-26 12:04:31 -08:00
transport.h
tree-diff.c
tree-walk.c
tree-walk.h
tree.c treewide: remove unnecessary includes in source files 2023-12-26 12:04:31 -08:00
tree.h
unicode-width.h
unimplemented.sh
unix-socket.c
unix-socket.h
unix-stream-server.c
unix-stream-server.h
unpack-trees.c
unpack-trees.h
upload-pack.c treewide: remove unnecessary includes in source files 2023-12-26 12:04:31 -08:00
upload-pack.h
url.c
url.h
urlmatch.c
urlmatch.h
usage.c
userdiff.c
userdiff.h
utf8.c doc: switch links to https 2023-11-26 10:07:05 +09:00
utf8.h doc: switch links to https 2023-11-26 10:07:05 +09:00
varint.c
varint.h
version.c
version.h
versioncmp.c
versioncmp.h
walker.c
walker.h
wildmatch.c
wildmatch.h
worktree.c Merge branch 'rj/status-bisect-while-rebase' 2024-01-02 13:51:29 -08:00
worktree.h
wrap-for-bin.sh
wrapper.c treewide: remove unnecessary includes in source files 2023-12-26 12:04:31 -08:00
wrapper.h
write-or-die.c write-or-die: make GIT_FLUSH a Boolean environment variable 2024-01-04 10:32:21 -08:00
write-or-die.h
ws.c
ws.h
wt-status.c Merge branch 'ps/pseudo-refs' 2024-01-02 13:51:30 -08:00
wt-status.h
xdiff-interface.c Merge branch 'en/header-cleanup' 2024-01-08 14:05:15 -08:00
xdiff-interface.h

README.md

Build status

Git - fast, scalable, distributed revision control system

Git is a fast, scalable, distributed revision control system with an unusually rich command set that provides both high-level operations and full access to internals.

Git is an Open Source project covered by the GNU General Public License version 2 (some parts of it are under different licenses, compatible with the GPLv2). It was originally written by Linus Torvalds with help of a group of hackers around the net.

Please read the file INSTALL for installation instructions.

Many Git online resources are accessible from https://git-scm.com/ including full documentation and Git related tools.

See Documentation/gittutorial.txt to get started, then see Documentation/giteveryday.txt for a useful minimum set of commands, and Documentation/git-<commandname>.txt for documentation of each command. If git has been correctly installed, then the tutorial can also be read with man gittutorial or git help tutorial, and the documentation of each command with man git-<commandname> or git help <commandname>.

CVS users may also want to read Documentation/gitcvs-migration.txt (man gitcvs-migration or git help cvs-migration if git is installed).

The user discussion and development of Git take place on the Git mailing list -- everyone is welcome to post bug reports, feature requests, comments and patches to git@vger.kernel.org (read Documentation/SubmittingPatches for instructions on patch submission and Documentation/CodingGuidelines).

Those wishing to help with error message, usage and informational message string translations (localization l10) should see po/README.md (a po file is a Portable Object file that holds the translations).

To subscribe to the list, send an email with just "subscribe git" in the body to majordomo@vger.kernel.org (not the Git list). The mailing list archives are available at https://lore.kernel.org/git/, https://marc.info/?l=git and other archival sites.

Issues which are security relevant should be disclosed privately to the Git Security mailing list git-security@googlegroups.com.

The maintainer frequently sends the "What's cooking" reports that list the current status of various development topics to the mailing list. The discussion following them give a good reference for project status, development direction and remaining tasks.

The name "git" was given by Linus Torvalds when he wrote the very first version. He described the tool as "the stupid content tracker" and the name as (depending on your mood):

  • random three-letter combination that is pronounceable, and not actually used by any common UNIX command. The fact that it is a mispronunciation of "get" may or may not be relevant.
  • stupid. contemptible and despicable. simple. Take your pick from the dictionary of slang.
  • "global information tracker": you're in a good mood, and it actually works for you. Angels sing, and a light suddenly fills the room.
  • "goddamn idiotic truckload of sh*t": when it breaks