Git with broken hash generation to generate collisions between object IDs. Don't use this! https://undefinedbehavior.de/posts/commit-vandalism/
Go to file
SZEDER Gábor f12785a3a7 completion: improve handling quoted paths on the command line
Our git-aware path completion doesn't work when it has to complete a
word already containing quoted and/or backslash-escaped characters on
the command line.  The root cause of the issue is that completion
functions see all words on the command line verbatim, i.e. including
all backslash, single and double quote characters that the shell would
eventually remove when executing the finished command.  These
quoting/escaping characters cause different issues depending on which
path component of the word to be completed contains them:

  - The quoting/escaping is in the prefix path component(s).

    Let's suppose we have a directory called 'New Dir', containing two
    untracked files 'file.c' and 'file.o', and we have a gitignore
    rule ignoring object files.  In this case all of these:

      git add New\ Dir/<TAB>
      git add "New Dir/<TAB>
      git add 'New Dir/<TAB>

    should uniquely complete 'file.c' right away, but Bash offers both
    'file.c' and 'file.o' instead.  The reason for this behavior is
    that our completion script uses the prefix directory name like
    'git -C "New\ Dir/" ls-files ...", i.e. with the backslash inside
    double quotes.  Git then tries to enter a directory called
    'New\ Dir', which (most likely) fails because such a directory
    doesn't exists.  As a result our completion script doesn't list
    any files, leaves the COMPREPLY array empty, which in turn causes
    Bash to fall back to its simple filename completion and lists all
    files in that directory, i.e. both 'file.c' and 'file.o'.

  - The quoting/escaping is in the path component to be completed.

    Let's suppose we have two untracked files 'New File.c' and
    'New File.o', and we have a gitignore rule ignoring object files.
    In this case all of these:

      git add New\ Fi<TAB>
      git add "New Fi<TAB>
      git add 'New Fi<TAB>

    should uniquely complete 'New File.c' right away, but Bash offers
    both 'New File.c' and 'New File.o' instead.  The reason for this
    behavior is that our completion script uses this 'New\ Fi' or
    '"New Fi' etc. word to filter matching paths, and of course none
    of the potential filenames will match because of the included
    backslash or double quote.  The end result is the same as above:
    the completion script doesn't list any files, Bash falls back to
    its filename completion, which then lists the matching object file
    as well.

Add the new helper function __git_dequote() [1], which removes (most
of[2]) the quoting and escaping from the word it gets as argument.  To
minimize the overhead of calling this function, store its result in
the variable $dequoted_word, supposed to be declared local in the
caller; simply printing the result would require a command
substitution imposing the overhead of fork()ing a subshell.  Use this
function in __git_complete_index_file() to dequote the current word,
i.e. the path, to be completed, to avoid the above described
quoting-related issues, thereby fixing two of the failing quoted path
completion tests.

[1] The bash-completion project already has a dequote() function,
    which I hoped I could borrow to deal with this, but unfortunately
    it doesn't work quite well for this purpose (perhaps that's why
    even the bash-completion project only rarely uses it).  The main
    issue is that their dequote() is implemented as:

      eval printf %s "$1" 2> /dev/null

    where $1 would contain the word to be completed.  While it's a
    short and sweet one-liner, the use of 'eval' requires that $1 is a
    syntactically valid string, which is not the case when quoting the
    path like 'git add "New Dir/<TAB>'.  This causes 'eval' to fail,
    because it can't find the matching closing double quote, and the
    function returns nothing.  The result is totally broken behavior,
    as if the current word were empty, and the completion script would
    then list all files from the current directory.  This is why one
    of the quoted path completion tests specifically checks the
    completion of a path with an opening but without a corresponding
    closing double quote character.  Furthermore, the 'eval' performs
    all kinds of expansions, which may or may not be desired; I think
    it's the latter.  Finally, using this function would require a
    command substitution.

[2] Bash understands the $'string' quoting as well, which "expands to
    'string', with backslash-escaped characters replaced as specified
    by the ANSI C standard" (quoted from Bash manpage).  Since shell
    metacharacters, field separators, globbing, etc. can all be easily
    entered using standard shell escaping or quoting, this type of
    quoting comes in handly when dealing with control characters that
    are otherwise difficult both to "type" and to see on the command
    line.  Because of this difficulty I would assume that people do
    avoid pathnames with such control characters anyway, so I didn't
    bother implementing it.  This function is already way too long as
    it is.

Signed-off-by: SZEDER Gábor <szeder.dev@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2018-04-17 12:49:36 +09:00
.github Configure Git contribution guidelines for github.com 2017-06-13 08:41:47 -07:00
block-sha1
builtin Merge branch 'rs/status-with-removed-submodule' 2018-04-11 13:09:56 +09:00
ci Merge branch 'tg/split-index-fixes' into maint 2018-03-22 14:24:10 -07:00
compat mingw: abort on invalid strftime formats 2018-03-19 10:53:17 -07:00
contrib completion: improve handling quoted paths on the command line 2018-04-17 12:49:36 +09:00
Documentation Merge branch 'svn/authors-prog-2' of git://bogomips.org/git-svn 2018-04-12 08:05:28 +09:00
ewah Replace Free Software Foundation address in license notices 2017-11-09 13:21:21 +09:00
git-gui Merge branch 'js/misc-git-gui-stuff' of ../git-gui 2018-01-09 11:07:03 -08:00
gitk-git
gitweb gitweb: hard-depend on the Digest::MD5 5.8 module 2018-03-05 10:52:27 -08:00
mergetools mergetools/meld: improve compatibiilty with Meld on macOS X 2017-06-18 22:11:29 -07:00
perl git-svn: allow empty email-address using authors-prog and authors-file 2018-04-05 19:22:06 +00:00
po l10n: de.po: translate 132 new messages 2018-03-31 13:21:09 +02:00
ppc
refs Merge branch 'mr/packed-ref-store-fix' into maint 2018-03-22 14:24:10 -07:00
sha1collisiondetection@19d97bf5af sha1dc: optionally use sha1collisiondetection as a submodule 2017-07-03 10:09:34 -07:00
sha1dc Merge branch 'ab/sha1dc-maint' 2017-07-06 18:14:44 -07:00
t completion: improve handling quoted paths on the command line 2018-04-17 12:49:36 +09:00
templates fsmonitor: simplify determining the git worktree under Windows 2017-11-13 10:02:20 +09:00
vcs-svn Merge branch 'jn/vcs-svn-cleanup' into maint 2017-09-10 17:03:09 +09:00
xdiff Merge branch 'jt/diff-anchored-patience' 2017-12-19 11:33:56 -08:00
.clang-format clang-format: adjust penalty for return type line break 2018-01-24 13:42:04 -08:00
.gitattributes Fix build with core.autocrlf=true 2017-05-10 13:32:50 +09:00
.gitignore
.gitmodules sha1dc: optionally use sha1collisiondetection as a submodule 2017-07-03 10:09:34 -07:00
.mailmap mailmap: use Kaartic Sivaraam's new address 2017-11-03 23:00:07 +09:00
.travis.yml travis-ci: build Git during the 'script' phase 2018-01-08 14:07:41 -08:00
.tsan-suppressions ThreadSanitizer: add suppressions 2017-08-23 10:38:56 -07:00
abspath.c real_path: clarify return value ownership 2017-09-27 09:13:47 +09:00
aclocal.m4
advice.c Merge branch 'ls/editor-waiting-message' 2017-12-19 11:33:59 -08:00
advice.h Merge branch 'ls/editor-waiting-message' 2017-12-19 11:33:59 -08:00
alias.c Merge branch 'js/alias-case-sensitivity' 2017-07-20 16:29:59 -07:00
alloc.c
apply.c Merge branch 'bc/object-id' 2018-04-10 08:25:45 +09:00
apply.h apply: remove newfd from struct apply_state 2017-10-06 10:07:18 +09:00
archive-tar.c sha1_file: convert sha1_object_info* to object_id 2018-03-14 09:23:49 -07:00
archive-zip.c sha1_file: convert sha1_object_info* to object_id 2018-03-14 09:23:49 -07:00
archive.c sha1_file: convert read_sha1_file to struct object_id 2018-03-14 09:23:50 -07:00
archive.h archive: convert sha1_file_to_archive to struct object_id 2018-03-14 09:23:48 -07:00
argv-array.c
argv-array.h
attr.c hashmap: add API to disable item counting when threaded 2017-09-07 09:42:02 +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 Merge branch 'ma/bisect-leakfix' 2017-11-15 12:14:28 +09:00
blame.c sha1_file: convert read_sha1_file to struct object_id 2018-03-14 09:23:50 -07:00
blame.h blame: move entry prepend to libgit 2017-05-25 13:08:23 +09:00
blob.c Convert lookup_blob to struct object_id 2017-05-08 15:12:57 +09:00
blob.h Convert lookup_blob to struct object_id 2017-05-08 15:12:57 +09:00
branch.c Merge branch 'ks/branch-cleanup' 2017-12-27 11:16:25 -08:00
branch.h Merge branch 'ks/branch-cleanup' 2017-12-27 11:16:25 -08:00
builtin.h git.c: provide setup_auto_pager() 2017-08-03 11:08:10 -07:00
bulk-checkin.c Merge branch 'sb/packfiles-in-repository' 2018-04-11 13:09:55 +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 sha1_file: convert read_sha1_file to struct object_id 2018-03-14 09:23:50 -07:00
bundle.h bundle: convert to struct object_id 2017-05-02 10:46:41 +09:00
cache-tree.c Merge branch 'tg/split-index-fixes' into maint 2018-03-22 14:24:10 -07: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 'sb/object-store' 2018-04-11 13:09:55 +09:00
check_bindir
check-builtins.sh
check-racy.c
checkout.c checkout: factor out functions to new lib file 2017-11-27 09:48:06 +09:00
checkout.h checkout: factor out functions to new lib file 2017-11-27 09:48:06 +09:00
color.c color.h: document and modernize header 2018-02-13 10:17:12 -08:00
color.h color.h: document and modernize header 2018-02-13 10:17:12 -08:00
column.c column: do not include pager.c 2017-10-24 10:19:06 +09:00
column.h
combine-diff.c sha1_file: convert read_sha1_file to struct object_id 2018-03-14 09:23:50 -07:00
command-list.txt
commit-slab.h commit-slab.h: avoid -Wsign-compare warnings 2017-09-22 13:00:36 +09:00
commit.c sha1_file: convert read_sha1_file to struct object_id 2018-03-14 09:23:50 -07:00
commit.h Merge branch 'rs/lose-leak-pending' into maint 2018-02-15 15:18:11 -08:00
common-main.c repository: initialize the_repository in main() 2018-03-05 11:14:03 -08:00
config.c sha1_file: convert read_sha1_file to struct object_id 2018-03-14 09:23:50 -07:00
config.h Merge branch 'hm/config-parse-expiry-date' 2017-12-06 09:23:37 -08:00
config.mak.in
config.mak.uname config.mak.uname: remove SPARSE_FLAGS setting for cygwin 2018-02-12 12:19:18 -08:00
configure.ac Makefile: make USE_LIBPCRE=YesPlease mean v2, not v1 2018-03-14 15:27:50 -07:00
connect.c connect: correct style of C-style comment 2017-11-21 14:01:03 +09:00
connect.h
connected.c Merge branch 'jh/partial-clone' 2018-02-13 13:39:04 -08:00
connected.h Convert check_connected to use struct object_id 2017-10-16 11:05:50 +09:00
convert.c convert: convert to struct object_id 2018-03-14 09:23:50 -07:00
convert.h convert: convert to struct object_id 2018-03-14 09:23:50 -07:00
copy.c
COPYING
credential-cache--daemon.c tempfile: auto-allocate tempfiles on heap 2017-09-06 17:19:54 +09:00
credential-cache.c Merge branch 'dl/credential-cache-socket-in-xdg-cache' into maint 2017-08-23 14:33:45 -07:00
credential-store.c path.c: and an option to call real_path() in expand_user_path() 2017-04-14 23:51:38 -07:00
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: abstract uses of SHA-1 2018-02-02 11:28:41 -08:00
csum-file.h csum-file: abstract uses of SHA-1 2018-02-02 11:28:41 -08:00
ctype.c kwset: use unsigned char to store values with high-bit set 2015-03-02 12:32:24 -08:00
daemon.c Merge branch 'lw/daemon-log-destination' 2018-02-21 12:45:04 -08:00
date.c Merge branch 'ab/strbuf-addftime-tzname-boolify' 2017-07-06 18:14:47 -07:00
decorate.c decorate: clean up and document API 2017-12-08 09:16:27 -08:00
decorate.h decorate: clean up and document API 2017-12-08 09:16:27 -08:00
delta.h
diff-delta.c Merge branch 'mk/diff-delta-avoid-large-offset' 2017-09-28 14:47:56 +09:00
diff-lib.c Merge branch 'bw/c-plus-plus' 2018-03-06 14:54:07 -08:00
diff-no-index.c diff: make struct diff_flags members lowercase 2017-11-01 11:51:40 +09:00
diff.c Merge branch 'bc/object-id' 2018-04-10 08:25:45 +09:00
diff.h Merge branch 'nd/diff-stat-with-summary' 2018-03-14 12:01:02 -07:00
diffcore-break.c
diffcore-delta.c diffcore-delta: rename 'new' variables 2018-02-22 10:08:05 -08:00
diffcore-order.c wildmatch: remove unused wildopts parameter 2017-06-23 18:27:07 -07:00
diffcore-pickaxe.c diff: properly error out when combining multiple pickaxe options 2018-01-04 15:02:40 -08:00
diffcore-rename.c Merge branch 'po/object-id' 2018-02-15 14:55:43 -08:00
diffcore.h diff: convert fill_filespec to struct object_id 2017-06-02 09:36:07 +09:00
dir-iterator.c
dir-iterator.h
dir.c sha1_file: convert read_sha1_file to struct object_id 2018-03-14 09:23:50 -07:00
dir.h Merge branch 'nd/fix-untracked-cache-invalidation' 2018-02-27 10:33:50 -08:00
editor.c launch_editor(): indicate that Git waits for user input 2017-12-07 10:10:19 -08:00
entry.c convert: convert to struct object_id 2018-03-14 09:23:50 -07:00
environment.c Merge branch 'sb/object-store' 2018-04-11 13:09:55 +09:00
exec_cmd.c git_extract_argv0_path: do nothing without RUNTIME_PREFIX 2017-09-07 09:41:14 +09:00
exec_cmd.h
fast-import.c Merge branch 'sb/packfiles-in-repository' 2018-04-11 13:09:55 +09:00
fetch-object.c unpack-trees: batch fetching of missing blobs 2017-12-08 09:58:51 -08:00
fetch-object.h unpack-trees: batch fetching of missing blobs 2017-12-08 09:58:51 -08:00
fetch-pack.c Merge branch 'sb/packfiles-in-repository' 2018-04-11 13:09:55 +09:00
fetch-pack.h fetch-pack, index-pack, transport: partial clone 2017-12-08 09:58:51 -08:00
fmt-merge-msg.h
fsck.c sha1_file: convert read_sha1_file to struct object_id 2018-03-14 09:23:50 -07:00
fsck.h Rename sha1_array to oid_array 2017-03-31 08:33:56 -07:00
fsmonitor.c dir.c: ignore paths containing .git when invalidating untracked cache 2018-02-07 12:27:02 -08:00
fsmonitor.h dir.c: ignore paths containing .git when invalidating untracked cache 2018-02-07 12:27:02 -08:00
generate-cmdlist.sh generate-cmdlist: avoid non-deterministic output 2017-11-22 14:56:30 +09:00
gettext.c
gettext.h
git-add--interactive.perl Merge branch 'pw/add-p-single' 2018-04-02 10:10:55 -07:00
git-archimport.perl archimport: use safe_pipe_capture for user input 2017-09-12 11:08:15 +09:00
git-bisect.sh Merge branch 'sb/bisect-run-empty' 2017-11-15 12:14:36 +09:00
git-compat-util.h wrapper: rename 'template' variables 2018-02-22 10:08:05 -08: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 cvsserver: use safe_pipe_capture for constant commands as well 2017-09-11 14:52:29 +09:00
git-difftool--helper.sh
git-filter-branch.sh Merge branch 'yk/filter-branch-non-committish-refs' 2018-04-10 16:28:23 +09:00
git-instaweb.sh
git-merge-octopus.sh Merge branch 'ma/up-to-date' 2017-09-10 17:08:22 +09:00
git-merge-one-file.sh scripts: use "git foo" not "git-foo" 2017-08-07 12:04:45 -07:00
git-merge-resolve.sh scripts: use "git foo" not "git-foo" 2017-08-07 12:04:45 -07:00
git-mergetool--lib.sh
git-mergetool.sh
git-p4.py git-p4: update multiple shelved change lists 2017-12-22 13:30:52 -08:00
git-parse-remote.sh
git-quiltimport.sh
git-rebase--am.sh rebase: update invocation of rebase dot-sourced scripts 2018-03-23 15:08:49 -07:00
git-rebase--interactive.sh rebase: remove merges_option and a blank line 2018-03-23 15:28:24 -07:00
git-rebase--merge.sh rebase: update invocation of rebase dot-sourced scripts 2018-03-23 15:08:49 -07:00
git-rebase.sh rebase: add and use git_rebase__interactive__preserve_merges 2018-03-23 15:28:06 -07:00
git-remote-testgit.sh
git-request-pull.sh request-pull: capitalise "Git" to make it a proper noun 2017-10-03 13:11:57 +09:00
git-send-email.perl Merge branch 'ab/perl-fixes' 2018-03-15 15:00:46 -07:00
git-sh-i18n.sh git-sh-i18n: check GETTEXT_POISON before USE_GETTEXT_SCHEME 2018-02-08 10:09:45 -08:00
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 submodule: port submodule subcommand 'deinit' from shell to C 2018-01-16 11:29:50 -08:00
git-svn.perl git-svn: search --authors-prog in PATH too 2018-04-05 06:55:02 +00:00
GIT-VERSION-GEN The first batch for 2.18 cycle 2018-04-10 08:31:17 +09:00
git-web--browse.sh
git.c Merge branch 'nd/parseopt-completion-more' 2018-04-10 16:28:22 +09:00
git.rc mingw: include the full version information in the resources 2017-11-01 13:43:52 +09:00
gpg-interface.c tempfile: auto-allocate tempfiles on heap 2017-09-06 17:19:54 +09:00
gpg-interface.h
graph.c graph: use strbuf_addchars() to add spaces 2017-10-02 13:14:07 +09:00
graph.h
grep.c sha1_file: convert read_sha1_file to struct object_id 2018-03-14 09:23:50 -07:00
grep.h Merge branch 'ab/pcre-v2' into maint 2017-11-21 14:05:30 +09:00
hash.h hash: update obsolete reference to SHA1_HEADER 2018-02-09 09:56:10 -08:00
hashmap.c hashmap: add API to disable item counting when threaded 2017-09-07 09:42:02 +09:00
hashmap.h Merge branch 'rb/hashmap-h-compilation-fix' into maint 2018-03-22 14:24:15 -07:00
help.c version --build-options: report commit, too, if possible 2017-12-14 22:53:04 -08:00
help.h
hex.c notes: move hex_to_bytes() to hex.c and export it 2017-11-01 10:35:35 +09:00
http-backend.c packfile: keep prepare_packed_git() private 2018-03-26 10:07:43 -07:00
http-fetch.c config: don't include config.h by default 2017-06-15 12:56:22 -07:00
http-push.c Merge branch 'sb/object-store' 2018-04-11 13:09:55 +09:00
http-walker.c Merge branch 'sb/object-store' 2018-04-11 13:09:55 +09:00
http.c Merge branch 'lv/tls-1.3' 2018-04-11 13:09:57 +09:00
http.h http.postbuffer: allow full range of ssize_t values 2017-04-13 18:24:32 -07:00
ident.c Merge branch 'bw/config-h' 2017-06-24 14:28:41 -07:00
imap-send.c imap-send: rename 'new' variables 2018-02-22 10:08:05 -08:00
INSTALL RelNotes: add details on Perl module changes 2018-03-16 16:07:37 -07:00
iterator.h
khash.h
kwset.c Replace Free Software Foundation address in license notices 2017-11-09 13:21:21 +09:00
kwset.h Replace Free Software Foundation address in license notices 2017-11-09 13:21:21 +09:00
levenshtein.c
levenshtein.h
LGPL-2.1
line-log.c tree-walk: convert tree entry functions to object_id 2018-03-14 09:23:50 -07:00
line-log.h ALLOC_GROW: avoid -Wsign-compare warnings 2017-09-22 13:21:11 +09:00
line-range.c
line-range.h
list-objects-filter-options.c fetch: inherit filter-spec from partial clone 2017-12-08 09:58:52 -08:00
list-objects-filter-options.h fetch: inherit filter-spec from partial clone 2017-12-08 09:58:52 -08:00
list-objects-filter.c sha1_file: convert sha1_object_info* to object_id 2018-03-14 09:23:49 -07:00
list-objects-filter.h list-objects: filter objects in traverse_commit_list 2017-11-22 14:11:57 +09:00
list-objects.c Merge branch 'jh/fsck-promisors' 2018-02-13 13:39:03 -08:00
list-objects.h list-objects: filter objects in traverse_commit_list 2017-11-22 14:11:57 +09:00
list.h tempfile: use list.h for linked list 2017-09-06 17:19:54 +09:00
ll-merge.c avoid "write_in_full(fd, buf, len) != len" pattern 2017-09-14 15:17:59 +09:00
ll-merge.h
lockfile.c tempfile: auto-allocate tempfiles on heap 2017-09-06 17:19:54 +09:00
lockfile.h lockfile: fix documentation on close_lock_file_gently() 2017-10-06 10:07:17 +09:00
log-tree.c Convert find_unique_abbrev* to struct object_id 2018-03-14 09:23:48 -07:00
log-tree.h log: add option to choose which refs to decorate 2017-11-22 13:18:59 +09:00
mailinfo.c Merge branch 'jc/mailinfo-cleanup-fix' into maint 2018-03-22 14:24:16 -07: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 'nd/combined-test-helper' 2018-04-11 13:09:56 +09:00
match-trees.c sha1_file: convert read_sha1_file to struct object_id 2018-03-14 09:23:50 -07: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 Revert "Merge branch 'en/rename-directory-detection'" 2018-04-11 18:07:11 +09:00
merge-recursive.h Revert "Merge branch 'en/rename-directory-detection'" 2018-04-11 18:07:11 +09:00
merge.c merge: always roll back lock in checkout_fast_forward() 2018-02-28 11:15:51 -08: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-cache: convert to struct object_id 2017-05-08 15:12:57 +09:00
notes-merge.c sha1_file: convert read_sha1_file to struct object_id 2018-03-14 09:23:50 -07:00
notes-merge.h notes-merge: convert notes_merge* to struct object_id 2017-06-05 11:23:58 +09:00
notes-utils.c notes: convert write_notes_tree to object_id 2018-01-30 10:42:36 -08:00
notes-utils.h commit: convert commit_tree* to object_id 2018-01-30 10:42:36 -08:00
notes.c sha1_file: convert read_sha1_file to struct object_id 2018-03-14 09:23:50 -07:00
notes.h notes: convert write_notes_tree to object_id 2018-01-30 10:42:36 -08:00
object-store.h sha1_file: allow map_sha1_file to handle arbitrary repositories 2018-03-26 10:05:55 -07:00
object.c Merge branch 'sb/object-store' 2018-04-11 13:09:55 +09:00
object.h Merge branch 'nd/object-allocation-comments' 2018-03-14 12:01:06 -07:00
oidmap.c oidmap: ensure map is initialized 2017-12-27 12:28:06 -08:00
oidmap.h oidmap: add oidmap iterator methods 2017-11-22 14:11:56 +09:00
oidset.c oidset: add iterator methods to oidset 2017-11-22 14:11:56 +09:00
oidset.h oidset: don't return value from oidset_init 2018-01-08 15:24:35 -08:00
pack-bitmap-write.c sha1_file: convert sha1_object_info* to object_id 2018-03-14 09:23:49 -07:00
pack-bitmap.c packfile: keep prepare_packed_git() private 2018-03-26 10:07:43 -07:00
pack-bitmap.h pack-bitmap: convert traverse_bitmap_commit_list to object_id 2017-10-16 11:05:51 +09:00
pack-check.c Merge branch 'sb/object-store' 2018-04-11 13:09:55 +09:00
pack-objects.c pack: convert struct pack_idx_entry to struct object_id 2017-05-08 15:12:57 +09:00
pack-objects.h
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: rename sha1file to hashfile 2018-02-02 11:28:41 -08:00
pack.h csum-file: rename sha1file to hashfile 2018-02-02 11:28:41 -08:00
packfile.c Merge branch 'sb/packfiles-in-repository' 2018-04-11 13:09:55 +09:00
packfile.h Merge branch 'sb/packfiles-in-repository' 2018-04-11 13:09:55 +09:00
pager.c Merge branch 'ma/parse-maybe-bool' 2017-08-22 10:29:03 -07:00
parse-options-cb.c Merge branch 'bc/object-id' 2017-05-29 12:34:43 +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 diff: make struct diff_flags members lowercase 2017-11-01 11:51:40 +09:00
patch-ids.h patch-ids: convert to struct object_id 2017-06-02 09:36:07 +09:00
path.c repository: introduce raw object store field 2018-03-23 11:06:01 -07:00
path.h path: document path functions 2017-12-13 11:14:25 -08:00
pathspec.c Merge branch 'ex/deprecate-empty-pathspec-as-match-all' 2017-11-06 13:11:29 +09:00
pathspec.h Merge branch 'bw/pathspec-match-submodule-boundary' 2017-12-19 11:33:56 -08:00
pkt-line.c Merge branch 'bw/protocol-v1' 2017-12-06 09:23:44 -08:00
pkt-line.h pkt-line: add packet_write function 2017-10-17 10:51:29 +09:00
preload-index.c trace: measure where the time is spent in the index-heavy operations 2018-02-02 11:20:16 -08:00
pretty.c strbuf: convert strbuf_add_unique_abbrev to use struct object_id 2018-03-14 09:23:48 -07:00
pretty.h format: create docs for pretty.h 2017-12-12 10:41:15 -08:00
prio-queue.c *.[ch] refactoring: make use of the FREE_AND_NULL() macro 2017-06-16 12:44:09 -07:00
prio-queue.h
progress.c Merge branch 'en/rename-progress' 2017-12-19 11:33:55 -08:00
progress.h progress: fix progress meters when dealing with lots of work 2017-11-15 13:11:25 +09:00
prompt.c config: don't include config.h by default 2017-06-15 12:56:22 -07:00
prompt.h
protocol.c protocol: introduce protocol extension mechanisms 2017-10-17 10:51:29 +09:00
protocol.h protocol: introduce protocol extension mechanisms 2017-10-17 10:51:29 +09:00
quote.c Merge branch 'jk/sq-dequote-on-bogus-input' 2018-02-27 10:34:02 -08:00
quote.h trace: avoid unnecessary quoting 2018-01-16 12:16:54 -08:00
reachable.c Merge branch 'sb/object-store' 2018-04-11 13:09:55 +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-04-10 08:25:45 +09:00
README.md
ref-filter.c sha1_file: convert read_sha1_file to struct object_id 2018-03-14 09:23:50 -07:00
ref-filter.h ref-filter: consult want_color() before emitting colors 2017-07-13 12:42:51 -07:00
reflog-walk.c refs: convert dwim_log to struct object_id 2017-10-16 11:05:51 +09:00
reflog-walk.h reflog-walk: apply --since/--until to reflog dates 2017-07-09 10:00:48 -07:00
refs.c sha1_file: convert sha1_object_info* to object_id 2018-03-14 09:23:49 -07:00
refs.h log: add option to choose which refs to decorate 2017-11-22 13:18:59 +09:00
RelNotes The first batch for 2.18 cycle 2018-04-10 08:31:17 +09:00
remote-curl.c Merge branch 'jk/push-options-via-transport-fix' 2018-02-28 13:37:58 -08:00
remote-testsvn.c sha1_file: convert read_sha1_file to struct object_id 2018-03-14 09:23:50 -07:00
remote.c sha1_file: convert sha1_object_info* to object_id 2018-03-14 09:23:49 -07:00
remote.h Merge branch 'jh/status-no-ahead-behind' 2018-03-08 12:36:24 -08:00
replace_object.c Convert lookup_replace_object to struct object_id 2018-03-14 09:23:50 -07:00
repository.c repository: introduce raw object store field 2018-03-23 11:06:01 -07:00
repository.h repository: introduce raw object store field 2018-03-23 11:06:01 -07:00
rerere.c Merge branch 'bc/object-id' 2018-04-10 08:25:45 +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 resolve-undo: convert struct resolve_undo_info to object_id 2018-03-14 09:23:47 -07: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 'jk/cached-commit-buffer' into maint 2018-03-22 14:24:25 -07:00
revision.h Merge branch 'jk/cached-commit-buffer' 2018-03-06 14:54:05 -08:00
run-command.c run-command: use strbuf_addstr() for adding a string to a strbuf 2018-03-25 09:49:15 -07:00
run-command.h run-command: expose is_executable function 2017-04-25 18:45:29 -07:00
send-pack.c send-pack: convert remaining functions to struct object_id 2018-03-14 09:23:48 -07:00
send-pack.h Rename sha1_array to oid_array 2017-03-31 08:33:56 -07:00
sequencer.c Merge branch 'bc/object-id' 2018-04-10 08:25:45 +09:00
sequencer.h Merge branch 'pw/sequencer-in-process-commit' 2018-02-13 13:39:15 -08:00
server-info.c packfile: keep prepare_packed_git() private 2018-03-26 10:07:43 -07:00
setup.c Merge branch 'nd/remove-ignore-env-field' 2018-04-10 16:28:20 +09:00
sh-i18n--envsubst.c Replace Free Software Foundation address in license notices 2017-11-09 13:21:21 +09:00
sha1_file.c Merge branch 'sb/packfiles-in-repository' 2018-04-11 13:09:55 +09:00
sha1_name.c Merge branch 'sb/packfiles-in-repository' 2018-04-11 13:09:55 +09:00
sha1-array.c coccinelle: make use of the "type" FREE_AND_NULL() rule 2017-06-16 12:44:03 -07:00
sha1-array.h Rename sha1_array to oid_array 2017-03-31 08:33:56 -07:00
sha1-lookup.c packfile: refactor hash search with fanout table 2018-02-15 13:08:55 -08:00
sha1-lookup.h packfile: refactor hash search with fanout table 2018-02-15 13:08:55 -08:00
sha1dc_git.c sha1dc: allow building with the external sha1dc library 2017-08-16 14:44:25 -07:00
sha1dc_git.h sha1dc_git.h: re-arrange an ifdef chain for a subsequent change 2017-12-08 15:01:01 -08:00
shallow.c Merge branch 'ma/leakplugs' 2017-09-29 11:23:43 +09:00
shell.c shell: drop git-cvsserver support by default 2017-09-12 11:05:58 +09:00
shortlog.h
show-index.c
sideband.c refactor "dumb" terminal determination 2017-12-04 09:38:30 -08:00
sideband.h
sigchain.c sigchain: add command to pop all common signals 2015-12-16 12:06:08 -08:00
sigchain.h
split-index.c Merge branch 'bw/c-plus-plus' 2018-03-06 14:54:07 -08:00
split-index.h split-index: rename 'new' variables 2018-02-22 10:08:05 -08:00
strbuf.c Revert "Merge branch 'en/rename-directory-detection'" 2018-04-11 18:07:11 +09:00
strbuf.h Revert "Merge branch 'en/rename-directory-detection'" 2018-04-11 18:07:11 +09:00
streaming.c Merge branch 'sb/object-store' 2018-04-11 13:09:55 +09:00
streaming.h streaming: convert open_istream to use struct object_id 2018-03-14 09:23:49 -07:00
string-list.c cleanup: fix possible overflow errors in binary search 2017-10-10 08:57:24 +09:00
string-list.h string-list.h: move documentation from Documentation/api/ into header 2017-09-27 09:14:34 +09:00
sub-process.c Merge branch 'cc/subprocess-handshake-missing-capabilities' into maint 2017-10-18 14:19:10 +09:00
sub-process.h Docs: split out long-running subprocess handshake 2018-01-25 11:24:32 -08:00
submodule-config.c sha1_file: convert read_sha1_file to struct object_id 2018-03-14 09:23:50 -07:00
submodule-config.h implement fetching of moved submodules 2017-10-17 10:27:18 +09:00
submodule.c Merge branch 'sb/object-store' 2018-04-11 13:09:55 +09:00
submodule.h submodule: rename 'new' variables 2018-02-22 10:08:05 -08:00
symlinks.c
tag.c sha1_file: convert read_sha1_file to struct object_id 2018-03-14 09:23:50 -07:00
tag.h tag: convert gpg_verify_tag to use struct object_id 2017-07-13 12:02:48 -07:00
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 object-store: migrate alternates struct and functions from cache.h 2018-03-23 11:06:01 -07:00
tmp-objdir.h
trace.c trace.c: move strbuf_release() out of print_trace_line() 2018-01-16 12:16:54 -08:00
trace.h trace: improve performance while category is disabled 2017-12-06 09:43:02 -08:00
trailer.c trailer: rename 'template' variables 2018-02-22 10:08:05 -08:00
trailer.h Merge branch 'jk/trailers-parse' 2017-08-26 22:55:04 -07:00
transport-helper.c Merge branch 'jh/partial-clone' 2018-02-13 13:39:04 -08:00
transport-internal.h transport: make transport vtable more private 2017-12-14 14:28:04 -08:00
transport.c Merge branch 'sb/object-store' 2018-04-11 13:09:55 +09:00
transport.h Merge branch 'jh/partial-clone' 2018-02-13 13:39:04 -08:00
tree-diff.c diff: make struct diff_flags members lowercase 2017-11-01 11:51:40 +09:00
tree-walk.c sha1_file: convert read_sha1_file to struct object_id 2018-03-14 09:23:50 -07:00
tree-walk.h tree-walk: convert tree entry functions to object_id 2018-03-14 09:23:50 -07:00
tree.c sha1_file: convert read_sha1_file to struct object_id 2018-03-14 09:23:50 -07:00
tree.h tree: convert read_tree_recursive to struct object_id 2018-03-14 09:23:47 -07:00
unicode_width.h unicode: update the width tables to Unicode 10 2017-07-07 10:33:30 -07:00
unimplemented.sh
unix-socket.c Merge branch 'rs/strbuf-getcwd' 2014-09-02 13:28:44 -07:00
unix-socket.h
unpack-trees.c Revert "Merge branch 'en/rename-directory-detection'" 2018-04-11 18:07:11 +09:00
unpack-trees.h Revert "Merge branch 'en/rename-directory-detection'" 2018-04-11 18:07:11 +09:00
upload-pack.c Merge branch 'jh/partial-clone' 2018-03-29 15:39:59 -07:00
url.c
url.h
urlmatch.c urlmatch: use hex2chr() in append_normalized_escapes() 2017-07-09 09:43:01 -07:00
urlmatch.h
usage.c add UNLEAK annotation for reducing leak false positives 2017-09-08 15:43:17 +09:00
userdiff.c Merge branch 'tl/userdiff-csharp-async' 2018-03-15 15:00:47 -07:00
userdiff.h
utf8.c cleanup: fix possible overflow errors in binary search 2017-10-10 08:57:24 +09:00
utf8.h
varint.c
varint.h
version.c version --build-options: report commit, too, if possible 2017-12-14 22:53:04 -08:00
version.h version --build-options: report commit, too, if possible 2017-12-14 22:53:04 -08:00
versioncmp.c config: don't include config.h by default 2017-06-15 12:56:22 -07:00
walker.c object: rename function 'typename' to 'type_name' 2018-02-14 13:10:05 -08:00
walker.h
wildmatch.c wildmatch: remove unused wildopts parameter 2017-06-23 18:27:07 -07:00
wildmatch.h wildmatch: remove unused wildopts parameter 2017-06-23 18:27:07 -07:00
worktree.c worktree remove: allow it when $GIT_WORK_TREE is already gone 2018-02-12 13:13:35 -08: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 Makefile: replace perl/Makefile.PL with simple make rules 2017-12-11 15:28:10 -08:00
wrapper.c wrapper: rename 'template' variables 2018-02-22 10:08:05 -08:00
write_or_die.c
ws.c
wt-status.c Convert find_unique_abbrev* to struct object_id 2018-03-14 09:23:48 -07:00
wt-status.h wt-status: convert struct wt_status_state to object_id 2018-03-14 09:23:48 -07: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 xdiff-interface: export comparing and hashing strings 2017-10-26 11:23:22 +09:00
zlib.c

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.

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