Go to file
Qin ShiCheng babe131bd7 pack-objects: reset kept-pack cache for cruft walk
When writing a cruft pack with an expiration, pack-objects first
collects the recent objects and then walks from them to rescue
whatever they reach, expired or not. A pack the caller did not list is
marked kept while collecting, so that its objects are not copied into
the cruft pack, and unmarked before the walk, so that the walk can go
through it.

The walk does not see the unmarking. Whether an object sits in a kept
pack is answered from a cache that is built on first use and only
dropped when asked about a different kind of kept pack. Collecting
builds it while the unlisted pack is still marked, the walk asks the
same kind of question, and so the unlisted pack stays in it: the walk
stops there, and whatever lies beyond it in an expired pack is left
out of the cruft pack, to go when that pack is deleted.

This went unnoticed because of "--honor-pack-keep". repack passes it,
and when there is a ".keep" file it makes the collecting side ask
about on-disk and in-core kept packs together while the walk asks
about in-core ones alone; the cache is rebuilt each time the question
changes, and by accident the walk sees the current marks. Take the
".keep" file away and the objects are lost today. A later commit stops
repack from passing "--honor-pack-keep" at all, so fix this first.

Drop the cache after re-marking. The loop over the object sources
that does so lives in packfile.c, as repo_invalidate_kept_pack_caches(),
next to has_object_kept_pack() which reads the cache. Like it, the
loop assumes every source is a files backend; keeping that assumption
in packfile.c rather than adding it to pack-objects means the two can
move together once packfile management is pushed down into that
backend.

The test builds an unreachable chain whose middle commit sits in a
pack pack-objects is not told about and whose oldest objects have
expired; without the fix the cruft pack holds only the recent tip.

Signed-off-by: Qin ShiCheng <qeesung@live.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2026-10-08 11:47:13 -07:00
.github Merge branch 'js/rust-in-windows-ci' 2026-09-16 09:04:55 -07:00
Documentation The 4th batch 2026-10-06 10:13:32 -07:00
bin-wrappers
…
block-sha1
…
builtin pack-objects: reset kept-pack cache for cruft walk 2026-10-08 11:47:13 -07:00
ci Merge branch 'js/gitlab-ci-windows-rust' 2026-10-06 10:13:31 -07:00
compat Merge branch 'yt/winansi-die-lasterr-fix' 2026-10-05 13:52:28 -07:00
compiler-tricks
…
contrib Merge branch 'yn/worktree-repair-completion' 2026-10-05 13:52:29 -07:00
ewah
…
git-gui
…
gitk-git Merge branch 'master' of https://github.com/j6t/gitk 2026-09-11 09:03:58 -07:00
gitweb
…
mergetools
…
negotiator
…
odb pack-objects: reset kept-pack cache for cruft walk 2026-10-08 11:47:13 -07:00
oss-fuzz oss-fuzz: handle reftable iterator initialization failures 2026-09-17 12:43:47 -07:00
perl
…
po l10n: af: fix review comments 2026-09-27 20:41:50 +08:00
refs Merge branch 'ak/refs-files-root-ref-lock' 2026-10-01 11:26:40 -07:00
reftable Merge branch 'kn/reftable-optimize-reloading' 2026-09-07 09:32:05 -07:00
sha1
…
sha1collisiondetection@855827c583
…
sha1dc
…
sha256
…
src rust: respect CARGO_BUILD_TARGET when locating build output 2026-09-10 06:37:09 -07:00
subprojects
…
t pack-objects: reset kept-pack cache for cruft walk 2026-10-08 11:47:13 -07:00
templates
…
tools Merge branch 'jc/cocci-free-updates' 2026-10-01 11:26:40 -07:00
trace2
…
xdiff
…
.b4-config
…
.b4-cover-template
…
.cirrus.yml
…
.clang-format
…
.editorconfig
…
.gitattributes
…
.gitignore Makefile: precompile "git-compat-util.h" 2026-09-15 09:18:06 -07:00
.gitlab-ci.yml Merge branch 'js/gitlab-ci-windows-rust' 2026-10-06 10:13:31 -07:00
.gitmodules
…
.mailmap mailmap: normalize name for Yoichi NAKAYAMA 2026-09-17 09:43:13 -07:00
.tsan-suppressions
…
CODE_OF_CONDUCT.md
…
COPYING
…
Cargo.toml
…
GIT-BUILD-OPTIONS.in
…
GIT-VERSION-FILE.in
…
GIT-VERSION-GEN Start Git 2.98 cycle 2026-10-01 11:28:16 -07:00
INSTALL
…
LGPL-2.1
…
Makefile Merge branch 'sg/precompile-git-compat-util' 2026-10-03 21:45:54 -07:00
README.md gitk: discourage AI contributions 2026-08-23 11:11:07 +02:00
RelNotes Start Git 2.98 cycle 2026-10-01 11:28:16 -07:00
SECURITY.md
…
abspath.c
…
abspath.h
…
aclocal.m4
…
add-interactive.c
…
add-interactive.h
…
add-patch.c
…
add-patch.h
…
advice.c history: protect branches when squashing a range 2026-09-08 13:51:10 -07:00
advice.h history: protect branches when squashing a range 2026-09-08 13:51:10 -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 odb/streaming: unify function names to create new streams 2026-08-05 09:42:50 -07:00
archive-zip.c Merge branch 'js/pack-objects-delta-size-t' 2026-08-24 13:17:51 -07:00
archive.c
…
archive.h
…
attr.c
…
attr.h
…
banned.h
…
base85.c
…
base85.h
…
bisect.c Merge branch 'js/coverity-unchecked-returns-fix' 2026-08-24 13:17:50 -07:00
bisect.h
…
blame.c
…
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
…
build.rs
…
builtin.h
…
bundle-uri.c
…
bundle-uri.h
…
bundle.c bundle: generate packfiles via the object database 2026-08-21 09:01:55 -07:00
bundle.h bundle: generate packfiles via the object database 2026-08-21 09:01:55 -07:00
cache-tree.c cache-tree: remove dependency on `the_repository` 2026-09-11 08:46:09 -07:00
cache-tree.h cache-tree: remove dependency on `the_repository` 2026-09-11 08:46:09 -07:00
cbtree.c
…
cbtree.h
…
chdir-notify.c chdir-notify.h: Removed unused param 'name' 2026-08-14 15:08:35 -07:00
chdir-notify.h chdir-notify.h: Removed unused param 'name' 2026-08-14 15:08:35 -07:00
checkout.c checkout: improve message for ambiguous remote branch name 2026-08-27 10:29:43 -07:00
checkout.h checkout: improve message for ambiguous remote branch name 2026-08-27 10:29:43 -07:00
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 doc: git: list gitdatamodel(7) as a concept guide 2026-09-05 17:37:49 -07:00
commit-graph.c odb: eagerly initialize alternates 2026-08-17 09:36:10 -07:00
commit-graph.h
…
commit-reach.c Merge branch 'of/commit-reach-repo-awareness' 2026-10-03 21:45:54 -07:00
commit-reach.h Merge branch 'of/commit-reach-repo-awareness' 2026-10-03 21:45:54 -07:00
commit-slab-decl.h
…
commit-slab-impl.h
…
commit-slab.h
…
commit.c
…
commit.h
…
common-exit.c
…
common-init.c repository: move fetch_if_missing into struct repository 2026-08-15 08:37:54 -07:00
common-init.h
…
common-main.c
…
config.c config: add git_config_append_parameter() 2026-09-17 12:37:00 -07:00
config.h config: add git_config_append_parameter() 2026-09-17 12:37:00 -07:00
config.mak.dev
…
config.mak.in
…
config.mak.uname Merge branch 'js/rust-in-windows-ci' 2026-09-16 09:04:55 -07:00
configure.ac core: convert build-time USE_NSEC into runtime core.useNanosec 2026-09-11 11:10:01 -07:00
connect.c Merge branch 'ps/cat-file-remote-object-info' 2026-07-30 10:32:04 -07:00
connect.h
…
connected.c
…
connected.h
…
convert.c
…
convert.h
…
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
…
delta-islands.h
…
delta.h delta: widen `create_delta()` and `diff_delta()` to `size_t` 2026-08-13 09:42:02 -07:00
diagnose.c
…
diagnose.h
…
diff-delta.c delta: widen `create_delta()` and `diff_delta()` to `size_t` 2026-08-13 09:42:02 -07:00
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 --no-index: fix -R with file/directory conflicts 2026-09-21 10:59:36 -07:00
diff.c Merge branch 'en/diff-l-opt-help' 2026-08-24 13:17:51 -07:00
diff.h
…
diffcore-break.c
…
diffcore-delta.c
…
diffcore-order.c
…
diffcore-pickaxe.c
…
diffcore-rename.c
…
diffcore-rotate.c
…
diffcore.h
…
dir-iterator.c
…
dir-iterator.h
…
dir.c Merge branch 'rs/dir-skip-nested-repo-fix' 2026-10-05 13:52:29 -07:00
dir.h
…
editor.c
…
editor.h
…
entry.c Merge branch 'ty/migrate-trust-executable-bit' 2026-07-30 10:32:02 -07:00
entry.h
…
environment.c core: convert build-time USE_NSEC into runtime core.useNanosec 2026-09-11 11:10:01 -07:00
environment.h Merge branch 'dk/use-nsec-runtime' 2026-10-01 11:26:41 -07:00
exec-cmd.c
…
exec-cmd.h
…
fetch-negotiator.c
…
fetch-negotiator.h
…
fetch-object-info.c fetch-object-info: parse type from server response 2026-08-07 18:50:08 -07:00
fetch-object-info.h fetch-object-info: parse type from server response 2026-08-07 18:50:08 -07:00
fetch-pack.c Merge branch 'of/commit-reach-repo-awareness' 2026-10-03 21:45:54 -07:00
fetch-pack.h
…
fmt-merge-msg.c
…
fmt-merge-msg.h
…
for-each-ref.h
…
fsck.c
…
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
…
fsmonitor.h
…
gettext.c
…
gettext.h
…
git-archimport.perl
…
git-compat-util.h
…
git-curl-compat.h http: handle curl stripping creds from effective url 2026-09-28 10:49:29 -07:00
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 send-email: clarify missing subject error 2026-08-10 14:07:02 -07:00
git-sh-i18n.sh
…
git-sh-setup.sh
…
git-submodule.sh builtin/submodule: rename "--ref-format=" to "--ref-storage-format=" 2026-09-09 11:04:30 -07:00
git-svn.perl
…
git-web--browse.sh
…
git-zlib.c git-zlib: widen `git_deflate_bound()` to `size_t` 2026-08-13 09:42:03 -07:00
git-zlib.h git-zlib: widen `git_deflate_bound()` to `size_t` 2026-08-13 09:42:03 -07:00
git.c Merge branch 'ty/repository-fetch-if-missing' 2026-09-02 09:21:59 -07:00
git.rc.in
…
gpg-interface.c gpg-interface: make signature-prefix matching length-aware 2026-09-17 12:43:46 -07:00
gpg-interface.h
…
graph.c
…
graph.h
…
grep.c
…
grep.h
…
hash-lookup.c
…
hash-lookup.h
…
hash.c
…
hash.h
…
hashmap.c
…
hashmap.h
…
help.c help: rename "default-ref-format" to "default-ref-storage-format" 2026-09-09 11:04:31 -07:00
help.h
…
hex-ll.c
…
hex-ll.h
…
hex.c
…
hex.h
…
hook.c
…
hook.h
…
http-backend.c
…
http-fetch.c
…
http-push.c Merge branch 'js/pack-objects-delta-size-t' 2026-08-24 13:17:51 -07:00
http-walker.c
…
http.c http: handle curl stripping creds from effective url 2026-09-28 10:49:29 -07:00
http.h
…
ident.c
…
ident.h
…
imap-send.c Merge branch 'wf/imap-send-draft' 2026-09-14 14:02:52 -07:00
iterator.h
…
json-writer.c
…
json-writer.h
…
khash.h
…
kwset.c
…
kwset.h
…
levenshtein.c
…
levenshtein.h
…
line-log.c
…
line-log.h
…
line-range.c
…
line-range.h
…
linear-assignment.c
…
linear-assignment.h
…
list-objects-filter-options.c
…
list-objects-filter-options.h
…
list-objects-filter.c list-objects-filter: add list_objects_filter__filter_oidset() 2026-08-13 13:34:49 -07:00
list-objects-filter.h list-objects-filter: add list_objects_filter__filter_oidset() 2026-08-13 13:34:49 -07:00
list-objects.c
…
list-objects.h
…
list.h
…
lockfile.c
…
lockfile.h
…
log-tree.c
…
log-tree.h
…
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
…
mailmap.h
…
match-trees.c
…
match-trees.h
…
mem-pool.c
…
mem-pool.h
…
merge-blobs.c
…
merge-blobs.h
…
merge-ll.c Merge branch 'jk/merge-ll-tempfile-cleanup' 2026-10-06 10:13:31 -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-ort.h
…
merge.c
…
merge.h
…
mergesort.h
…
meson.build Merge branch 'js/mingw-build-updates' 2026-09-11 09:45:10 -07:00
meson_options.txt Merge branch 'dk/use-nsec-runtime' 2026-10-01 11:26:41 -07:00
midx-write.c repository: move fetch_if_missing into struct repository 2026-08-15 08:37:54 -07:00
midx.c midx: validate incremental MIDX pack IDs 2026-09-17 12:43:46 -07:00
midx.h packfile: recover when a multi-pack-index names a removed pack 2026-08-30 13:37:42 -07:00
name-hash.c
…
name-hash.h
…
notes-cache.c
…
notes-cache.h
…
notes-merge.c
…
notes-merge.h
…
notes-utils.c
…
notes-utils.h
…
notes.c
…
notes.h
…
object-file-convert.c
…
object-file-convert.h
…
object-file.c object-file: flush transaction packfile before migrating objects 2026-09-23 20:02:43 -07:00
object-file.h odb/streaming: rename `struct odb_read_stream` 2026-08-05 09:42:50 -07:00
object-name.c Merge branch 'ps/odb-eagerly-load-alternates' 2026-08-31 08:24:59 -07:00
object-name.h
…
object.c odb/streaming: unify function names to create new streams 2026-08-05 09:42:50 -07:00
object.h history: create squashed commits without editing 2026-09-08 13:51:10 -07:00
odb.c Merge branch 'ps/odb-alternates-at-creation' 2026-10-01 11:26:39 -07:00
odb.h Merge branch 'ps/odb-alternates-at-creation' 2026-10-01 11:26:39 -07:00
oid-array.c
…
oid-array.h
…
oidmap.c
…
oidmap.h
…
oidset.c
…
oidset.h
…
oidtree.c
…
oidtree.h
…
pack-bitmap-write.c
…
pack-bitmap.c builtin/fsck: move bitmap verification into the packed source 2026-09-11 09:14:44 -07:00
pack-bitmap.h builtin/fsck: move bitmap verification into the packed source 2026-09-11 09:14:44 -07:00
pack-check.c Merge branch 'js/pack-objects-delta-size-t' 2026-08-24 13:17:51 -07:00
pack-mtimes.c
…
pack-mtimes.h
…
pack-objects.c
…
pack-objects.h
…
pack-refs.c
…
pack-refs.h
…
pack-revindex.c
…
pack-revindex.h
…
pack-write.c builtin/receive-pack: properly clean up keep files 2026-08-20 20:28:01 -07:00
pack.h builtin/receive-pack: properly clean up keep files 2026-08-20 20:28:01 -07:00
packfile-list.c packfile: fix perf regression with many packs 2026-08-13 09:45:46 -07:00
packfile-list.h packfile: fix perf regression with many packs 2026-08-13 09:45:46 -07:00
packfile.c pack-objects: reset kept-pack cache for cruft walk 2026-10-08 11:47:13 -07:00
packfile.h pack-objects: reset kept-pack cache for cruft walk 2026-10-08 11:47:13 -07:00
pager.c
…
pager.h
…
parallel-checkout.c
…
parallel-checkout.h
…
parse-options-cb.c
…
parse-options.c parse-options: allow for hidden aliases 2026-09-09 11:04:30 -07:00
parse-options.h parse-options: allow for hidden aliases 2026-09-09 11:04:30 -07:00
parse.c pack-objects: widen delta-cache accounting to `size_t` 2026-08-13 09:42:02 -07:00
parse.h pack-objects: widen delta-cache accounting to `size_t` 2026-08-13 09:42:02 -07:00
patch-delta.c
…
patch-ids.c
…
patch-ids.h
…
path-walk.c
…
path-walk.h
…
path.c
…
path.h
…
pathspec.c Merge branch 'jc/pathspec-match-const' 2026-09-13 21:53:29 -07:00
pathspec.h pathspec: match and original in pathspec_item are const 2026-09-03 11:24:01 -07:00
pkt-line.c
…
pkt-line.h
…
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 protocol-caps: add type support to object-info 2026-08-07 18:50:08 -07:00
protocol-caps.h
…
protocol.c
…
protocol.h
…
prune-packed.c
…
prune-packed.h
…
pseudo-merge.c
…
pseudo-merge.h
…
quote.c
…
quote.h
…
range-diff.c
…
range-diff.h
…
reachable.c
…
reachable.h
…
read-cache-ll.h cache-tree: remove dependency on `the_repository` 2026-09-11 08:46:09 -07:00
read-cache.c Merge branch 'dk/use-nsec-runtime' 2026-10-01 11:26:41 -07:00
read-cache.h
…
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
…
reflog.h reflog: fix default expiry periods 2026-09-24 11:22:13 -07:00
refs.c refs: expose function to parse reference URIs 2026-09-09 11:04:31 -07:00
refs.h refs: expose function to parse reference URIs 2026-09-09 11:04:31 -07:00
refspec.c
…
refspec.h
…
remote-curl.c
…
remote.c Merge branch 'as/push-force-if-includes-no-reflog' 2026-10-06 10:13:31 -07:00
remote.h
…
repack-cruft.c
…
repack-filtered.c builtin/repack: enumerate promisor blobs for --drop-filtered 2026-08-13 13:34:49 -07:00
repack-geometry.c
…
repack-midx.c Merge branch 'rs/tempfile-wo-the-repository' 2026-07-30 10:32:02 -07:00
repack-promisor.c repack-promisor: allow excluding objects from the rebuilt promisor pack 2026-08-13 13:34:49 -07:00
repack.c
…
repack.h builtin/repack: enumerate promisor blobs for --drop-filtered 2026-08-13 13:34:49 -07:00
replace-object.c
…
replace-object.h
…
replay.c Merge branch 'en/midx-missing-pack-fallback' 2026-09-10 05:36:17 -07:00
replay.h replay: offer an option to linearize the commit topology 2026-08-31 10:29:06 -07:00
repo-settings.c
…
repo-settings.h
…
repository.c Merge branch 'jk/submodule-error-leak' 2026-09-13 21:53:29 -07:00
repository.h repository: move fetch_if_missing into struct repository 2026-08-15 08:37:54 -07:00
rerere.c rerere: do not record failed conflict resolution data 2026-09-17 12:43:46 -07:00
rerere.h builtin/maintenance: improve heuristic for "rerere gc" 2026-09-04 07:27:14 -07:00
reset.c
…
reset.h
…
resolve-undo.c
…
resolve-undo.h
…
revision.c Merge branch 'jk/parse-revision-opt-fixes' 2026-10-05 13:52:29 -07:00
revision.h revision: hang on to "freed" argv elements 2026-09-01 11:03:56 -07:00
run-command.c
…
run-command.h
…
sane-ctype.h
…
scalar.c
…
send-pack.c send-pack: generate packfiles via the object database 2026-08-21 09:01:54 -07:00
send-pack.h
…
sequencer.c Merge branch 'tb/rerere-lock-grace' 2026-10-05 13:52:28 -07:00
sequencer.h Merge branch 'hn/history-squash' 2026-10-01 11:26:39 -07:00
serve.c Merge branch 'en/serve-promisor-remote-fix' 2026-08-24 13:17:51 -07:00
serve.h
…
server-info.c
…
server-info.h
…
setup.c Merge branch 'ps/ref-storage-format' 2026-10-01 11:26:40 -07:00
setup.h Merge branch 'ps/ref-storage-format' 2026-10-01 11:26:40 -07:00
sh-i18n--envsubst.c
…
sha1dc_git.c
…
sha1dc_git.h
…
shallow.c
…
shallow.h
…
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 cache-tree: drop `the_repository` in `cache_tree_fully_valid()` 2026-09-11 08:46:09 -07:00
sparse-index.h
…
split-index.c
…
split-index.h
…
stable-qsort.c
…
stash.h stash: reserve exit status 1 for conflicts 2026-09-03 11:32:36 -07:00
statinfo.c core: convert build-time USE_NSEC into runtime core.useNanosec 2026-09-11 11:10:01 -07:00
statinfo.h
…
strbuf.c
…
strbuf.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-config: stop registering submodule sources 2026-09-11 08:46:10 -07:00
submodule-config.h submodule-config: remove uses of `the_repository` 2026-09-11 08:46:10 -07:00
submodule.c submodule-config: remove uses of `the_repository` 2026-09-11 08:46:10 -07: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 tmp-objdir: drop unused function to register alternate 2026-09-11 08:46:10 -07:00
tmp-objdir.h tmp-objdir: drop unused function to register alternate 2026-09-11 08:46:10 -07:00
trace.c
…
trace.h
…
trace2.c
…
trace2.h
…
trailer.c trailers: stop recognizing URLs as trailers 2026-08-21 08:53:27 -07:00
trailer.h
…
transport-helper.c Merge branch 'js/coverity-unchecked-returns-fix' 2026-08-24 13:17:50 -07:00
transport-internal.h transport: drop remote object-info fields from transport struct 2026-08-07 18:50:08 -07:00
transport.c Merge branch 'ps/cat-file-remote-object-info-type' 2026-08-23 18:01:42 -07:00
transport.h transport: drop remote object-info fields from transport struct 2026-08-07 18:50:08 -07:00
tree-diff.c
…
tree-walk.c
…
tree-walk.h
…
tree.c
…
tree.h
…
unicode-width.h
…
unimplemented.sh
…
unix-socket.c
…
unix-socket.h
…
unix-stream-server.c
…
unix-stream-server.h
…
unpack-trees.c cache-tree: remove dependency on `the_repository` 2026-09-11 08:46:09 -07:00
unpack-trees.h
…
upload-pack.c Merge branch 'rr/upload-pack-swap-shallow-wanted-ref' 2026-10-03 21:45:55 -07:00
upload-pack.h
…
url.c
…
url.h
…
urlmatch.c
…
urlmatch.h
…
usage.c Merge branch 'jc/you-still-use-that' 2026-09-07 09:32:05 -07:00
userdiff.c
…
userdiff.h
…
utf8.c
…
utf8.h
…
varint.c
…
varint.h
…
version-def.h.in
…
version.c
…
version.h
…
versioncmp.c versioncmp: fix typo in versioncmp.c, t/t0022-crlf-rename.sh 2026-08-31 13:47:04 -07:00
versioncmp.h
…
walker.c
…
walker.h
…
wildmatch.c
…
wildmatch.h
…
worktree.c worktree repair: detect relative path in .git file correctly 2026-08-28 10:22:04 -07:00
worktree.h
…
wrapper.c wrapper: guard writev_in_full() against signed overflow 2026-09-17 12:43:46 -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.h Revert "Merge branch 'en/no-amend-during-conflicts'" 2026-09-23 11:18:51 -07:00
xdiff-interface.c
…
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