Go to file
Michael Montalbo 74fcf26527 diff: consult oid-only hunk providers via diff.<driver>.process
The provider chain so far holds the diff-hunks store in front of the
terminal builtin computation.  Open it to external processes: a pair on
a path whose driver configures diff.<driver>.process is answered by a
long-running process speaking a pkt-line protocol (following the filter
process protocol), registered at the head of the chain and consulted
before the store and before any blob is loaded.

The protocol starts with the smallest request that can carry an answer:
object names alone.  A request is the pathname and the pair's
old-oid/new-oid, with no content.  The process answers with hunk lines,
with a zero-hunk success that asserts the blobs equivalent (trailing
newlines included), or with status=need-content, on which the pair
falls through to the builtin answer.  This serves the two shapes that
need no content pushed to them: a cache keyed on the blob pair, and a
process that fetches the blobs itself (for example over "git cat-file
--batch").  A pair whose side is not a stored blob carries a NULL id;
the provider sends no request and passes it.  Because Git holds no
content for the exchange, the answer is used as sent: hunks are
validated for order, overlap, lockstep alignment, and magnitude, then
replayed without the normalization xdiff applies to diffs it computes
itself.  The magnitude bound is the blobs' sizes, read from the object
database without loading content: a blob of N bytes holds at most N
lines.

Because the process's answer is authoritative, it outranks the store,
and its head-of-chain position says so.  A pair the process answers
never reaches the store and is never recorded, so nothing it produces
enters the store, which holds the builtin answer only.  A request it
does not answer, whether need-content, a missing capability, or a
missing id, passes down the chain to the builtin answer, which is what
the store serves, so the store may serve such a pair and a warming run
may record it.  Entries recorded before a process was configured are
not purged; a pair the process answers ignores them, and "git diff-hunks
clear" discards them.

The provider gates itself per request.  The driver is looked up by the
old-side path, so a renamed file resolves to the same driver, and by
the repository-relative path, so a diff.relative run from a
subdirectory names the pair the same way.  Options the process is never
told about select no process: the whitespace-ignoring options, -I,
--anchored, and an algorithm forced by option or configuration (blame
routes its algorithm through xdl_opts, so --histogram is covered).  The
request gains its last field, the path; the consumers change only by
filling it, and neither names the process.

The provider's state is its repository's pool of running processes,
keyed by the configured command, so drivers sharing a command share a
process, a submodule speaks to its own, and releasing the provider
(from repo_clear()) stops them.  The pool owns a copy of each command
string, so an entry outlives a config re-read.  A command that fails
stays as an entry that is not retried: its request and every later one
pass, so the store may serve the path for the rest of the command.

A protocol error in a response never kills the command.  The response
is read through a packet reader gentle about framing, so an error takes
one path: a single warning, the process stopped and marked failed, and
the builtin diff for the rest of the command.  That covers garbage
bytes, a truncated response, an empty packet, a bare status, and an
unrecognized status.  Semantically invalid coordinates cost only their
pair: the response is drained, the pair is computed, and the process
stays alive.  A path the protocol cannot carry (an embedded newline, or
one too long for a packet) falls back per path rather than costing the
command its process.  The handshake keeps one fatal check: a process
that announces a capability Git did not request aborts the command, as
the long-running filter protocol does.

Consulting is allowed per command, following the allow_textconv
precedent.  "git diff", "git log" and "git show", and "git blame" set
allow_diff_process; the plumbing diff commands and the interactive-patch
machinery never set it, so scripted and staging output stays builtin.
The options adjust the flag:

- --no-ext-diff clears it and --ext-diff sets it;
- --diff-process and --no-diff-process set and clear it alone, leaving
  external diff drivers as they were;
- format-patch clears it unconditionally, so a generated patch applies
  for recipients without the process;
- range-diff passes --no-ext-diff to the "git log" it compares.

git blame and the summary formats consult the process.  For blame, a
pair reported equivalent emits no hunks, so the whole commit passes to
its parent.  In the stat formats such a pair sums to a zero-count entry,
which the "nothing changed" rule omits, as under -w.  The subprocess is
long-running: one startup cost across a traversal, one round-trip per
consulted pair.  Answers travel in struct xdl_hunk, new in
xdiff-interface.h, holding xdiff's 1-based coordinates; nothing feeds
them back to xdiff, since only coordinate consumers consult.

A content-carrying request is the natural extension: it would serve
sides that are not stored blobs and processes that want content pushed
to them, and bring patch output and log -L's range tracking to the same
answer.  As it stands, a process's answers show in blame and the summary
formats while patch output stays builtin.

t4080 exercises the protocol, the per-command gate, and the error paths:

- each adversarial response shape warns and falls back to builtin, the
  request log proving which failures disable the process and which keep
  it alive (a malformed hunk line, coordinates past the blob size, a
  count overflowing strtol(), overlapping or misaligned hunks, an
  unrecognized status, a bare status, an empty packet, a mid-response
  crash, and raw garbage);
- a capability-less process and status=abort degrade without noise, and
  a failed start warns once and returns the path to the store;
- a trailing token on a hunk line is ignored, pinning field
  appendability;
- positive consults for git diff, git show, and diff-tree under
  --ext-diff and --diff-process; textconv output and gitlink sides are
  never identified; a diff.relative run consults by the repo-relative
  path;
- the equivalence answer is pinned from both consumers, and a warming
  run past a deferring process records the pair for a later read.

Helped-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Michael Montalbo <mmontalbo@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2026-09-03 07:43:11 -07:00
.github Merge branch 'jk/ci-static-analysis-image-bump' 2026-08-05 11:10:51 -07:00
Documentation diff: consult oid-only hunk providers via diff.<driver>.process 2026-09-03 07:43:11 -07:00
bin-wrappers
block-sha1
builtin diff: consult oid-only hunk providers via diff.<driver>.process 2026-09-03 07:43:11 -07:00
ci Merge branch 'ps/reftable-hardening' 2026-07-19 10:42:15 -07:00
compat Merge branch 'js/coverity-unchecked-returns-fix' 2026-08-24 13:17:50 -07:00
compiler-tricks
contrib Merge branch 'vm/complete-history' 2026-08-31 08:24:59 -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
odb Merge branch 'ps/odb-pluggable-pack-generation' 2026-08-31 08:25:00 -07:00
oss-fuzz Merge branch 'js/pack-objects-delta-size-t' 2026-08-24 13:17:51 -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 'ch/chdir-notify-drop-name' 2026-08-25 10:53:33 -07:00
reftable Merge branch 'js/coverity-unchecked-returns-fix' 2026-08-24 13:17:50 -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 diff: consult oid-only hunk providers via diff.<driver>.process 2026-09-03 07:43:11 -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
.b4-config
.b4-cover-template b4: include change-id in cover template 2026-07-10 09:49:47 -07:00
.cirrus.yml
.clang-format
.editorconfig
.gitattributes
.gitignore diff-hunks: add the store format, library, and command 2026-09-03 07:43:08 -07: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
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 diff: consult oid-only hunk providers via diff.<driver>.process 2026-09-03 07:43:11 -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 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 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 Merge branch 'js/coverity-unchecked-returns-fix' 2026-08-24 13:17:50 -07:00
bisect.h
blame.c diff: consult oid-only hunk providers via diff.<driver>.process 2026-09-03 07:43:11 -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 diff-hunks: add the store format, library, and command 2026-09-03 07:43:08 -07:00
bundle-uri.c Merge branch 'ps/copy-wo-the-repository' 2026-07-27 09:09:00 -07:00
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 odb/transaction: add transaction finalize interface 2026-08-20 20:28:01 -07:00
cache-tree.h
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.h
chunk-format.c diff-hunks: add the store format, library, and command 2026-09-03 07:43:08 -07:00
chunk-format.h diff-hunks: add the store format, library, and command 2026-09-03 07:43:08 -07:00
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 diff-hunks: add the store format, library, and command 2026-09-03 07:43:08 -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 'kk/merge-base-exhaustion' 2026-08-23 18:01:46 -07:00
commit-reach.h
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
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 Merge branch 'js/pack-objects-delta-size-t' 2026-08-24 13:17:51 -07:00
config.h pack-objects: widen delta-cache accounting to `size_t` 2026-08-13 09:42:02 -07:00
config.mak.dev
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
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
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-hunks.c diff: read precomputed hunks for stat output 2026-09-03 07:43:11 -07:00
diff-hunks.h diff: read precomputed hunks for stat output 2026-09-03 07:43:11 -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-process.c diff: consult oid-only hunk providers via diff.<driver>.process 2026-09-03 07:43:11 -07:00
diff-provider-internal.h diff: consult oid-only hunk providers via diff.<driver>.process 2026-09-03 07:43:11 -07:00
diff-provider.c diff: consult oid-only hunk providers via diff.<driver>.process 2026-09-03 07:43:11 -07:00
diff-provider.h diff: consult oid-only hunk providers via diff.<driver>.process 2026-09-03 07:43:11 -07:00
diff.c diff: consult oid-only hunk providers via diff.<driver>.process 2026-09-03 07:43:11 -07:00
diff.h diff: consult oid-only hunk providers via diff.<driver>.process 2026-09-03 07:43:11 -07: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 diffcore-pickaxe: limit -G to the -L tracked range 2026-09-03 07:14:39 -07: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
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 diff-hunks: add the store format, library, and command 2026-09-03 07:43:08 -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
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 'jt/receive-pack-pluggable-writes' 2026-08-31 08:25:00 -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 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 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
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 diff-hunks: add the store format, library, and command 2026-09-03 07:43:08 -07:00
git.rc.in
gpg-interface.c
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
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
help.h
hex-ll.c
hex-ll.h
hex.c
hex.h
hook.c
hook.h
http-backend.c
http-fetch.c http: accept HTTP 416 for complete partial packs 2026-07-27 12:57:20 -07:00
http-push.c Merge branch 'js/pack-objects-delta-size-t' 2026-08-24 13:17:51 -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 'js/coverity-unchecked-returns-fix' 2026-08-24 13:17:50 -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-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: 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-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 Merge branch 'ps/setup-drop-global-state' 2026-07-06 15:50:19 -07:00
mailmap.h
match-trees.c
match-trees.h
mem-pool.c
mem-pool.h
merge-blobs.c
merge-blobs.h
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 diff: consult oid-only hunk providers via diff.<driver>.process 2026-09-03 07:43:11 -07:00
meson_options.txt Merge branch 'ps/reftable-hardening' 2026-07-19 10:42:15 -07:00
midx-write.c repository: move fetch_if_missing into struct repository 2026-08-15 08:37:54 -07:00
midx.c odb/source-packed: flag known-bad objects as corrupt and not missing 2026-08-19 10:23:02 -07:00
midx.h odb/source-packed: flag known-bad objects as corrupt and not missing 2026-08-19 10:23:02 -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 Merge branch 'jt/receive-pack-pluggable-writes' 2026-08-31 08:25:00 -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
odb.c diff-hunks: add the store format, library, and command 2026-09-03 07:43:08 -07:00
odb.h diff-hunks: add the store format, library, and command 2026-09-03 07:43:08 -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 'kk/prio-queue-get-put-fusion' 2026-07-13 08:27:27 -07:00
pack-bitmap.c odb: eagerly initialize alternates 2026-08-17 09:36:10 -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 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 Merge branch 'ps/odb-eagerly-load-alternates' 2026-08-31 08:24:59 -07:00
packfile.h Merge branch 'ps/odb-eagerly-load-alternates' 2026-08-31 08:24:59 -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: introduce OPT_HIDDEN_GROUP 2026-08-11 07:33:16 -07:00
parse-options.h parse-options: introduce OPT_HIDDEN_GROUP 2026-08-11 07:33:16 -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 Merge branch 'kk/prio-queue-get-put-fusion' 2026-07-13 08:27:27 -07:00
path-walk.h
path.c
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
pretty.h
prio-queue.c
prio-queue.h
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
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: 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 diff: consult oid-only hunk providers via diff.<driver>.process 2026-09-03 07:43:11 -07:00
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 'jt/receive-pack-pluggable-writes' 2026-08-31 08:25:00 -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
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 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 '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 diff-hunks: add the store format, library, and command 2026-09-03 07:43:08 -07:00
repo-settings.h diff-hunks: add the store format, library, and command 2026-09-03 07:43:08 -07:00
repository.c diff: introduce a hunk provider interface 2026-09-03 07:42:20 -07:00
repository.h diff: introduce a hunk provider interface 2026-09-03 07:42:20 -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 diff: support --check with -L line ranges 2026-09-03 07:14:39 -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
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 'en/sequencer-lose-pretty-given' 2026-08-24 13:17:50 -07:00
sequencer.h Merge branch 'pw/status-rebase-todo' 2026-07-06 15:50:23 -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/odb-eagerly-load-alternates' 2026-08-31 08:24:59 -07:00
setup.h setup: defer object database creation 2026-08-06 21:24:25 -07:00
sh-i18n--envsubst.c
sha1dc_git.c
sha1dc_git.h
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
statinfo.h
strbuf.c strbuf: avoid redundant reset in strbuf_getwholeline() 2026-07-14 09:35:02 -07:00
strbuf.h
string-list.c
string-list.h
strmap.c
strmap.h
strvec.c
strvec.h
sub-process.c sub-process: add a gentle status read 2026-09-03 07:43:11 -07:00
sub-process.h sub-process: add a gentle status read 2026-09-03 07:43:11 -07:00
submodule-config.c
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
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 Merge branch 'jt/receive-pack-pluggable-writes' 2026-08-31 08:25:00 -07:00
tmp-objdir.h odb: return temporary ODB source when set 2026-08-20 20:28:02 -07:00
trace.c setup: move prefix into repository 2026-07-07 10:49:40 -07:00
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 Merge branch 'ty/migrate-ignorecase' 2026-07-19 10:42:19 -07:00
unpack-trees.h
upload-pack.c upload-pack: generate packfiles via the object database 2026-08-21 09:01:54 -07:00
upload-pack.h
url.c
url.h
urlmatch.c
urlmatch.h
usage.c parse-options: exit 0 on -h 2026-07-07 17:48:57 -07:00
userdiff.c userdiff: add diff.<driver>.process config 2026-09-03 07:43:11 -07:00
userdiff.h userdiff: add diff.<driver>.process config 2026-09-03 07:43:11 -07:00
utf8.c
utf8.h
varint.c
varint.h
version-def.h.in
version.c
version.h
versioncmp.c
versioncmp.h
walker.c
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 diff-hunks: add the store format, library, and command 2026-09-03 07:43:08 -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 diff: emit -L hunk headers via xdiff's formatter 2026-09-03 07:14:38 -07:00
xdiff-interface.h diff: consult oid-only hunk providers via diff.<driver>.process 2026-09-03 07:43:11 -07:00

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