Go to file
Derrick Stolee 4ea9448a9c trace2: tolerate failed timestamp formatting
Some users reported issues of repeated messages:

  fatal: recursion detected in die handler

This wasn't happening every time, but we eventually captured a
GIT_TRACE2_PERF log file with this issue and revealed an interesting
internal detail, failing with this message:

  unable to format message: %4d-%02d-%02dT%02d:%02d:%02d.%06ldZ

This specific format string tracks to tr2_tbuf_utc_datetime_extended()
in trace2/tr2_tbuf.c. This logic began as tr2_tbuf_utc_time() in
ee4512ed48 (trace2: create new combined trace facility, 2019-02-22) but
was later split in bad229aef2 (trace2: clarify UTC datetime formatting,
2019-04-15).

This use of xsnprintf() is writing a very specific datetime format into a
32-character buffer. The format requires that the input data will not
overflow the format digits or the buffer will not hold the result. Since
we are using xsnprintf() here, those failures turn into die() events.

This method and its siblings, tr2_tbuf_local_time() and
tr2_tbuf_utc_datetime(), are used in the tracing library. The extended
form is used only for the 'event' format, which these users were using
via a config setting for use in client-side telemetry. The non-extended
form is used to help generate the 'SID' that defines the process in the
traces.

Not only are these inappropriate times for a failure, but the extended
method is called specifially during the 'atexit' event, which was
triggering this problem in a loop as the 'atexit' event would be
retriggered by the die().

Based on other symptoms impacting users on the version reporting these
failures, it is most likely that this is actually a failure to allocate
memory, which is a specific symptom in Git for Windows. That fork uses a
different library for its implementation of vsprintf() which allocates
an array when seven or more positional arguments exist in the formatting
string, such as this one.

Ultimately, the trace2 machinery is so low-level that it should not rely on
any helper functions that perform error handling with die(), as that can
trigger issues that would then be traced, causing this kind of recursive
loop.

These changes help remove any use of die() within this file:

1. Both 'tv' and 'tm' structs are initialized with zero values, allowing
   an erroring gettimeofday() or gmtime_r() method to leave them
   zero-valued. A zero-valued date is better than a die() here.

2. Replace the use of xsnprintf() with snprintf() to avoid the
   possibility of calling die() here. Instead, check the response to see
   if there was a failure. On failure, put a blank value into the buffer
   instead of possibly allowing a value that would not format correctly
   for a trace2 consumer. This value should be seen as obviously wrong
   and therefore signals a problem.

As the core issue in this code seems to require a system method
returning an error, no test accompanies this change.

This change removes all uses of xsnprintf() from the trace2/ directory.
There are two uses of xstrdup() that could be considered for removal,
but they only die() on out-of-memory errors instead of formatting
issues. I chose to leave those in place for now.

Helped-by: Taylor Blau <ttaylorr@openai.com>
Signed-off-by: Derrick Stolee <stolee@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2026-08-31 11:08:41 -07:00
.github Merge branch 'jk/ci-static-analysis-image-bump' 2026-08-05 11:10:51 -07:00
Documentation The 20th batch 2026-08-28 11:04:57 -07:00
bin-wrappers
block-sha1
builtin Merge branch 'ss/repack-drop-filtered' 2026-08-25 10:53:32 -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 'jc/complete-checkout' 2026-08-25 10:53:34 -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 'ch/chdir-notify-drop-name' 2026-08-25 10:53:33 -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 Merge branch 'sk/object-name-use-after-free' 2026-08-28 11:04:57 -07:00
templates
tools hash: convert remaining direct function calls 2026-07-07 21:56:00 -07:00
trace2 trace2: tolerate failed timestamp formatting 2026-08-31 11:08:41 -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 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 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-die.h trace2: tolerate failed timestamp formatting 2026-08-31 11:08:41 -07:00
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 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.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
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 'kk/merge-base-exhaustion' 2026-08-23 18:01:46 -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 '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 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 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.c Merge branch 'en/diff-l-opt-help' 2026-08-24 13:17:51 -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 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 'tn/packfile-uri-concurrency' 2026-08-15 09:20:27 -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 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 git: avoid segfault on "git --shallow-file" without a value 2026-08-11 12:17:14 -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 '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-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 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: 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-streams' 2026-08-23 18:01: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 'sk/object-name-use-after-free' 2026-08-28 11:04:57 -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 commit-reach: deduplicate queue entries in paint_down_to_common 2026-05-26 07:17:26 +09:00
odb.c Merge branch 'ps/odb-streams' 2026-08-23 18:01:43 -07:00
odb.h Merge branch 'ps/odb-streams' 2026-08-23 18:01:43 -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 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-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: 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 'js/packfile-fast-append' 2026-08-25 10:53:33 -07:00
packfile.h Merge branch 'js/pack-objects-delta-size-t' 2026-08-24 13:17:51 -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 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: 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 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 builtin/repack: enumerate promisor blobs for --drop-filtered 2026-08-13 13:34:49 -07:00
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-promisor: allow excluding objects from the rebuilt promisor pack 2026-08-13 13:34:49 -07:00
repack.c midx: refactor interfaces to work on "packed" source 2026-06-17 05:00:01 -07:00
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 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 '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 'ch/chdir-notify-drop-name' 2026-08-25 10:53:33 -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 chdir-notify.h: Removed unused param 'name' 2026-08-14 15:08:35 -07:00
tmp-objdir.h
trace.c setup: move prefix into repository 2026-07-07 10:49:40 -07:00
trace.h
trace2.c banned-die: create header for banning of functions 2026-08-31 11:08:41 -07:00
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 '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 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: return URL_SCHEME_UNKNOWN instead of dying 2026-05-06 09:48:27 +09:00
url.h url: return URL_SCHEME_UNKNOWN instead of dying 2026-05-06 09:48:27 +09:00
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 checkout -m: autostash when switching branches 2026-04-29 21:46:03 +09: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