Go to file
Jeff King 6c003d6ffb reopen_tempfile(): truncate opened file
We provide a reopen_tempfile() function, which is in turn
used by reopen_lockfile().  The idea is that a caller may
want to rewrite the tempfile without letting go of the lock.
And that's what our one caller does: after running
add--interactive, "commit -p" will update the cache-tree
extension of the index and write out the result, all while
holding the lock.

However, because we open the file with only the O_WRONLY
flag, the existing index content is left in place, and we
overwrite it starting at position 0. If the new index after
updating the cache-tree is smaller than the original, those
final bytes are not overwritten and remain in the file. This
results in a corrupt index, since those cruft bytes are
interpreted as part of the trailing hash (or even as an
extension, if there are enough bytes).

This bug actually pre-dates reopen_tempfile(); the original
code from 9c4d6c0297 (cache-tree: Write updated cache-tree
after commit, 2014-07-13) has the same bug, and those lines
were eventually refactored into the tempfile module. Nobody
noticed until now for two reasons:

 - the bug can only be triggered in interactive mode
   ("commit -p" or "commit -i")

 - the size of the index must shrink after updating the
   cache-tree, which implies a non-trivial deletion. Notice
   that the included test actually has to create a 2-deep
   hierarchy. A single level is not enough to actually cause
   shrinkage.

The fix is to truncate the file before writing out the
second index. We can do that at the caller by using
ftruncate(). But we shouldn't have to do that. There is no
other place in Git where we want to open a file and
overwrite bytes, making reopen_tempfile() a confusing and
error-prone interface. Let's pass O_TRUNC there, which gives
callers the same state they had after initially opening the
file or lock.

It's possible that we could later add a caller that wants
something else (e.g., to open with O_APPEND). But this is
the only caller we've had in the history of the codebase.
Let's punt on doing anything more clever until another one
comes along.

Reported-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2018-09-05 09:46:16 -07:00
.github
Documentation doc: fix typos in documentation and release notes 2018-06-19 09:01:12 -07:00
block-sha1
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
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
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 reopen_tempfile(): truncate opened file 2018-09-05 09:46:16 -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
COPYING
GIT-VERSION-GEN Git 2.18 2018-06-21 10:00:06 -07:00
INSTALL
LGPL-2.1
Makefile Merge branch 'es/make-no-iconv' 2018-06-18 11:23:24 -07:00
README.md note git-security@googlegroups.com in more places 2018-06-01 09:24:11 +09:00
RelNotes Git 2.17.1 2018-05-22 14:28:26 +09:00
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
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
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.h Merge branch 'nd/command-list' 2018-06-01 15:06:37 +09:00
chdir-notify.c
chdir-notify.h
check-builtins.sh
check-racy.c
check_bindir
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
connected.c
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
credential-cache--daemon.c
credential-cache.c
credential-store.c
credential.c
credential.h
csum-file.c
csum-file.h
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-order.c
diffcore-pickaxe.c regex: do not call `regfree()` if compilation fails 2018-05-21 13:58:32 +09:00
diffcore-rename.c
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
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
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-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
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
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-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
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
iterator.h
khash.h
kwset.c
kwset.h
levenshtein.c
levenshtein.h
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 reopen_tempfile(): truncate opened file 2018-09-05 09:46:16 -07:00
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.h
mailinfo.c Replace all die("BUG: ...") calls by BUG() ones 2018-05-06 19:06:13 +09:00
mailinfo.h
mailmap.c
mailmap.h
match-trees.c
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
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
notes-cache.c
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
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
pack-revindex.h
pack-write.c
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
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.h
quote.c
quote.h
reachable.c cache.h: add repository argument to oid_object_info 2018-04-26 10:54:27 +09:00
reachable.h
read-cache.c Merge branch 'bc/object-id' 2018-05-30 14:04:10 +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
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
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
revision.c Merge branch 'bc/object-id' 2018-05-30 14:04:10 +09:00
revision.h
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.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
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
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
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 reopen_tempfile(): truncate opened file 2018-09-05 09:46:16 -07:00
tempfile.h reopen_tempfile(): truncate opened file 2018-09-05 09:46:16 -07: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.h
trailer.c Replace all die("BUG: ...") calls by BUG() ones 2018-05-06 19:06:13 +09:00
trailer.h
transport-helper.c remote: convert apply_refspecs to take a struct refspec 2018-05-18 06:19:43 +09:00
transport-internal.h
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
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
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
userdiff.h
utf8.c Sync with Git 2.17.1 2018-05-29 17:10:05 +09: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
xdiff-interface.h
zlib.c Replace all die("BUG: ...") calls by BUG() ones 2018-05-06 19:06:13 +09:00

README.md

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