Go to file
SZEDER Gábor 94408dc71c completion: reduce overhead of clearing cached --options
To get the names of all '$__git_builtin_*' variables caching --options
of builtin commands in order to unset them, 8b0eaa41f2 (completion:
clear cached --options when sourcing the completion script,
2018-03-22) runs a 'set |sed s///' pipeline.  This works both in Bash
and in ZSH, but has a higher than necessary overhead with the extra
processes.

In Bash we can do better: run the 'compgen -v __gitcomp_builtin_'
builtin command, which lists the same variables, but without a
pipeline and 'sed' it can do so with lower overhead.
ZSH will still continue to run that pipeline.

This change also happens to work around an issue in the default Bash
version shipped in macOS (3.2.57), reported by users of the Powerline
shell prompt, which was triggered by the same commit 8b0eaa41f2 as
well.  Powerline uses several Unicode Private Use Area code points to
represent some of its pretty text UI elements (arrows and what not),
and these are stored in the $PS1 variable.  Apparently the 'set'
builtin of said Bash version on macOS has issues with these code
points, and produces garbled output where Powerline's special symbols
should be in the $PS1 variable.  This, in turn, triggers the following
error message in the downstream 'sed' process:

  sed: RE error: illegal byte sequence

Other Bash versions, notably 4.4.19 on macOS via homebrew (i.e. a
newer version on the same platform) and 3.2.25 on CentOS (i.e. a
slightly earlier version, though on a different platform) are not
affected.  ZSH in macOS (the versions shipped by default or installed
via homebrew) or on other platforms isn't affected either.

With this patch neither the 'set' builtin is invoked to print garbage,
nor 'sed' to choke on it.

Issue-on-macOS-reported-by: Stephon Harris <theonestep4@gmail.com>
Issue-on-macOS-explained-by: Matthew Coleman <matt@1eanda.com>
Signed-off-by: SZEDER Gábor <szeder.dev@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2018-04-18 08:43:31 +09:00
.github
…
Documentation Merge branch 'jh/partial-clone' 2018-03-29 15:39:59 -07:00
block-sha1
…
builtin Merge branch 'pc/submodule-helper' 2018-03-28 11:04:25 -07: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: reduce overhead of clearing cached --options 2018-04-18 08:43:31 +09:00
ewah
…
git-gui
…
gitk-git
…
gitweb gitweb: hard-depend on the Digest::MD5 5.8 module 2018-03-05 10:52:27 -08:00
mergetools
…
perl Merge branch 'ab/perl-fixes' 2018-03-15 15:00:46 -07: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
…
t Merge branch 'nd/parseopt-completion' 2018-03-28 11:04:24 -07:00
templates
…
vcs-svn
…
xdiff
…
.clang-format
…
.gitattributes
…
.gitignore
…
.gitmodules
…
.mailmap
…
.travis.yml
…
.tsan-suppressions
…
COPYING
…
GIT-VERSION-GEN Git 2.17 2018-04-02 10:13:35 -07:00
INSTALL RelNotes: add details on Perl module changes 2018-03-16 16:07:37 -07:00
LGPL-2.1
…
Makefile Merge branch 'ab/perl-fixes' 2018-03-15 15:00:46 -07:00
README.md
…
RelNotes Git 2.16.3 2018-03-22 14:24:45 -07:00
abspath.c
…
aclocal.m4
…
advice.c
…
advice.h
…
alias.c
…
alloc.c
…
apply.c Merge branch 'nd/parseopt-completion' 2018-03-14 12:01:07 -07:00
apply.h
…
archive-tar.c
…
archive-zip.c
…
archive.c
…
archive.h
…
argv-array.c
…
argv-array.h
…
attr.c
…
attr.h
…
base85.c
…
bisect.c Merge branch 'ys/bisect-object-id-missing-conversion-fix' into maint 2018-02-27 10:43:55 -08:00
bisect.h
…
blame.c Merge branch 'bw/c-plus-plus' 2018-03-06 14:54:07 -08:00
blame.h
…
blob.c
…
blob.h
…
branch.c
…
branch.h
…
builtin.h
…
bulk-checkin.c Merge branch 'bw/c-plus-plus' 2018-03-06 14:54:07 -08:00
bulk-checkin.h
…
bundle.c Merge branch 'rs/lose-leak-pending' into maint 2018-02-15 15:18:11 -08:00
bundle.h
…
cache-tree.c Merge branch 'tg/split-index-fixes' into maint 2018-03-22 14:24:10 -07:00
cache-tree.h
…
cache.h Merge branch 'tg/split-index-fixes' into maint 2018-03-22 14:24:10 -07:00
check-builtins.sh
…
check-racy.c
…
check_bindir
…
checkout.c
…
checkout.h
…
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.h
…
combine-diff.c Merge branch 'bw/c-plus-plus' 2018-03-06 14:54:07 -08:00
command-list.txt
…
commit-slab.h
…
commit.c Merge branch 'bw/c-plus-plus' 2018-03-06 14:54:07 -08:00
commit.h Merge branch 'rs/lose-leak-pending' into maint 2018-02-15 15:18:11 -08:00
common-main.c
…
config.c Merge branch 'tb/crlf-conv-flags' 2018-02-13 13:39:08 -08:00
config.h
…
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
…
connect.c
…
connect.h
…
connected.c Merge branch 'jh/partial-clone' 2018-02-13 13:39:04 -08:00
connected.h
…
convert.c Merge branch 'po/object-id' 2018-02-15 14:55:43 -08:00
convert.h
…
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-02-21 12:45:04 -08:00
date.c
…
decorate.c
…
decorate.h
…
delta.h
…
diff-delta.c
…
diff-lib.c Merge branch 'bw/c-plus-plus' 2018-03-06 14:54:07 -08:00
diff-no-index.c
…
diff.c Merge branch 'nd/diff-flush-before-warning' into maint 2018-03-22 14:24:09 -07: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
…
diffcore-pickaxe.c
…
diffcore-rename.c Merge branch 'po/object-id' 2018-02-15 14:55:43 -08:00
diffcore.h
…
dir-iterator.c
…
dir-iterator.h
…
dir.c Merge branch 'bp/untracked-cache-noflush' 2018-03-08 12:36:30 -08:00
dir.h Merge branch 'nd/fix-untracked-cache-invalidation' 2018-02-27 10:33:50 -08:00
editor.c
…
entry.c entry: rename 'new' variables 2018-02-22 10:08:05 -08:00
environment.c Merge branch 'bw/c-plus-plus' 2018-03-06 14:54:07 -08:00
exec_cmd.c
…
exec_cmd.h
…
fast-import.c Merge branch 'rj/warning-uninitialized-fix' 2018-03-21 11:30:15 -07:00
fetch-object.c
…
fetch-object.h
…
fetch-pack.c fetch-pack: do not check links for partial fetch 2018-03-15 10:16:27 -07:00
fetch-pack.h
…
fmt-merge-msg.h
…
fsck.c object: rename function 'typename' to 'type_name' 2018-02-14 13:10:05 -08:00
fsck.h
…
fsmonitor.c
…
fsmonitor.h
…
generate-cmdlist.sh
…
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
…
git-bisect.sh
…
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
…
git-difftool--helper.sh
…
git-filter-branch.sh filter-branch: use printf instead of echo -e 2018-03-19 10:59:28 -07:00
git-instaweb.sh
…
git-merge-octopus.sh
…
git-merge-one-file.sh
…
git-merge-resolve.sh
…
git-mergetool--lib.sh
…
git-mergetool.sh
…
git-p4.py
…
git-parse-remote.sh
…
git-quiltimport.sh
…
git-rebase--am.sh Merge branch 'nd/rebase-show-current-patch' 2018-03-06 14:54:02 -08:00
git-rebase--interactive.sh Merge branch 'nd/rebase-show-current-patch' 2018-03-06 14:54:02 -08:00
git-rebase--merge.sh Merge branch 'nd/rebase-show-current-patch' 2018-03-06 14:54:02 -08:00
git-rebase.sh Merge branch 'nd/rebase-show-current-patch' 2018-03-06 14:54:02 -08:00
git-remote-testgit.sh
…
git-request-pull.sh
…
git-send-email.perl Merge branch 'ab/perl-fixes' 2018-03-15 15:00:46 -07:00
git-sh-i18n.sh
…
git-sh-setup.sh
…
git-stash.sh Merge branch 'tg/stash-with-pathspec-fix' into maint 2018-02-15 15:18:13 -08:00
git-submodule.sh
…
git-svn.perl Merge branch 'ew/svn-branch-segfault-fix' into maint 2018-03-22 14:24:11 -07:00
git-web--browse.sh
…
git.c Merge branch 'ma/config-page-only-in-list-mode' 2018-03-21 11:30:09 -07:00
git.rc
…
gpg-interface.c
…
gpg-interface.h
…
graph.c
…
graph.h
…
grep.c color.h: document and modernize header 2018-02-13 10:17:12 -08: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
…
help.h
…
hex.c
…
http-backend.c
…
http-fetch.c
…
http-push.c Merge branch 'bw/c-plus-plus' 2018-03-06 14:54:07 -08:00
http-walker.c
…
http.c Merge branch 'rj/http-code-cleanup' 2018-03-21 11:30:12 -07:00
http.h
…
ident.c
…
imap-send.c imap-send: rename 'new' variables 2018-02-22 10:08:05 -08:00
iterator.h
…
khash.h
…
kwset.c
…
kwset.h
…
levenshtein.c
…
levenshtein.h
…
line-log.c line-log: rename 'new' variables 2018-02-22 10:08:05 -08:00
line-log.h
…
line-range.c
…
line-range.h
…
list-objects-filter-options.c
…
list-objects-filter-options.h
…
list-objects-filter.c
…
list-objects-filter.h
…
list-objects.c Merge branch 'jh/fsck-promisors' 2018-02-13 13:39:03 -08:00
list-objects.h
…
list.h
…
ll-merge.c
…
ll-merge.h
…
lockfile.c
…
lockfile.h
…
log-tree.c Merge branch 'bw/c-plus-plus' 2018-03-06 14:54:07 -08:00
log-tree.h
…
mailinfo.c Merge branch 'jc/mailinfo-cleanup-fix' into maint 2018-03-22 14:24:16 -07:00
mailinfo.h
…
mailmap.c
…
mailmap.h
…
match-trees.c
…
merge-blobs.c
…
merge-blobs.h
…
merge-recursive.c Merge branch 'rj/warning-uninitialized-fix' 2018-03-21 11:30:15 -07:00
merge-recursive.h
…
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
…
notes-cache.h
…
notes-merge.c
…
notes-merge.h
…
notes-utils.c
…
notes-utils.h
…
notes.c
…
notes.h
…
object.c Merge branch 'bw/c-plus-plus' 2018-03-06 14:54:07 -08:00
object.h Merge branch 'nd/object-allocation-comments' 2018-03-14 12:01:06 -07:00
oidmap.c
…
oidmap.h
…
oidset.c
…
oidset.h
…
pack-bitmap-write.c
…
pack-bitmap.c
…
pack-bitmap.h
…
pack-check.c Merge branch 'bw/c-plus-plus' 2018-03-06 14:54:07 -08:00
pack-objects.c
…
pack-objects.h
…
pack-revindex.c
…
pack-revindex.h
…
pack-write.c
…
pack.h
…
packfile.c Merge branch 'bw/c-plus-plus' 2018-03-06 14:54:07 -08:00
packfile.h
…
pager.c
…
parse-options-cb.c
…
parse-options.c Merge branch 'nd/parseopt-completion' 2018-03-14 12:01:07 -07:00
parse-options.h completion: don't set PARSE_OPT_NOCOMPLETE on --rerere-autoupdate 2018-03-07 11:02:48 -08:00
patch-delta.c
…
patch-ids.c
…
patch-ids.h
…
path.c
…
path.h
…
pathspec.c
…
pathspec.h
…
pkt-line.c
…
pkt-line.h
…
preload-index.c
…
pretty.c
…
pretty.h
…
prio-queue.c
…
prio-queue.h
…
progress.c
…
progress.h
…
prompt.c
…
prompt.h
…
protocol.c
…
protocol.h
…
quote.c Merge branch 'jk/sq-dequote-on-bogus-input' 2018-02-27 10:34:02 -08:00
quote.h
…
reachable.c object: rename function 'typename' to 'type_name' 2018-02-14 13:10:05 -08:00
reachable.h
…
read-cache.c Merge branch 'nd/shared-index-fix' into maint 2018-03-22 14:24:16 -07:00
ref-filter.c Merge branch 'ot/ref-filter-cleanup' 2018-03-08 12:36:24 -08:00
ref-filter.h
…
reflog-walk.c
…
reflog-walk.h
…
refs.c
…
refs.h
…
remote-curl.c Merge branch 'jk/push-options-via-transport-fix' 2018-02-28 13:37:58 -08:00
remote-testsvn.c
…
remote.c Merge branch 'jh/status-no-ahead-behind' 2018-03-08 12:36:24 -08:00
remote.h Merge branch 'jh/status-no-ahead-behind' 2018-03-08 12:36:24 -08:00
replace_object.c
…
repository.c Merge branch 'tg/split-index-fixes' into maint 2018-03-22 14:24:10 -07:00
repository.h
…
rerere.c write_locked_index(): add flag to avoid writing unchanged index 2018-03-01 13:28:01 -08: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.h
…
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.h
…
send-pack.c
…
send-pack.h
…
sequencer.c Merge branch 'ma/skip-writing-unchanged-index' 2018-03-21 11:30:10 -07:00
sequencer.h Merge branch 'pw/sequencer-in-process-commit' 2018-02-13 13:39:15 -08:00
server-info.c
…
setup.c Merge branch 'as/ll-i18n' 2018-02-27 10:33:58 -08:00
sh-i18n--envsubst.c
…
sha1-array.c
…
sha1-array.h
…
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
sha1_file.c Merge branch 'jh/fsck-promisors' 2018-03-21 11:30:10 -07:00
sha1_name.c Merge branch 'ds/find-unique-abbrev-optim' 2018-03-08 12:36:26 -08:00
sha1dc_git.c
…
sha1dc_git.h
…
shallow.c
…
shell.c
…
shortlog.h
…
show-index.c
…
sideband.c
…
sideband.h
…
sigchain.c
…
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 Merge branch 'nd/worktree-move' 2018-03-14 12:01:05 -07:00
strbuf.h worktree move: accept destination as directory 2018-02-12 13:13:35 -08:00
streaming.c
…
streaming.h
…
string-list.c
…
string-list.h
…
sub-process.c
…
sub-process.h
…
submodule-config.c Correct mispellings of ".gitmodule" to ".gitmodules" 2018-02-14 11:34:34 -08:00
submodule-config.h
…
submodule.c submodule: rename 'new' variables 2018-02-22 10:08:05 -08:00
submodule.h submodule: rename 'new' variables 2018-02-22 10:08:05 -08:00
symlinks.c
…
tag.c object: rename function 'typename' to 'type_name' 2018-02-14 13:10:05 -08: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
…
tmp-objdir.h
…
trace.c
…
trace.h
…
trailer.c trailer: rename 'template' variables 2018-02-22 10:08:05 -08:00
trailer.h
…
transport-helper.c Merge branch 'jh/partial-clone' 2018-02-13 13:39:04 -08:00
transport-internal.h
…
transport.c Merge branch 'jh/partial-clone' 2018-02-13 13:39:04 -08:00
transport.h Merge branch 'jh/partial-clone' 2018-02-13 13:39:04 -08:00
tree-diff.c
…
tree-walk.c
…
tree-walk.h
…
tree.c
…
tree.h
…
unicode_width.h
…
unimplemented.sh
…
unix-socket.c
…
unix-socket.h
…
unpack-trees.c Merge branch 'jh/partial-clone' 2018-03-29 15:39:59 -07:00
unpack-trees.h
…
upload-pack.c Merge branch 'jh/partial-clone' 2018-03-29 15:39:59 -07:00
url.c
…
url.h
…
urlmatch.c
…
urlmatch.h
…
usage.c
…
userdiff.c Merge branch 'tl/userdiff-csharp-async' 2018-03-15 15:00:47 -07:00
userdiff.h
…
utf8.c
…
utf8.h
…
varint.c
…
varint.h
…
version.c
…
version.h
…
versioncmp.c
…
walker.c object: rename function 'typename' to 'type_name' 2018-02-14 13:10:05 -08:00
walker.h
…
wildmatch.c
…
wildmatch.h
…
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
…
wrapper.c wrapper: rename 'template' variables 2018-02-22 10:08:05 -08:00
write_or_die.c
…
ws.c
…
wt-status.c Merge branch 'jh/status-no-ahead-behind' 2018-03-08 12:36:24 -08:00
wt-status.h Merge branch 'jh/status-no-ahead-behind' 2018-03-08 12:36:24 -08:00
xdiff-interface.c
…
xdiff-interface.h
…
zlib.c
…

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.

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