Go to file
Patrick Steinhardt 36d1867f0d fetch-pack: allow parallelizing packfile URI fetches
When cloning from a server that supports packfile URIs we may see
multiple URIs being announced by the server. If so, the expectation is
that the client will download all of those packfiles. This is being done
sequentially, where we fetch one packfile after the other.

In many cases this should be fine, but there are scenarios where it's
not. When packfiles are for example hosted by object storage (think AWS
S3 or GCS) then the way to achieve high performance is typically to
parallelize downloading the data as a single connection is often capped
at a certain bandwidth. Furthermore, when the server announces a bunch
of smaller packfiles, then the overhead of establishing the connection
may eventually add up.

Despite the limitations caused by the network bandwidth and latency, Git
also runs git-index-pack(1) on all of the fetched packfiles. This is
another task that can be easily parallelized for another speedup.

All of these limitations can be addressed by parallelizing the fetch.
Introduce a new configuration option that allows the user to ask for
this: by default we continue to not parallelize the fetch to retain the
status quo. But when configured to 0 (where we auto-detect the number of
cores) or a value larger than 1 we perform the fetches concurrently.

With this infrastructure in place we can significantly speed up such
fetches. Using a local HTTP server demonstrates the speedup when using a
throttled connection of 2MB/s and downloading 8x1MB packfiles:

    Benchmark 1: 2MB/s, 8x1MB packfiles, 1 threads
      Time (mean ± σ):      4.321 s ±  0.003 s    [User: 0.195 s, System: 0.113 s]
      Range (min … max):    4.318 s …  4.325 s    5 runs

    Benchmark 2: 2MB/s, 8x1MB packfiles, 2 threads
      Time (mean ± σ):      2.284 s ±  0.241 s    [User: 0.191 s, System: 0.114 s]
      Range (min … max):    2.173 s …  2.714 s    5 runs

    Benchmark 3: 2MB/s, 8x1MB packfiles, 4 threads
      Time (mean ± σ):      1.212 s ±  0.238 s    [User: 0.192 s, System: 0.105 s]
      Range (min … max):    1.102 s …  1.638 s    5 runs

    Benchmark 4: 2MB/s, 8x1MB packfiles, 8 threads
      Time (mean ± σ):     569.9 ms ±   2.5 ms    [User: 183.4 ms, System: 116.0 ms]
      Range (min … max):   566.5 ms … 573.4 ms    5 runs

    Summary
      2MB/s, 8x1MB packfiles, 8 threads ran
        2.13 ± 0.42 times faster than 2MB/s, 8x1MB packfiles, 4 threads
        4.01 ± 0.42 times faster than 2MB/s, 8x1MB packfiles, 2 threads
        7.58 ± 0.03 times faster than 2MB/s, 8x1MB packfiles, 1 threads

Quite unsurprisingly, we scale almost linearly with the number of
threads in this case as we're limited by the bandwidth of a single
connection. But we can also demonstrate a speedup on an unthrottled
connection when downloading slightly larger packfiles:

    Benchmark 1: unthrottled, 8x16MB packfiles, 1 threads
      Time (mean ± σ):      2.434 s ±  0.031 s    [User: 2.067 s, System: 0.329 s]
      Range (min … max):    2.381 s …  2.460 s    5 runs

    Benchmark 2: unthrottled, 8x16MB packfiles, 2 threads
      Time (mean ± σ):      1.353 s ±  0.129 s    [User: 2.025 s, System: 0.328 s]
      Range (min … max):    1.288 s …  1.583 s    5 runs

    Benchmark 3: unthrottled, 8x16MB packfiles, 4 threads
      Time (mean ± σ):     702.9 ms ±  23.9 ms    [User: 1732.5 ms, System: 313.9 ms]
      Range (min … max):   660.7 ms … 718.5 ms    5 runs

    Benchmark 4: unthrottled, 8x16MB packfiles, 8 threads
      Time (mean ± σ):     455.1 ms ±   7.7 ms    [User: 1730.0 ms, System: 372.3 ms]
      Range (min … max):   442.8 ms … 462.8 ms    5 runs

    Summary
      unthrottled, 8x16MB packfiles, 8 threads ran
        1.54 ± 0.06 times faster than unthrottled, 8x16MB packfiles, 4 threads
        2.97 ± 0.29 times faster than unthrottled, 8x16MB packfiles, 2 threads
        5.35 ± 0.11 times faster than unthrottled, 8x16MB packfiles, 1 threads

In this case, the speedup is caused by us running git-index-pack(1) in
parallel. The improvement isn't linear, but still quite significant.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2026-08-21 10:20:19 -07:00
.github Merge branch 'jk/ci-static-analysis-image-bump' 2026-08-05 11:10:51 -07:00
Documentation fetch-pack: allow parallelizing packfile URI fetches 2026-08-21 10:20:19 -07:00
bin-wrappers
block-sha1
builtin Merge branch 'hn/branch-delete-merged' 2026-08-20 07:30:51 -07:00
ci Merge branch 'ps/reftable-hardening' 2026-07-19 10:42:15 -07:00
compat Merge branch 'ps/writev' 2026-08-18 09:31:36 -07:00
compiler-tricks
contrib Merge branch 'ps/writev' 2026-08-18 09:31:36 -07:00
ewah
git-gui Merge branch 'master' of https://github.com/j6t/git-gui 2026-07-16 10:48:52 -07:00
gitk-git Merge branch 'master' of https://github.com/j6t/gitk 2026-07-16 10:47:40 -07:00
gitweb gitweb: shorten index hashes with trailing file modes 2026-07-17 09:12:59 -07:00
mergetools
negotiator prio-queue: rename .nr to .nr_ and add accessor helpers 2026-06-09 11:11:46 -07:00
odb Merge branch 'ps/odb-make-creation-pluggable' 2026-08-20 07:30:52 -07:00
oss-fuzz Merge branch 'ps/reftable-hardening' 2026-07-19 10:42:15 -07:00
perl
po Merge branch 'spanish_pr_bis' of github.com:basuradeluis/gitkbis 2026-07-16 10:53:01 +02:00
refs Merge branch 'rs/tempfile-wo-the-repository' 2026-07-30 10:32:02 -07:00
reftable Merge branch 'js/coverity-fixes-null-safety' 2026-07-19 10:42:20 -07:00
sha1 hash: add platform-specific discard functions 2026-07-02 09:50:47 -07:00
sha1collisiondetection@855827c583
sha1dc
sha256 hash: add platform-specific discard functions 2026-07-02 09:50:47 -07:00
src rust: discard hash context when finished 2026-07-19 16:26:09 -07:00
subprojects
t fetch-pack: allow parallelizing packfile URI fetches 2026-08-21 10:20:19 -07:00
templates
tools hash: convert remaining direct function calls 2026-07-07 21:56:00 -07:00
trace2 hash: use git_hash_init() consistently 2026-07-07 21:56:00 -07:00
xdiff Merge branch 'mm/diff-U-takes-no-negative-values' 2026-05-25 09:40:07 +09:00
.b4-config b4: introduce configuration for the Git project 2026-06-15 10:13:28 -07:00
.b4-cover-template b4: include change-id in cover template 2026-07-10 09:49:47 -07:00
.cirrus.yml
.clang-format
.editorconfig
.gitattributes Merge branch 'kw/gitattributes-typofix' 2026-06-21 16:41:37 -07:00
.gitignore Merge branch 'mm/git-url-parse' 2026-05-21 12:06:48 +09:00
.gitlab-ci.yml Merge branch 'jk/ci-static-analysis-image-bump' 2026-08-05 11:10:51 -07:00
.gitmodules
.mailmap mailmap: map Elijah Newren's current and previous work addresses 2026-08-12 13:16:46 -07:00
.tsan-suppressions transport-helper: fix TSAN race in transfer_debug() 2026-06-09 14:05:42 -07:00
CODE_OF_CONDUCT.md
COPYING
Cargo.toml
GIT-BUILD-OPTIONS.in
GIT-VERSION-FILE.in
GIT-VERSION-GEN Start Git 2.56 cycle 2026-07-06 15:50:25 -07:00
INSTALL
LGPL-2.1
Makefile Merge branch 'ps/writev' 2026-08-18 09:31:36 -07:00
README.md README: add GitLab CI badge to make it more discoverable 2026-07-06 07:21:57 -07:00
RelNotes Start Git 2.56 cycle 2026-07-06 15:50:25 -07:00
SECURITY.md
abspath.c
abspath.h
aclocal.m4
add-interactive.c
add-interactive.h
add-patch.c
add-patch.h
advice.c push: suggest <remote> <branch> for a slash slip 2026-06-27 19:36:43 -07:00
advice.h push: suggest <remote> <branch> for a slash slip 2026-06-27 19:36:43 -07:00
alias.c
alias.h
alloc.c
alloc.h
apply.c Merge branch 'ty/migrate-excludes-file' 2026-07-30 10:32:03 -07:00
apply.h
archive-tar.c
archive-zip.c
archive.c odb: use size_t for object_info.sizep and the size APIs 2026-06-15 07:45:41 -07:00
archive.h
attr.c Merge branch 'ps/setup-drop-global-state' 2026-07-06 15:50:19 -07:00
attr.h
banned.h
base85.c
base85.h
bisect.c bisect: add --reset-when-found to leave when done 2026-08-02 16:34:36 -07:00
bisect.h
blame.c odb: use size_t for object_info.sizep and the size APIs 2026-06-15 07:45:41 -07:00
blame.h
blob.c
blob.h
bloom.c Merge branch 'jk/ci-static-analysis-image-bump' 2026-08-05 11:10:51 -07:00
bloom.h
branch.c Merge branch 'rs/branch-delete-bisect-warning' 2026-08-05 11:10:51 -07:00
branch.h branch: report active bisect run when rejecting delete 2026-07-25 09:22:03 -07:00
build.rs
builtin.h Merge branch 'mm/git-url-parse' 2026-05-21 12:06:48 +09:00
bundle-uri.c Merge branch 'ps/copy-wo-the-repository' 2026-07-27 09:09:00 -07:00
bundle-uri.h
bundle.c use repo_hold_lock_file_for_update{,_mode,_timeout}() with custom repos 2026-07-14 12:54:25 -07:00
bundle.h
cache-tree.c Merge branch 'jt/receive-pack-use-odb-transactions' 2026-07-22 10:30:53 -07:00
cache-tree.h
cbtree.c cbtree: allow using arbitrary wrapper structures for nodes 2026-05-15 04:50:45 +09:00
cbtree.h cbtree: allow using arbitrary wrapper structures for nodes 2026-05-15 04:50:45 +09:00
chdir-notify.c chdir-notify: drop unused `chdir_notify_reparent()` 2026-06-26 08:27:19 -07:00
chdir-notify.h chdir-notify: drop unused `chdir_notify_reparent()` 2026-06-26 08:27:19 -07:00
checkout.c
checkout.h
chunk-format.c
chunk-format.h
color.c
color.h
column.c
column.h
combine-diff.c Merge branch 'ty/migrate-trust-executable-bit' 2026-07-30 10:32:02 -07:00
command-list.txt Merge branch 'mm/git-url-parse' 2026-05-21 12:06:48 +09:00
commit-graph.c Merge branch 'rs/tempfile-wo-the-repository' 2026-07-30 10:32:02 -07:00
commit-graph.h doc: fix typos via codespell 2026-06-08 00:21:35 +09:00
commit-reach.c Merge branch 'td/ref-filter-memoize-contains' 2026-07-27 09:08:59 -07:00
commit-reach.h commit-reach: reject cycles in contains walk 2026-06-12 15:56:44 -07:00
commit-slab-decl.h
commit-slab-impl.h
commit-slab.h
commit.c Merge branch 'kk/prio-queue-get-put-fusion' 2026-07-13 08:27:27 -07:00
commit.h Merge branch 'kk/streaming-walk-pqueue' 2026-06-16 09:01:02 -07:00
common-exit.c
common-init.c setup: split up concerns of `setup_git_env_internal()` 2026-07-07 10:49:40 -07:00
common-init.h
common-main.c
config.c Merge branch 'jt/config-lock-timeout' 2026-07-30 10:32:04 -07:00
config.h Merge branch 'hn/config-typo-advice' 2026-06-15 07:41:59 -07:00
config.mak.dev Merge branch 'ps/clang-w-glibc-2.43-and-_Generic' into maint-2.54 2026-05-21 12:23:51 +09:00
config.mak.in
config.mak.uname compat/posix: introduce writev(3p) wrapper 2026-08-07 08:57:25 -07:00
configure.ac
connect.c Merge branch 'ps/cat-file-remote-object-info' 2026-07-30 10:32:04 -07:00
connect.h connect: make write_fetch_command_and_capabilities() more generic 2026-07-24 08:46:59 -07:00
connected.c connected: search promisor objects generically 2026-06-25 13:20:20 -07:00
connected.h
convert.c hex: add and use strbuf_add_oid_hex() 2026-05-14 15:59:25 +09:00
convert.h
copy.c copy: drop dependency on `the_repository` 2026-07-16 14:10:08 -07:00
copy.h copy: drop dependency on `the_repository` 2026-07-16 14:10:08 -07:00
credential.c
credential.h
csum-file.c Merge branch 'jk/hash-algo-leak-fixes' 2026-07-16 23:05:47 -07:00
csum-file.h Merge branch 'jk/hash-algo-leak-fixes' 2026-07-16 23:05:47 -07:00
ctype.c
daemon.c Merge branch 'st/daemon-sockaddr-fixes' 2026-06-11 04:31:17 -07:00
date.c docs: fix typos 2026-06-05 22:27:24 +09:00
date.h
decorate.c
decorate.h
delta-islands.c docs: fix typos and grammar 2026-05-30 07:07:27 +09:00
delta-islands.h
delta.h packfile,delta: drop the `cast_size_t_to_ulong()` wrappers 2026-06-15 07:45:41 -07:00
diagnose.c
diagnose.h
diff-delta.c
diff-lib.c Merge branch 'jk/diff-relative-cached-unmerged-more' 2026-08-07 14:48:00 -07:00
diff-merges.c
diff-merges.h
diff-no-index.c
diff.c merge-ll: consolidate conflict marker scanning logic 2026-07-31 08:52:15 -07:00
diff.h diff: reject negative values for -U/--unified 2026-05-13 10:13:26 +09:00
diffcore-break.c diffcore-break: guard against NULLed queue entries in merge loop 2026-07-10 08:13:54 -07:00
diffcore-delta.c
diffcore-order.c
diffcore-pickaxe.c docs: fix typos and grammar 2026-05-30 07:07:27 +09:00
diffcore-rename.c
diffcore-rotate.c
diffcore.h
dir-iterator.c
dir-iterator.h
dir.c Merge branch 'ty/migrate-excludes-file' 2026-07-30 10:32:03 -07:00
dir.h ignore: note info/exclude lives in GIT_COMMON_DIR, not GIT_DIR 2026-05-13 10:25:52 +09:00
editor.c environment: move editor_program into repo_config_values 2026-07-14 07:30:23 -07:00
editor.h
entry.c Merge branch 'ty/migrate-trust-executable-bit' 2026-07-30 10:32:02 -07:00
entry.h
environment.c Merge branch 'ty/migrate-excludes-file' 2026-07-30 10:32:03 -07:00
environment.h Merge branch 'ty/migrate-excludes-file' 2026-07-30 10:32:03 -07:00
exec-cmd.c
exec-cmd.h
fetch-negotiator.c
fetch-negotiator.h negotiator: add have_sent() interface 2026-05-20 11:33:24 +09:00
fetch-object-info.c cat-file: make remote-object-info allow-list adapt to the server 2026-07-24 08:49:09 -07:00
fetch-object-info.h cat-file: make remote-object-info allow-list adapt to the server 2026-07-24 08:49:09 -07:00
fetch-pack.c fetch-pack: allow parallelizing packfile URI fetches 2026-08-21 10:20:19 -07:00
fetch-pack.h fetch: add --negotiation-include option for negotiation 2026-05-20 11:33:24 +09:00
fmt-merge-msg.c odb: use size_t for object_info.sizep and the size APIs 2026-06-15 07:45:41 -07:00
fmt-merge-msg.h
for-each-ref.h
fsck.c odb: use size_t for object_info.sizep and the size APIs 2026-06-15 07:45:41 -07:00
fsck.h
fsmonitor--daemon.h
fsmonitor-ipc.c
fsmonitor-ipc.h
fsmonitor-ll.h
fsmonitor-path-utils.h
fsmonitor-settings.c
fsmonitor-settings.h
fsmonitor.c config: use repo_ignore_case() to access core.ignorecase 2026-06-19 10:04:56 -07:00
fsmonitor.h
gettext.c
gettext.h
git-archimport.perl
git-compat-util.h environment: move has_symlinks into repo_config_values 2026-07-20 07:37:05 -07:00
git-curl-compat.h
git-cvsexportcommit.perl
git-cvsimport.perl
git-cvsserver.perl
git-difftool--helper.sh
git-filter-branch.sh
git-instaweb.sh
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
git-sh-i18n.sh
git-sh-setup.sh
git-submodule.sh
git-svn.perl
git-web--browse.sh
git-zlib.c zlib: properly clamp to uLong 2026-06-18 09:46:56 -07:00
git-zlib.h git-zlib: handle data streams larger than 4GB 2026-05-09 11:25:31 +09:00
git.c setup: unify setup of shallow file 2026-07-07 10:49:40 -07:00
git.rc.in
gpg-interface.c gpg-interface: fix strip_cr_before_lf to only remove CR before LF 2026-06-24 09:49:05 -07:00
gpg-interface.h
graph.c graph: add --[no-]graph-indent and log.graphIndent 2026-07-14 07:32:51 -07:00
graph.h graph: add a 2 commit buffer for lookahead 2026-07-14 07:32:51 -07:00
grep.c odb: use size_t for object_info.sizep and the size APIs 2026-06-15 07:45:41 -07:00
grep.h
hash-lookup.c
hash-lookup.h
hash.c hash: check ctx->active flag in all wrapper functions 2026-07-07 21:56:00 -07:00
hash.h hash: make git_hash_discard() idempotent 2026-07-07 21:56:00 -07:00
hashmap.c
hashmap.h
help.c Merge branch 'jh/alias-i18n-fixes' into maint-2.54 2026-05-21 12:30:11 +09:00
help.h
hex-ll.c
hex-ll.h
hex.c hex: add and use strbuf_add_oid_hex() 2026-05-14 15:59:25 +09:00
hex.h hex: add and use strbuf_add_oid_hex() 2026-05-14 15:59:25 +09:00
hook.c
hook.h Merge branch 'ak/typofixes' 2026-06-15 07:42:00 -07:00
http-backend.c setup: stop using `the_repository` in `enter_repo()` 2026-05-19 19:36:24 +09:00
http-fetch.c http: accept HTTP 416 for complete partial packs 2026-07-27 12:57:20 -07:00
http-push.c Merge branch 'tn/packfile-uri-concurrency' 2026-08-15 09:20:27 -07:00
http-walker.c http: accept HTTP 416 for complete partial packs 2026-07-27 12:57:20 -07:00
http.c Merge branch 'tn/packfile-uri-concurrency' 2026-08-15 09:20:27 -07:00
http.h Merge branch 'jk/hash-algo-leak-fixes' 2026-07-16 23:05:47 -07:00
ident.c
ident.h
imap-send.c imap-send: avoid leaking the IMAP upload buffer 2026-07-05 09:12:10 -07:00
iterator.h
json-writer.c
json-writer.h
khash.h
kwset.c
kwset.h
levenshtein.c
levenshtein.h
line-log.c Merge branch 'jk/bloom-leak-fixes' 2026-07-15 13:24:19 -07:00
line-log.h line-log: integrate -L output with the standard log-tree pipeline 2026-05-29 14:06:21 +09:00
line-range.c
line-range.h
linear-assignment.c
linear-assignment.h
list-objects-filter-options.c setup: stop using `the_repository` in `upgrade_repository_format()` 2026-05-19 19:36:25 +09:00
list-objects-filter-options.h
list-objects-filter.c odb: use size_t for object_info.sizep and the size APIs 2026-06-15 07:45:41 -07:00
list-objects-filter.h
list-objects.c
list-objects.h
list.h
lockfile.c lockfile: add repo_hold_lock_file_for_update{,_timeout}{,_mode}() 2026-07-14 12:54:25 -07:00
lockfile.h lockfile: add repo_hold_lock_file_for_update{,_timeout}{,_mode}() 2026-07-14 12:54:25 -07:00
log-tree.c log: improve --follow following renames for non-linear history 2026-06-22 05:45:09 -07:00
log-tree.h log: improve --follow following renames for non-linear history 2026-06-22 05:45:09 -07:00
loose.c Merge branch 'ps/odb-make-creation-pluggable' 2026-08-20 07:30:52 -07:00
loose.h setup: detangle loading of loose object maps 2026-08-06 21:24:25 -07:00
ls-refs.c
ls-refs.h
mailinfo.c
mailinfo.h
mailmap.c Merge branch 'ps/setup-drop-global-state' 2026-07-06 15:50:19 -07:00
mailmap.h
match-trees.c odb: use size_t for object_info.sizep and the size APIs 2026-06-15 07:45:41 -07:00
match-trees.h
mem-pool.c
mem-pool.h
merge-blobs.c odb: use size_t for object_info.sizep and the size APIs 2026-06-15 07:45:41 -07:00
merge-blobs.h odb: use size_t for object_info.sizep and the size APIs 2026-06-15 07:45:41 -07:00
merge-ll.c add: introduce '--resolved' option 2026-07-31 08:52:16 -07:00
merge-ll.h add: introduce '--resolved' option 2026-07-31 08:52:16 -07:00
merge-ort-wrappers.c
merge-ort-wrappers.h
merge-ort.c Merge branch 'en/ort-harden-against-corrupt-trees' 2026-07-06 15:50:20 -07:00
merge-ort.h
merge.c
merge.h
mergesort.h
meson.build Merge branch 'ps/writev' 2026-08-18 09:31:36 -07:00
meson_options.txt Merge branch 'ps/reftable-hardening' 2026-07-19 10:42:15 -07:00
midx-write.c Merge branch 'rs/tempfile-wo-the-repository' 2026-07-30 10:32:02 -07:00
midx.c odb/source: generalize `reprepare()` callback 2026-06-22 10:41:03 -07:00
midx.h midx: refactor interfaces to work on "packed" source 2026-06-17 05:00:01 -07:00
name-hash.c config: use repo_ignore_case() to access core.ignorecase 2026-06-19 10:04:56 -07:00
name-hash.h
notes-cache.c odb: use size_t for object_info.sizep and the size APIs 2026-06-15 07:45:41 -07:00
notes-cache.h
notes-merge.c odb: use size_t for object_info.sizep and the size APIs 2026-06-15 07:45:41 -07:00
notes-merge.h
notes-utils.c
notes-utils.h
notes.c odb: use size_t for object_info.sizep and the size APIs 2026-06-15 07:45:41 -07:00
notes.h
object-file-convert.c
object-file-convert.h
object-file.c Merge branch 'ps/odb-move-loose-object-writing' 2026-07-30 10:32:05 -07:00
object-file.h Merge branch 'jt/receive-pack-use-odb-transactions' 2026-07-22 10:30:53 -07:00
object-name.c Merge branch 'ps/setup-split-discovery-and-setup' 2026-07-19 10:42:15 -07:00
object-name.h
object.c odb: use size_t for object_info.sizep and the size APIs 2026-06-15 07:45:41 -07:00
object.h commit-reach: deduplicate queue entries in paint_down_to_common 2026-05-26 07:17:26 +09:00
odb.c Merge branch 'ps/odb-make-creation-pluggable' 2026-08-20 07:30:52 -07:00
odb.h Merge branch 'ps/odb-make-creation-pluggable' 2026-08-20 07:30:52 -07:00
oid-array.c
oid-array.h
oidmap.c
oidmap.h
oidset.c
oidset.h
oidtree.c oidtree: add ability to store data 2026-05-15 04:50:45 +09:00
oidtree.h oidtree: add ability to store data 2026-05-15 04:50:45 +09:00
pack-bitmap-write.c Merge branch 'kk/prio-queue-get-put-fusion' 2026-07-13 08:27:27 -07:00
pack-bitmap.c Merge branch 'dl/pack-bitmap-position-zero' 2026-08-07 14:48:01 -07:00
pack-bitmap.h odb: introduce object filters to `odb_for_each_object()` 2026-07-15 07:19:16 -07:00
pack-check.c hash: use git_hash_init() consistently 2026-07-07 21:56:00 -07:00
pack-mtimes.c
pack-mtimes.h
pack-objects.c
pack-objects.h pack-objects: use size_t for in-core object sizes 2026-06-15 07:45:41 -07:00
pack-refs.c
pack-refs.h
pack-revindex.c midx: refactor interfaces to work on "packed" source 2026-06-17 05:00:01 -07:00
pack-revindex.h
pack-write.c hash: use git_hash_init() consistently 2026-07-07 21:56:00 -07:00
pack.h
packfile-list.c packfile: split out packfile list logic 2026-06-17 05:00:00 -07:00
packfile-list.h packfile: split out packfile list logic 2026-06-17 05:00:00 -07:00
packfile.c Merge branch 'ps/odb-drop-whence' 2026-07-15 13:24:18 -07:00
packfile.h Merge branch 'ps/odb-source-packed' 2026-07-06 15:50:21 -07:00
pager.c environment: move pager_program into repo_config_values 2026-07-14 07:30:23 -07:00
pager.h
parallel-checkout.c
parallel-checkout.h
parse-options-cb.c
parse-options.c parse-options: exit 0 on -h 2026-07-07 17:48:57 -07:00
parse-options.h parse-options: add a separate case for help output on error 2026-07-07 17:48:56 -07:00
parse.c
parse.h
patch-delta.c packfile,delta: drop the `cast_size_t_to_ulong()` wrappers 2026-06-15 07:45:41 -07:00
patch-ids.c
patch-ids.h patch-ids.h: add missing trailing parenthesis in documentation comment 2026-05-15 04:24:54 +09:00
path-walk.c Merge branch 'kk/prio-queue-get-put-fusion' 2026-07-13 08:27:27 -07:00
path-walk.h path-walk: support `object:type` filter 2026-05-24 18:41:07 +09:00
path.c path: extract format_path() and use in rev-parse 2026-06-23 21:15:52 -07:00
path.h Merge branch 'jk/repo-info-path-keys' 2026-07-06 15:50:23 -07:00
pathspec.c pathspec: use match for sparse-index expansion checks 2026-07-21 10:33:14 -07:00
pathspec.h
pkt-line.c
pkt-line.h
preload-index.c
preload-index.h
pretty.c Merge branch 'rs/strbuf-add-oid-hex' 2026-06-09 10:04:50 +09:00
pretty.h
prio-queue.c prio-queue: fold lazy_queue into prio_queue for automatic get+put fusion 2026-06-09 11:11:46 -07:00
prio-queue.h prio-queue: fold lazy_queue into prio_queue for automatic get+put fusion 2026-06-09 11:11:46 -07:00
progress.c
progress.h
promisor-remote.c Merge branch 'cc/promisor-auto-config-url-more' 2026-07-06 15:50:19 -07:00
promisor-remote.h promisor-remote: document caller filtering contract 2026-05-15 04:24:54 +09:00
prompt.c environment: move askpass_program into repo_config_values 2026-07-14 07:30:23 -07:00
prompt.h
protocol-caps.c protocol-caps: check object existence regardless of the attributes requested 2026-07-24 08:46:59 -07:00
protocol-caps.h
protocol.c
protocol.h
prune-packed.c
prune-packed.h
pseudo-merge.c pack-bitmap: prevent pattern leak on pseudo-merge re-assignment 2026-05-12 10:36:18 +09:00
pseudo-merge.h
quote.c quote: simplify internals of dequoting 2026-05-19 12:14:03 +09:00
quote.h quote: drop sq_dequote_to_argv() 2026-05-19 12:14:03 +09:00
range-diff.c
range-diff.h
reachable.c Merge branch 'ps/refs-wo-the-repository' 2026-07-27 09:08:59 -07:00
reachable.h
read-cache-ll.h read-cache: add remove_file_from_index_with_flags() 2026-07-31 08:52:16 -07:00
read-cache.c Merge branch 'jc/add-resolved' 2026-08-15 09:20:27 -07:00
read-cache.h environment: move has_symlinks into repo_config_values 2026-07-20 07:37:05 -07:00
rebase-interactive.c
rebase-interactive.h
rebase.c
rebase.h
ref-filter.c branch: add --forked filter for --list mode 2026-08-05 10:08:27 -07:00
ref-filter.h branch: add --forked filter for --list mode 2026-08-05 10:08:27 -07:00
reflog-walk.c
reflog-walk.h
reflog.c odb: use size_t for object_info.sizep and the size APIs 2026-06-15 07:45:41 -07:00
reflog.h
refs.c refs: remove remaining uses of `the_repository` 2026-07-16 07:40:22 -07:00
refs.h refs: remove remaining uses of `the_repository` 2026-07-16 07:40:22 -07:00
refspec.c refspec: stop depending on `the_repository` 2026-07-16 13:58:25 -07:00
refspec.h refspec: stop depending on `the_repository` 2026-07-16 13:58:25 -07:00
remote-curl.c remote-curl: simplify passing of push specs 2026-07-15 14:13:47 -07:00
remote.c Merge branch 'en/submodule-insteadof-remote-match' 2026-08-03 09:31:30 -07:00
remote.h remote: find tracking branches for URL push destinations 2026-07-22 11:29:49 -07:00
repack-cruft.c
repack-filtered.c
repack-geometry.c midx: refactor interfaces to work on "packed" source 2026-06-17 05:00:01 -07:00
repack-midx.c Merge branch 'rs/tempfile-wo-the-repository' 2026-07-30 10:32:02 -07:00
repack-promisor.c
repack.c midx: refactor interfaces to work on "packed" source 2026-06-17 05:00:01 -07:00
repack.h repack: introduce `--write-midx=incremental` 2026-05-20 11:31:14 +09:00
replace-object.c
replace-object.h
replay.c Merge branch 'js/coverity-fixes-null-safety' 2026-07-19 10:42:20 -07:00
replay.h Merge branch 'ps/history-drop' 2026-07-15 13:24:19 -07:00
repo-settings.c refs: move parsing of "core.logAllRefUpdates" back into ref stores 2026-06-26 08:27:19 -07:00
repo-settings.h refs: move parsing of "core.logAllRefUpdates" back into ref stores 2026-06-26 08:27:19 -07:00
repository.c Merge branch 'ps/odb-make-creation-pluggable' 2026-08-20 07:30:52 -07:00
repository.h Merge branch 'ty/migrate-excludes-file' 2026-07-30 10:32:03 -07:00
rerere.c Merge branch 'jc/add-resolved' 2026-08-15 09:20:27 -07:00
rerere.h
reset.c reset: stop assuming that the caller passes in a clean index 2026-07-03 10:32:47 -07:00
reset.h reset: allow the caller to specify the current HEAD object 2026-07-03 10:32:47 -07:00
resolve-undo.c
resolve-undo.h
revision.c Merge branch 'mm/revision-pure-get-commit-action' 2026-08-07 14:48:00 -07:00
revision.h graph: add --[no-]graph-indent and log.graphIndent 2026-07-14 07:32:51 -07:00
run-command.c run-command: avoid `close(-1)` in `start_command()` error paths 2026-07-05 09:12:09 -07:00
run-command.h Merge branch 'pt/fsmonitor-linux' 2026-05-31 10:00:38 +09:00
sane-ctype.h
scalar.c setup: stop using `the_repository` in `setup_git_directory()` 2026-05-19 19:36:25 +09:00
send-pack.c Merge branch 'ds/fetch-negotiation-options' 2026-05-27 14:15:45 +09:00
send-pack.h send-pack: pass negotiation config in push 2026-05-20 11:33:24 +09:00
sequencer.c Merge branch 'pw/rebase-fixup-fixes' 2026-08-05 11:10:51 -07:00
sequencer.h Merge branch 'pw/status-rebase-todo' 2026-07-06 15:50:23 -07:00
serve.c serve: advertise object-info feature 2026-07-24 08:46:59 -07:00
serve.h
server-info.c
server-info.h
setup.c Merge branch 'ps/odb-make-creation-pluggable' 2026-08-20 07:30:52 -07:00
setup.h setup: defer object database creation 2026-08-06 21:24:25 -07:00
sh-i18n--envsubst.c
sha1dc_git.c hash algorithms: use size_t for section lengths 2026-06-16 09:02:33 -07:00
sha1dc_git.h hash algorithms: use size_t for section lengths 2026-06-16 09:02:33 -07:00
shallow.c Merge branch 'js/coverity-fixes-null-safety' 2026-07-19 10:42:20 -07:00
shallow.h setup: unify setup of shallow file 2026-07-07 10:49:40 -07:00
shared.mak
shell.c
shortlog.h
sideband.c Merge branch 'ps/writev' 2026-08-18 09:31:36 -07:00
sideband.h
sigchain.c
sigchain.h
simple-ipc.h
sparse-index.c sparse-index: avoid crash on intent-to-add entry outside the cone 2026-07-06 07:49:10 -07:00
sparse-index.h
split-index.c
split-index.h
stable-qsort.c
statinfo.c environment: move "check_stat" into `struct repo_config_values` 2026-06-03 08:36:48 +09:00
statinfo.h
strbuf.c strbuf: avoid redundant reset in strbuf_getwholeline() 2026-07-14 09:35:02 -07:00
strbuf.h strbuf: add strbuf_add_uint() 2026-05-13 00:48:42 +09:00
string-list.c
string-list.h
strmap.c
strmap.h
strvec.c
strvec.h
sub-process.c sub-process: use gentle handshake to avoid die() on startup failure 2026-06-02 07:48:57 +09:00
sub-process.h
submodule-config.c odb: use size_t for object_info.sizep and the size APIs 2026-06-15 07:45:41 -07:00
submodule-config.h
submodule.c Merge branch 'ps/refs-wo-the-repository' 2026-07-27 09:08:59 -07:00
submodule.h
symlinks.c
symlinks.h
tag.c odb: use size_t for object_info.sizep and the size APIs 2026-06-15 07:45:41 -07:00
tag.h
tar.h
tempfile.c tempfile: stop using the_repository 2026-07-14 12:54:25 -07:00
tempfile.h tempfile: stop using the_repository 2026-07-14 12:54:25 -07:00
thread-utils.c
thread-utils.h
tmp-objdir.c
tmp-objdir.h
trace.c setup: move prefix into repository 2026-07-07 10:49:40 -07:00
trace.h
trace2.c
trace2.h
trailer.c trailer: change strbuf in-place in unfold_value() 2026-05-16 22:11:07 +09:00
trailer.h
transport-helper.c Merge branch 'ps/cat-file-remote-object-info' 2026-07-30 10:32:04 -07:00
transport-internal.h transport: add client support for object-info 2026-07-24 08:46:59 -07:00
transport.c Merge branch 'hn/url-push-tracking' 2026-08-03 09:31:29 -07:00
transport.h transport: add client support for object-info 2026-07-24 08:46:59 -07:00
tree-diff.c
tree-walk.c odb: use size_t for object_info.sizep and the size APIs 2026-06-15 07:45:41 -07:00
tree-walk.h docs: fix typos and grammar 2026-05-30 07:07:27 +09:00
tree.c odb: use size_t for object_info.sizep and the size APIs 2026-06-15 07:45:41 -07: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 Merge branch 'ty/migrate-ignorecase' 2026-07-19 10:42:19 -07:00
unpack-trees.h
upload-pack.c Merge branch 'ob/more-repo-config-values' 2026-06-15 07:42:00 -07:00
upload-pack.h
url.c
url.h
urlmatch.c urlmatch: add url_normalize_pattern() helper 2026-05-28 05:20:15 +09:00
urlmatch.h urlmatch: add url_normalize_pattern() helper 2026-05-28 05:20:15 +09:00
usage.c parse-options: exit 0 on -h 2026-07-07 17:48:57 -07:00
userdiff.c userdiff: add support for Swift 2026-07-23 07:14:34 -07:00
userdiff.h
utf8.c
utf8.h
varint.c
varint.h
version-def.h.in
version.c
version.h
versioncmp.c
versioncmp.h
walker.c prio-queue: rename .nr to .nr_ and add accessor helpers 2026-06-09 11:11:46 -07:00
walker.h
wildmatch.c
wildmatch.h
worktree.c worktree: pass repository to public functions 2026-07-16 07:40:22 -07:00
worktree.h worktree: pass repository to public functions 2026-07-16 07:40:22 -07:00
wrapper.c wrapper: properly handle MAX_IO_SIZE in writev(3p) 2026-08-07 08:57:25 -07:00
wrapper.h wrapper: properly handle MAX_IO_SIZE in writev(3p) 2026-08-07 08:57:25 -07:00
write-or-die.c wrapper: introduce writev(3p) wrappers 2026-08-07 08:57:25 -07:00
write-or-die.h wrapper: introduce writev(3p) wrappers 2026-08-07 08:57:25 -07:00
ws.c
ws.h
wt-status.c wt-status: avoid repeated insertion for untracked paths 2026-07-19 16:21:33 -07:00
wt-status.h
xdiff-interface.c odb: use size_t for object_info.sizep and the size APIs 2026-06-15 07:45:41 -07:00
xdiff-interface.h

README.md

GitHub build status GitLab 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.adoc to get started, then see Documentation/giteveryday.adoc for a useful minimum set of commands, and Documentation/git-<commandname>.adoc 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.adoc (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 to git+subscribe@vger.kernel.org (see https://subspace.kernel.org/subscribing.html for details). 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