Git with broken hash generation to generate collisions between object IDs. Don't use this! https://undefinedbehavior.de/posts/commit-vandalism/
Go to file
Elijah Newren ad3762042a read-cache: fix directory/file conflict handling in read_index_unmerged()
read_index_unmerged() has two intended purposes:
  * return 1 if there are any unmerged entries, 0 otherwise
  * drops any higher-stage entries down to stage #0

There are several callers of read_index_unmerged() that check the return
value to see if it is non-zero, all of which then die() if that condition
is met.  For these callers, dropping higher-stage entries down to stage #0
is a waste of resources, and returning immediately on first unmerged entry
would be better.  But it's probably only a very minor difference and isn't
the focus of this series.

The remaining callers ignore the return value and call this function for
the side effect of dropping higher-stage entries down to stage #0.  As
mentioned in commit e11d7b5969 ("'reset --merge': fix unmerged case",
2009-12-31),

    The _only_ reason we want to keep a previously unmerged entry in the
    index at stage #0 is so that we don't forget the fact that we have
    corresponding file in the work tree in order to be able to remove it
    when the tree we are resetting to does not have the path.

In fact, prior to commit d1a43f2aa4 ("reset --hard/read-tree --reset -u:
remove unmerged new paths", 2008-10-15), read_index_unmerged() did just
remove unmerged entries from the cache immediately but that had the
unwanted effect of leaving around new untracked files in the tree from
aborted merges.

So, that's the intended purpose of this function.  The problem is that
when directory/files conflicts are present, trying to add the file to the
index at stage 0 fails (because there is still a directory in the way),
and the function returns early with a -1 return code to signify the error.
As noted above, none of the callers who want the drop-to-stage-0 behavior
check the return status, though, so this means all remaining unmerged
entries remain in the index and the callers proceed assuming otherwise.
Users then see errors of the form:

    error: 'DIR-OR-FILE' appears as both a file and as a directory
    error: DIR-OR-FILE: cannot drop to stage #0

and potentially also messages about other unmerged entries which came
lexicographically later than whatever pathname was both a file and a
directory.  Google finds a few hits searching for those messages,
suggesting there were probably a couple people who hit this besides me.
Luckily, calling `git reset --hard` multiple times would workaround
this bug.

Since the whole purpose here is to just put the entry *temporarily* into
the index so that any associated file in the working copy can be removed,
we can just skip the DFCHECK and allow both the file and directory to
appear in the index.  The temporary simultaneous appearance of the
directory and file entries in the index will be removed by the callers
by calling unpack_trees(), which excludes these unmerged entries marked
with CE_CONFLICTED flag from the resulting index, before they attempt to
write the index anywhere.

Signed-off-by: Elijah Newren <newren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2018-07-31 12:51:11 -07:00
.github
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
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 read-cache: fix directory/file conflict handling in read_index_unmerged() 2018-07-31 12:51:11 -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 Merge branch 'dl/credential-cache-socket-in-xdg-cache' 2017-08-11 13:27:06 -07:00
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-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 mergetool: honor mergetool.$tool.trustExitCode for built-in tools 2016-11-29 10:54:03 -08:00
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-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 hash: update obsolete reference to SHA1_HEADER 2018-02-09 09:56:10 -08:00
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
read-cache.c read-cache: fix directory/file conflict handling in read_index_unmerged() 2018-07-31 12:51:11 -07: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
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 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: remove unused wildopts parameter 2017-06-23 18:27:07 -07:00
wildmatch.h
worktree.c Replace all die("BUG: ...") calls by BUG() ones 2018-05-06 19:06:13 +09:00
worktree.h worktree remove: allow it when $GIT_WORK_TREE is already gone 2018-02-12 13:13:35 -08:00
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