Git with broken hash generation to generate collisions between object IDs. Don't use this! https://undefinedbehavior.de/posts/commit-vandalism/
Go to file
Jeff King 77aa03d6c7 reencode_string: use st_add/st_mult helpers
When converting a string with iconv, if the output buffer
isn't big enough, we grow it. But our growth is done without
any concern for integer overflow. So when we add:

  outalloc = sofar + insz * 2 + 32;

we may end up wrapping outalloc (which is a size_t), and
allocating a too-small buffer. We then manipulate it
further:

  outsz = outalloc - sofar - 1;

and feed outsz back to iconv. If outalloc is wrapped and
smaller than sofar, we'll end up with a small allocation but
feed a very large outsz to iconv, which could result in it
overflowing the buffer.

Can we use this to construct an attack wherein the victim
clones a repository with a very large commit object with an
encoding header, and running "git log" reencodes it into
utf8, causing an overflow?

An attack of this sort is likely impossible in practice.
"sofar" is how many output bytes we've written total, and
"insz" is the number of input bytes remaining. Imagine our
input doubles in size as we output it (which is easy to do
by converting latin1 to utf8, for example), and that we
start with N input bytes. Our initial output buffer also
starts at N bytes, so after the first call we'd have N/2
input bytes remaining (insz), and have written N bytes
(sofar). That means our next allocation will be
(N + N/2 * 2 + 32) bytes, or (2N + 32).

We can therefore overflow a 32-bit size_t with a commit
message that's just under 2^31 bytes, assuming it consists
mostly of "doubling" sequences (e.g., latin1 0xe1 which
becomes utf8 0xc3 0xa1).

But we'll never make it that far with such a message. We'll
be spending 2^31 bytes on the original string. And our
initial output buffer will also be 2^31 bytes. Which is not
going to succeed on a system with a 32-bit size_t, since
there will be other things using the address space, too. The
initial malloc will fail.

If we imagine instead that we can triple the size when
converting, then our second allocation becomes
(N + 2/3N * 2 + 32), or (7/3N + 32). That still requires two
allocations of 3/7 of our address space (6/7 of the total)
to succeed.

If we imagine we can quadruple, it becomes (5/2N + 32); we
need to be able to allocate 4/5 of the address space to
succeed.

This might start to get plausible. But is it possible to get
a 4-to-1 increase in size? Probably if you're converting to
some obscure encoding. But since git defaults to utf8 for
its output, that's the likely destination encoding for an
attack. And while there are 4-character utf8 sequences, it's
unlikely that you'd be able find a single-byte source
sequence in any encoding.

So this is certainly buggy code which should be fixed, but
it is probably not a useful attack vector.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2018-07-24 10:19:29 -07:00
.github
block-sha1 sha1: provide another level of indirection for the SHA-1 functions 2015-11-05 10:35:11 -08:00
builtin Merge branch 'sb/blame-color' 2018-06-18 10:18:45 -07:00
ci Merge branch 'nd/travis-gcc-8' 2018-05-30 14:04:08 +09:00
compat mingw/msvc: use the new-style RUNTIME_PREFIX helper 2018-04-11 18:10:28 +09:00
contrib Merge branch 'ab/cred-netrc-no-autodie' 2018-06-18 10:18:42 -07:00
Documentation doc: fix typos in documentation and release notes 2018-06-19 09:01:12 -07:00
ewah ewah_read_mmap: bounds-check mmap reads 2018-06-18 09:13:57 -07:00
git-gui Merge branch 'cb/git-gui-ttk-style' 2018-04-25 13:28:49 +09:00
gitk-git
gitweb gitweb: hard-depend on the Digest::MD5 5.8 module 2018-03-05 10:52:27 -08:00
mergetools mergetools: add support for guiffy 2018-04-06 08:11:39 +09:00
perl Merge branch 'ab/git-svn-get-record-typofix' 2018-05-08 15:59:28 +09:00
po l10n: ko.po: Update Korean translation 2018-06-19 02:19:42 +09:00
ppc
refs Merge branch 'js/use-bug-macro' 2018-05-30 14:04:07 +09:00
sha1collisiondetection@19d97bf5af
sha1dc
t Merge branch 'cf/submodule-progress-dissociate' 2018-06-19 09:26:59 -07:00
templates Update shell scripts to compute empty tree object ID 2018-05-02 13:59:53 +09:00
vcs-svn Convert remaining die*(BUG) messages 2018-05-06 19:06:14 +09:00
xdiff
.clang-format
.gitattributes .gitattributes: add a diff driver for Python 2018-04-27 09:18:55 +09:00
.gitignore Merge branch 'nd/command-list' 2018-06-01 15:06:37 +09:00
.gitmodules
.mailmap mailmap: update brian m. carlson's email address 2018-05-08 12:21:10 +09:00
.travis.yml travis-ci: run gcc-8 on linux-gcc jobs 2018-05-21 14:14:09 +09:00
.tsan-suppressions
abspath.c
aclocal.m4
advice.c Merge branch 'js/deprecate-grafts' 2018-05-23 14:38:17 +09:00
advice.h Deprecate support for .git/info/grafts 2018-04-30 11:12:31 +09:00
alias.c completion: add and use --list-cmds=alias 2018-05-21 13:23:14 +09:00
alias.h completion: add and use --list-cmds=alias 2018-05-21 13:23:14 +09:00
alloc.c commit: integrate commit graph with commit parsing 2018-04-11 10:43:02 +09:00
apply.c Merge branch 'js/use-bug-macro' 2018-05-30 14:04:07 +09:00
apply.h
archive-tar.c Merge branch 'js/use-bug-macro' 2018-05-30 14:04:07 +09:00
archive-zip.c cache.h: add repository argument to oid_object_info 2018-04-26 10:54:27 +09:00
archive.c Use OPT_SET_INT_F() for cmdline option specification 2018-05-24 16:12:29 +09:00
archive.h archive: convert sha1_file_to_archive to struct object_id 2018-03-14 09:23:48 -07:00
argv-array.c Merge branch 'ma/unpack-trees-free-msgs' 2018-05-30 21:51:29 +09:00
argv-array.h Merge branch 'ma/unpack-trees-free-msgs' 2018-05-30 21:51:29 +09:00
attr.c Replace all die("BUG: ...") calls by BUG() ones 2018-05-06 19:06:13 +09:00
attr.h
base85.c
bisect.c Merge branch 'ys/bisect-object-id-missing-conversion-fix' 2018-04-10 16:28:24 +09:00
bisect.h
blame.c Merge branch 'js/use-bug-macro' 2018-05-30 14:04:07 +09:00
blame.h
blob.c
blob.h
branch.c refspec: rename struct refspec to struct refspec_item 2018-05-18 06:19:41 +09:00
branch.h
builtin.h Merge branch 'ds/commit-graph' 2018-05-08 15:59:20 +09:00
bulk-checkin.c Merge branch 'js/use-bug-macro' 2018-05-30 14:04:07 +09:00
bulk-checkin.h bulk-checkin: convert index_bulk_checkin to struct object_id 2018-03-14 09:23:47 -07:00
bundle.c Merge branch 'ma/lockfile-cleanup' 2018-05-30 14:04:05 +09:00
bundle.h
cache-tree.c cache-tree: use is_empty_tree_oid 2018-05-02 13:59:52 +09:00
cache-tree.h cache-tree: convert write_*_as_tree to object_id 2018-03-14 09:23:47 -07:00
cache.h Merge branch 'nd/command-list' 2018-06-01 15:06:37 +09:00
chdir-notify.c add chdir-notify API 2018-03-30 12:49:57 -07:00
chdir-notify.h add chdir-notify API 2018-03-30 12:49:57 -07:00
check_bindir
check-builtins.sh
check-racy.c
checkout.c refspec: rename struct refspec to struct refspec_item 2018-05-18 06:19:41 +09:00
checkout.h
color.c Merge branch 'js/use-bug-macro' 2018-05-30 14:04:07 +09:00
color.h color: introduce support for colorizing stderr 2018-04-24 10:38:47 +09:00
column.c Replace all die("BUG: ...") calls by BUG() ones 2018-05-06 19:06:13 +09:00
column.h
combine-diff.c Merge branch 'bw/c-plus-plus' into ds/lazy-load-trees 2018-04-11 10:46:32 +09:00
command-list.txt Merge branch 'nd/command-list' 2018-06-01 15:06:37 +09:00
commit-graph.c Merge branch 'sb/oid-object-info' 2018-05-23 14:38:16 +09:00
commit-graph.h commit-graph: lazy-load trees for commits 2018-04-11 10:47:16 +09:00
commit-slab.h
commit.c Merge branch 'jk/index-pack-maint' 2018-06-13 12:50:46 -07:00
commit.h Merge branch 'nd/pack-struct-commit' 2018-05-30 14:04:08 +09:00
common-main.c Merge branch 'dj/runtime-prefix' 2018-05-08 15:59:17 +09:00
config.c Merge branch 'ma/config-store-data-clear' 2018-05-30 21:51:28 +09:00
config.h Merge branch 'tb/config-default' 2018-05-08 15:59:27 +09:00
config.mak.dev Makefile: add a DEVOPTS to get all of -Wextra 2018-04-16 13:54:53 +09:00
config.mak.in
config.mak.uname Merge branch 'nd/repack-keep-pack' 2018-05-23 14:38:14 +09:00
configure.ac Merge branch 'es/fread-reads-dir-autoconf-fix' 2018-04-25 13:29:01 +09:00
connect.c Merge branch 'nd/command-list' 2018-06-01 15:06:37 +09:00
connect.h fetch-pack: support shallow requests 2018-03-15 12:01:09 -07:00
connected.c Merge branch 'jh/partial-clone' 2018-02-13 13:39:04 -08:00
connected.h
convert.c Merge branch 'ls/checkout-encoding' 2018-05-08 15:59:22 +09:00
convert.h Merge branch 'ls/checkout-encoding' 2018-05-08 15:59:22 +09:00
copy.c
COPYING
credential-cache--daemon.c
credential-cache.c
credential-store.c
credential.c credential: ignore SIGPIPE when writing to credential helpers 2018-03-29 15:33:55 -07:00
credential.h
csum-file.c csum-file: refactor finalize_hashfile() method 2018-04-02 14:27:30 -07:00
csum-file.h csum-file: refactor finalize_hashfile() method 2018-04-02 14:27:30 -07:00
ctype.c
daemon.c Merge branch 'lw/daemon-log-destination' 2018-04-25 13:28:58 +09:00
date.c Replace all die("BUG: ...") calls by BUG() ones 2018-05-06 19:06:13 +09:00
decorate.c
decorate.h
delta.h
detect-compiler Makefile: detect compiler and enable more warnings in DEVELOPER=1 2018-04-16 13:54:53 +09:00
diff-delta.c
diff-lib.c Merge branch 'bw/c-plus-plus' into ds/lazy-load-trees 2018-04-11 10:46:32 +09:00
diff-no-index.c
diff.c Merge branch 'bc/object-id' 2018-05-30 14:04:10 +09:00
diff.h add status config and command line options for rename detection 2018-05-13 10:57:37 +09:00
diffcore-break.c
diffcore-delta.c diffcore-delta: rename 'new' variables 2018-02-22 10:08:05 -08:00
diffcore-order.c
diffcore-pickaxe.c regex: do not call regfree() if compilation fails 2018-05-21 13:58:32 +09:00
diffcore-rename.c Merge branch 'po/object-id' 2018-02-15 14:55:43 -08:00
diffcore.h
dir-iterator.c Replace all die("BUG: ...") calls by BUG() ones 2018-05-06 19:06:13 +09:00
dir-iterator.h
dir.c Merge branch 'jk/ewah-bounds-check' 2018-06-18 11:23:22 -07:00
dir.h Merge branch 'bc/object-id' 2018-05-30 14:04:10 +09:00
editor.c
entry.c convert: convert to struct object_id 2018-03-14 09:23:50 -07:00
environment.c Merge branch 'ls/checkout-encoding' 2018-05-08 15:59:22 +09:00
exec-cmd.c Merge branch 'js/runtime-prefix' 2018-05-08 15:59:34 +09:00
exec-cmd.h Merge branch 'dj/runtime-prefix' 2018-05-08 15:59:17 +09:00
fast-import.c Merge branch 'ma/lockfile-cleanup' 2018-05-30 14:04:05 +09:00
fetch-object.c
fetch-object.h
fetch-pack.c Merge branch 'jt/partial-clone-proto-v2' 2018-05-30 14:04:10 +09:00
fetch-pack.h Merge branch 'bw/protocol-v2' 2018-05-08 15:59:16 +09:00
fmt-merge-msg.h
fsck.c Merge branch 'jk/submodule-fsck-loose-fixup' 2018-06-13 12:50:44 -07:00
fsck.h fsck: detect gitmodules files 2018-05-21 23:55:12 -04:00
fsmonitor.c Merge branch 'jk/snprintf-truncation' 2018-05-30 21:51:28 +09:00
fsmonitor.h
generate-cmdlist.sh git: support --list-cmds=list-<category> 2018-05-21 13:23:14 +09:00
gettext.c Merge branch 'js/runtime-prefix' 2018-05-08 15:59:34 +09:00
gettext.h
git-add--interactive.perl add--interactive: compute the empty tree value 2018-05-02 13:59:53 +09:00
git-archimport.perl
git-bisect.sh
git-compat-util.h Merge branch 'js/use-bug-macro' 2018-05-30 14:04:07 +09:00
git-cvsexportcommit.perl
git-cvsimport.perl perl: call timegm and timelocal with 4-digit year 2018-02-23 14:47:06 -08:00
git-cvsserver.perl
git-difftool--helper.sh
git-filter-branch.sh Update shell scripts to compute empty tree object ID 2018-05-02 13:59:53 +09:00
git-instaweb.sh git-instaweb: use @SHELL_PATH@ instead of /bin/sh 2015-03-10 15:10:35 -07:00
git-merge-octopus.sh
git-merge-one-file.sh merge-one-file: compute empty blob object ID 2018-05-02 13:59:53 +09:00
git-merge-resolve.sh
git-mergetool--lib.sh
git-mergetool.sh mergetool: fix running in subdir when rerere enabled 2017-01-10 13:22:51 -08:00
git-p4.py Merge branch 'ld/git-p4-updates' 2018-06-18 10:18:41 -07:00
git-parse-remote.sh
git-quiltimport.sh
git-rebase--am.sh Merge branch 'pw/rebase-signoff' 2018-04-25 13:28:51 +09:00
git-rebase--interactive.sh Merge branch 'js/rebase-recreate-merge' 2018-06-01 15:06:40 +09:00
git-rebase--merge.sh Merge branch 'pw/rebase-signoff' 2018-04-25 13:28:51 +09:00
git-rebase.sh rebase -i: introduce --rebase-merges=[no-]rebase-cousins 2018-04-26 12:28:43 +09:00
git-remote-testgit.sh
git-request-pull.sh
git-send-email.perl Merge branch 'dd/send-email-reedit' 2018-05-30 14:04:03 +09:00
git-sh-i18n.sh
git-sh-setup.sh Merge branch 'va/i18n-even-more' 2016-12-27 00:11:45 -08:00
git-stash.sh Merge branch 'tg/stash-untracked-with-pathspec-fix' 2018-04-10 08:25:45 +09:00
git-submodule.sh Merge branch 'sb/submodule-update-try-harder' 2018-05-30 14:04:12 +09:00
git-svn.perl git-svn: search --authors-prog in PATH too 2018-04-05 06:55:02 +00:00
GIT-VERSION-GEN Git 2.18 2018-06-21 10:00:06 -07:00
git-web--browse.sh
git.c Merge branch 'nd/command-list' 2018-06-01 15:06:37 +09:00
git.rc
gpg-interface.c gpg-interface: find the last gpg signature line 2018-04-16 14:15:03 +09:00
gpg-interface.h gpg-interface: use size_t for signature buffer size 2018-04-16 14:15:03 +09:00
graph.c
graph.h
grep.c Merge branch 'ma/regex-no-regfree-after-comp-fail' 2018-05-30 21:51:28 +09:00
grep.h
hash.h
hashmap.c
hashmap.h Merge branch 'rb/hashmap-h-compilation-fix' into maint 2018-03-22 14:24:15 -07:00
help.c Merge branch 'nd/command-list' 2018-06-01 15:06:37 +09:00
help.h completion: allow to customize the completable command list 2018-05-21 13:23:14 +09:00
hex.c
http-backend.c Merge branch 'bw/protocol-v2' 2018-05-08 15:59:16 +09:00
http-fetch.c Merge branch 'ma/http-walker-no-partial' 2018-05-08 15:59:35 +09:00
http-push.c Merge branch 'bw/ref-prefix-for-configured-refspec' 2018-05-30 21:51:26 +09:00
http-walker.c Merge branch 'sb/object-store' 2018-04-11 13:09:55 +09:00
http.c Merge branch 'bw/remote-curl-compressed-responses' 2018-05-30 21:51:29 +09:00
http.h Merge branch 'jk/snprintf-truncation' 2018-05-30 21:51:28 +09:00
ident.c
imap-send.c Replace all die("BUG: ...") calls by BUG() ones 2018-05-06 19:06:13 +09:00
INSTALL RelNotes: add details on Perl module changes 2018-03-16 16:07:37 -07:00
iterator.h
khash.h
kwset.c
kwset.h
levenshtein.c
levenshtein.h
LGPL-2.1
line-log.c Merge branch 'ds/lazy-load-trees' 2018-05-23 14:38:13 +09:00
line-log.h
line-range.c
line-range.h
list-objects-filter-options.c
list-objects-filter-options.h
list-objects-filter.c Merge branch 'sb/oid-object-info' 2018-05-23 14:38:16 +09:00
list-objects-filter.h
list-objects.c treewide: replace maybe_tree with accessor methods 2018-04-11 10:47:16 +09:00
list-objects.h
list.h
ll-merge.c
ll-merge.h
lockfile.c Replace all die("BUG: ...") calls by BUG() ones 2018-05-06 19:06:13 +09:00
lockfile.h
log-tree.c Merge branch 'jk/snprintf-truncation' 2018-05-30 21:51:28 +09:00
log-tree.h format-patch: make cover letters always text/plain 2018-05-02 12:55:00 +09:00
ls-refs.c ls-refs: introduce ls-refs server command 2018-03-15 12:01:08 -07:00
ls-refs.h ls-refs: introduce ls-refs server command 2018-03-15 12:01:08 -07:00
mailinfo.c Replace all die("BUG: ...") calls by BUG() ones 2018-05-06 19:06:13 +09:00
mailinfo.h
mailmap.c sha1_file: convert read_sha1_file to struct object_id 2018-03-14 09:23:50 -07:00
mailmap.h
Makefile Merge branch 'es/make-no-iconv' 2018-06-18 11:23:24 -07:00
match-trees.c sha1_file: convert read_sha1_file to struct object_id 2018-03-14 09:23:50 -07:00
mem-pool.c mem-pool: move reusable parts of memory pool into its own file 2018-04-12 11:55:20 +09:00
mem-pool.h mem-pool: move reusable parts of memory pool into its own file 2018-04-12 11:55:20 +09:00
merge-blobs.c sha1_file: convert read_sha1_file to struct object_id 2018-03-14 09:23:50 -07:00
merge-blobs.h
merge-recursive.c Merge branch 'en/rename-directory-detection' 2018-06-18 10:18:44 -07:00
merge-recursive.h merge: add merge.renames config setting 2018-05-08 16:19:41 +09:00
merge.c Merge branch 'ma/unpack-trees-free-msgs' 2018-05-30 21:51:29 +09:00
mergesort.c
mergesort.h
name-hash.c Merge branch 'bp/name-hash-dirname-fix' 2018-02-27 10:33:53 -08:00
notes-cache.c sha1_file: convert read_sha1_file to struct object_id 2018-03-14 09:23:50 -07:00
notes-cache.h
notes-merge.c Merge branch 'js/use-bug-macro' 2018-05-30 14:04:07 +09:00
notes-merge.h
notes-utils.c
notes-utils.h
notes.c sha1_file: convert read_sha1_file to struct object_id 2018-03-14 09:23:50 -07:00
notes.h
object-store.h Merge branch 'nd/pack-objects-pack-struct' 2018-05-23 14:38:19 +09:00
object.c Merge branch 'sb/oid-object-info' 2018-05-23 14:38:16 +09:00
object.h Merge branch 'nd/pack-objects-pack-struct' 2018-05-23 14:38:19 +09:00
oidmap.c
oidmap.h
oidset.c
oidset.h
pack-bitmap-write.c Merge branch 'js/use-bug-macro' 2018-05-30 14:04:07 +09:00
pack-bitmap.c Merge branch 'jk/ewah-bounds-check' 2018-06-18 11:23:22 -07:00
pack-bitmap.h pack-objects: move in_pack_pos out of struct object_entry 2018-04-16 12:38:58 +09:00
pack-check.c packfile: add repository argument to unpack_entry 2018-04-26 10:54:27 +09:00
pack-objects.c Merge branch 'js/use-bug-macro' 2018-05-30 14:04:07 +09:00
pack-objects.h Merge branch 'nd/pack-objects-pack-struct' 2018-05-23 14:38:19 +09:00
pack-revindex.c object-store: move packed_git and packed_git_mru to object store 2018-03-26 10:05:46 -07:00
pack-revindex.h
pack-write.c csum-file: refactor finalize_hashfile() method 2018-04-02 14:27:30 -07:00
pack.h
packfile.c Merge branch 'jl/zlib-restore-nul-termination' 2018-06-18 10:18:43 -07:00
packfile.h Merge branch 'bc/object-id' 2018-05-30 14:04:10 +09:00
pager.c Merge branch 'nd/command-list' 2018-06-01 15:06:37 +09:00
parse-options-cb.c parseopt: handle malformed --expire arguments more nicely 2018-04-23 22:36:59 +09:00
parse-options.c Merge branch 'ps/contains-id-error-message' 2018-04-10 16:28:20 +09:00
parse-options.h Merge branch 'ps/contains-id-error-message' 2018-04-10 16:28:20 +09:00
patch-delta.c
patch-ids.c
patch-ids.h
path.c Sync with Git 2.17.1 2018-05-29 17:10:05 +09:00
path.h
pathspec.c Convert remaining die*(BUG) messages 2018-05-06 19:06:14 +09:00
pathspec.h
pkt-line.c Merge branch 'js/use-bug-macro' 2018-05-30 14:04:07 +09:00
pkt-line.h pkt-line: add packet_buf_write_len function 2018-03-15 12:01:09 -07:00
preload-index.c
pretty.c Merge branch 'ds/lazy-load-trees' 2018-05-23 14:38:13 +09:00
pretty.h
prio-queue.c Replace all die("BUG: ...") calls by BUG() ones 2018-05-06 19:06:13 +09:00
prio-queue.h
progress.c
progress.h
prompt.c
prompt.h
protocol.c protocol: introduce enum protocol_version value protocol_v2 2018-03-14 14:15:07 -07:00
protocol.h protocol: introduce enum protocol_version value protocol_v2 2018-03-14 14:15:07 -07:00
quote.c Merge branch 'jk/sq-dequote-on-bogus-input' 2018-02-27 10:34:02 -08:00
quote.h
reachable.c cache.h: add repository argument to oid_object_info 2018-04-26 10:54:27 +09:00
reachable.h timestamp_t: a new data type for timestamps 2017-04-27 13:07:39 +09:00
read-cache.c Merge branch 'bc/object-id' 2018-05-30 14:04:10 +09:00
README.md note git-security@googlegroups.com in more places 2018-06-01 09:24:11 +09:00
ref-filter.c Merge branch 'js/use-bug-macro' 2018-05-30 14:04:07 +09:00
ref-filter.h Merge branch 'ot/libify-get-ref-atom-value' 2018-05-08 15:59:18 +09:00
reflog-walk.c
reflog-walk.h
refs.c Merge branch 'jk/snprintf-truncation' 2018-05-30 21:51:28 +09:00
refs.h Merge branch 'sb/object-store-replace' 2018-05-08 15:59:21 +09:00
refspec.c Merge branch 'bw/refspec-api' 2018-06-04 21:39:50 +09:00
refspec.h fetch: do not pass ref-prefixes for fetch by exact SHA1 2018-06-01 15:15:22 +09:00
RelNotes Git 2.17.1 2018-05-22 14:28:26 +09:00
remote-curl.c remote-curl: accept compressed responses with protocol v2 2018-05-23 10:24:13 +09:00
remote-testsvn.c exec_cmd: rename to use dash in file name 2018-04-11 18:11:00 +09:00
remote.c Merge branch 'bw/ref-prefix-for-configured-refspec' 2018-05-30 21:51:26 +09:00
remote.h Merge branch 'bw/ref-prefix-for-configured-refspec' 2018-05-30 21:51:26 +09:00
replace-object.c Merge branch 'sb/object-store-replace' 2018-05-23 14:38:09 +09:00
replace-object.h replace-object: allow lookup_replace_object to handle arbitrary repositories 2018-04-12 11:38:57 +09:00
repository.c Merge branch 'nd/repo-clear-keep-the-index' 2018-05-30 14:04:05 +09:00
repository.h Merge branch 'sb/object-store-replace' 2018-05-08 15:59:21 +09:00
rerere.c Merge branch 'ma/lockfile-cleanup' 2018-05-30 14:04:05 +09:00
rerere.h completion: don't set PARSE_OPT_NOCOMPLETE on --rerere-autoupdate 2018-03-07 11:02:48 -08:00
resolve-undo.c cache: add a function to read an object ID from a buffer 2018-05-02 13:59:48 +09:00
resolve-undo.h resolve-undo: convert struct resolve_undo_info to object_id 2018-03-14 09:23:47 -07:00
revision.c Merge branch 'bc/object-id' 2018-05-30 14:04:10 +09:00
revision.h Merge branch 'jk/cached-commit-buffer' into HEAD 2018-03-13 13:35:25 -07:00
run-command.c Replace all die("BUG: ...") calls by BUG() ones 2018-05-06 19:06:13 +09:00
run-command.h
send-pack.c send-pack: convert remaining functions to struct object_id 2018-03-14 09:23:48 -07:00
send-pack.h
sequencer.c Merge branch 'js/rebase-i-root-fix' 2018-06-18 11:23:22 -07:00
sequencer.h Merge branch 'js/sequencer-and-root-commits' 2018-05-30 14:04:04 +09:00
serve.c serve: introduce the server-option capability 2018-04-24 11:24:40 +09:00
serve.h serve: introduce git-serve 2018-03-15 12:01:08 -07:00
server-info.c server-info: remove unused members from struct pack_info 2018-05-02 13:59:48 +09:00
setup.c Replace all die("BUG: ...") calls by BUG() ones 2018-05-06 19:06:13 +09:00
sh-i18n--envsubst.c
sha1-array.c get_short_oid: sort ambiguous objects by type, then SHA-1 2018-05-11 14:43:23 +09:00
sha1-array.h get_short_oid: sort ambiguous objects by type, then SHA-1 2018-05-11 14:43:23 +09:00
sha1-file.c Merge branch 'rd/comment-typofix-in-sha1-file' 2018-06-18 10:18:40 -07:00
sha1-lookup.c Replace all die("BUG: ...") calls by BUG() ones 2018-05-06 19:06:13 +09:00
sha1-lookup.h packfile: refactor hash search with fanout table 2018-02-15 13:08:55 -08:00
sha1-name.c Merge branch 'ab/get-short-oid' 2018-05-30 14:04:11 +09:00
sha1dc_git.c
sha1dc_git.h
shallow.c Merge branch 'js/use-bug-macro' 2018-05-30 14:04:07 +09:00
shell.c Merge branch 'nd/command-list' 2018-06-01 15:06:37 +09:00
shortlog.h
show-index.c
sideband.c Avoid multiple PREFIX definitions 2018-04-24 11:12:32 +09:00
sideband.h
sigchain.c Replace all die("BUG: ...") calls by BUG() ones 2018-05-06 19:06:13 +09:00
sigchain.h
split-index.c split-index: convert struct split_index to object_id 2018-05-02 13:59:50 +09:00
split-index.h split-index: convert struct split_index to object_id 2018-05-02 13:59:50 +09:00
strbuf.c Merge branch 'js/use-bug-macro' 2018-05-30 14:04:07 +09:00
strbuf.h Merge branch 'en/rename-directory-detection-reboot' 2018-05-23 14:38:19 +09:00
streaming.c cache.h: add repository argument to oid_object_info_extended 2018-04-26 10:54:27 +09:00
streaming.h streaming: convert open_istream to use struct object_id 2018-03-14 09:23:49 -07:00
string-list.c
string-list.h
sub-process.c
sub-process.h
submodule-config.c Merge branch 'bc/object-id' 2018-05-30 14:04:10 +09:00
submodule-config.h Merge branch 'bc/object-id' 2018-05-30 14:04:10 +09:00
submodule.c Merge branch 'jt/submodule-pull-recurse-rebase' 2018-06-04 21:39:48 +09:00
submodule.h Merge branch 'jt/submodule-pull-recurse-rebase' 2018-06-04 21:39:48 +09:00
symlinks.c
tag.c cache.h: add repository argument to oid_object_info 2018-04-26 10:54:27 +09:00
tag.h
tar.h
tempfile.c tempfile: rename 'template' variables 2018-02-22 10:08:05 -08:00
tempfile.h tempfile: rename 'template' variables 2018-02-22 10:08:05 -08:00
thread-utils.c
thread-utils.h
tmp-objdir.c Replace all die("BUG: ...") calls by BUG() ones 2018-05-06 19:06:13 +09:00
tmp-objdir.h
trace.c trace.c: export trace_setup_key 2018-03-30 12:49:57 -07:00
trace.h trace.c: export trace_setup_key 2018-03-30 12:49:57 -07:00
trailer.c Replace all die("BUG: ...") calls by BUG() ones 2018-05-06 19:06:13 +09:00
trailer.h Merge branch 'jk/trailers-parse' 2017-08-26 22:55:04 -07:00
transport-helper.c remote: convert apply_refspecs to take a struct refspec 2018-05-18 06:19:43 +09:00
transport-internal.h transport: convert get_refs_list to take a list of ref prefixes 2018-03-15 12:01:08 -07:00
transport.c Merge branch 'bw/ref-prefix-for-configured-refspec' 2018-05-30 21:51:26 +09:00
transport.h Merge branch 'bw/ref-prefix-for-configured-refspec' 2018-05-30 21:51:26 +09:00
tree-diff.c
tree-walk.c tree-walk: convert get_tree_entry_follow_symlinks to object_id 2018-05-02 13:59:50 +09:00
tree-walk.h tree-walk: convert get_tree_entry_follow_symlinks to object_id 2018-05-02 13:59:50 +09:00
tree.c Merge branch 'ds/lazy-load-trees' 2018-05-23 14:38:13 +09:00
tree.h tree: convert read_tree_recursive to struct object_id 2018-03-14 09:23:47 -07:00
unicode-width.h unicode_width.h: rename to use dash in file name 2018-04-11 18:11:00 +09:00
unimplemented.sh
unix-socket.c
unix-socket.h
unpack-trees.c Merge branch 'ma/unpack-trees-free-msgs' 2018-05-30 21:51:29 +09:00
unpack-trees.h unpack_trees_options: free messages when done 2018-05-22 11:59:31 +09:00
upload-pack.c Merge branch 'jt/partial-clone-proto-v2' 2018-05-30 14:04:10 +09:00
upload-pack.h fetch-pack: perform a fetch using v2 2018-03-15 12:01:08 -07:00
url.c
url.h
urlmatch.c
urlmatch.h
usage.c Merge branch 'jk/snprintf-truncation' 2018-05-30 21:51:28 +09:00
userdiff.c Merge branch 'tl/userdiff-csharp-async' 2018-03-15 15:00:47 -07:00
userdiff.h
utf8.c reencode_string: use st_add/st_mult helpers 2018-07-24 10:19:29 -07:00
utf8.h Sync with Git 2.17.1 2018-05-29 17:10:05 +09:00
varint.c
varint.h
version.c
version.h
versioncmp.c
walker.c Merge branch 'ds/lazy-load-trees' 2018-05-23 14:38:13 +09:00
walker.h walker: drop fields of struct walker which are always 1 2018-04-24 10:55:04 +09:00
wildmatch.c
wildmatch.h
worktree.c Replace all die("BUG: ...") calls by BUG() ones 2018-05-06 19:06:13 +09:00
worktree.h
wrap-for-bin.sh Make running git under other debugger-like programs easy 2018-04-25 10:47:22 +09:00
wrapper.c Replace all die("BUG: ...") calls by BUG() ones 2018-05-06 19:06:13 +09:00
write-or-die.c write_or_die.c: rename to use dashes in file name 2018-04-11 18:11:00 +09:00
ws.c
wt-status.c Merge branch 'bc/object-id' 2018-05-30 14:04:10 +09:00
wt-status.h add status config and command line options for rename detection 2018-05-13 10:57:37 +09:00
xdiff-interface.c sha1_file: convert read_sha1_file to struct object_id 2018-03-14 09:23:50 -07:00
xdiff-interface.h
zlib.c Replace all die("BUG: ...") calls by BUG() ones 2018-05-06 19:06:13 +09:00

Git - fast, scalable, distributed revision control system

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

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

Please read the file INSTALL for installation instructions.

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

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

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

The user discussion and development of Git take place on the Git mailing list -- everyone is welcome to post bug reports, feature requests, comments and patches to git@vger.kernel.org (read Documentation/SubmittingPatches for instructions on patch submission). To subscribe to the list, send an email with just "subscribe git" in the body to majordomo@vger.kernel.org. The mailing list archives are available at https://public-inbox.org/git/, http://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