3 # bash completion support for core Git.
5 # Copyright (C) 2006,2007 Shawn O. Pearce <spearce@spearce.org>
6 # Conceptually based on gitcompletion (http://gitweb.hawaga.org.uk/).
7 # Distributed under the GNU General Public License, version 2.0.
9 # The contained completion routines provide support for completing:
11 # *) local and remote branch names
12 # *) local and remote tag names
13 # *) .git/remotes file names
14 # *) git 'subcommands'
15 # *) tree paths within 'ref:path/to/file' expressions
16 # *) common --long-options
18 # To use these routines:
20 # 1) Copy this file to somewhere (e.g. ~/.git-completion.sh).
21 # 2) Added the following line to your .bashrc:
22 # source ~/.git-completion.sh
24 # 3) You may want to make sure the git executable is available
25 # in your PATH before this script is sourced, as some caching
26 # is performed while the script loads. If git isn't found
27 # at source time then all lookups will be done on demand,
28 # which may be slightly slower.
30 # 4) Consider changing your PS1 to also show the current branch:
31 # PS1='[\u@\h \W$(__git_ps1 " (%s)")]\$ '
33 # The argument to __git_ps1 will be displayed only if you
34 # are currently in a git repository. The %s token will be
35 # the name of the current branch.
37 # In addition, if you set GIT_PS1_SHOWDIRTYSTATE to a nonempty
38 # value, unstaged (*) and staged (+) changes will be shown next
39 # to the branch name. You can configure this per-repository
40 # with the bash.showDirtyState variable, which defaults to true
41 # once GIT_PS1_SHOWDIRTYSTATE is enabled.
45 # *) Read Documentation/SubmittingPatches
46 # *) Send all patches to the current maintainer:
48 # "Shawn O. Pearce" <spearce@spearce.org>
50 # *) Always CC the Git mailing list:
55 case "$COMP_WORDBREAKS" in
57 *) COMP_WORDBREAKS="$COMP_WORDBREAKS:"
60 # __gitdir accepts 0 or 1 arguments (i.e., location)
61 # returns location of .git repo
64 if [ -z "${1-}" ]; then
65 if [ -n "$__git_dir" ]; then
67 elif [ -d .git ]; then
70 git rev-parse --git-dir 2>/dev/null
72 elif [ -d "$1/.git" ]; then
79 # __git_ps1 accepts 0 or 1 arguments (i.e., format string)
80 # returns text to add to bash PS1 prompt (includes branch name)
83 local g="$(git rev-parse --git-dir 2>/dev/null)"
87 if [ -d "$g/rebase-apply" ]
89 if test -f "$g/rebase-apply/rebasing"
92 elif test -f "$g/rebase-apply/applying"
98 b="$(git symbolic-ref HEAD 2>/dev/null)"
99 elif [ -f "$g/rebase-merge/interactive" ]
102 b="$(cat "$g/rebase-merge/head-name")"
103 elif [ -d "$g/rebase-merge" ]
106 b="$(cat "$g/rebase-merge/head-name")"
107 elif [ -f "$g/MERGE_HEAD" ]
110 b="$(git symbolic-ref HEAD 2>/dev/null)"
112 if [ -f "$g/BISECT_LOG" ]
116 if ! b="$(git symbolic-ref HEAD 2>/dev/null)"
118 if ! b="$(git describe --exact-match HEAD 2>/dev/null)"
120 b="$(cut -c1-7 "$g/HEAD")..."
128 if test -n "${GIT_PS1_SHOWDIRTYSTATE-}"; then
129 if test "$(git config --bool bash.showDirtyState)" != "false"; then
130 git diff --no-ext-diff --ignore-submodules \
131 --quiet --exit-code || w="*"
132 if git rev-parse --quiet --verify HEAD >/dev/null; then
133 git diff-index --cached --quiet \
134 --ignore-submodules HEAD -- || i="+"
141 if [ -n "${1-}" ]; then
142 printf "$1" "${b##refs/heads/}$w$i$r"
144 printf " (%s)" "${b##refs/heads/}$w$i$r"
149 # __gitcomp_1 requires 2 arguments
152 local c IFS=' '$'\t'$'\n'
155 --*=*) printf %s$'\n' "$c$2" ;;
156 *.) printf %s$'\n' "$c$2" ;;
157 *) printf %s$'\n' "$c$2 " ;;
162 # __gitcomp accepts 1, 2, 3, or 4 arguments
163 # generates completion reply with compgen
166 local cur="${COMP_WORDS[COMP_CWORD]}"
167 if [ $# -gt 2 ]; then
176 COMPREPLY=($(compgen -P "${2-}" \
177 -W "$(__gitcomp_1 "${1-}" "${4-}")" \
183 # __git_heads accepts 0 or 1 arguments (to pass to __gitdir)
186 local cmd i is_hash=y dir="$(__gitdir "${1-}")"
187 if [ -d "$dir" ]; then
188 git --git-dir="$dir" for-each-ref --format='%(refname:short)' \
192 for i in $(git ls-remote "${1-}" 2>/dev/null); do
193 case "$is_hash,$i" in
196 n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;
197 n,*) is_hash=y; echo "$i" ;;
202 # __git_tags accepts 0 or 1 arguments (to pass to __gitdir)
205 local cmd i is_hash=y dir="$(__gitdir "${1-}")"
206 if [ -d "$dir" ]; then
207 git --git-dir="$dir" for-each-ref --format='%(refname:short)' \
211 for i in $(git ls-remote "${1-}" 2>/dev/null); do
212 case "$is_hash,$i" in
215 n,refs/tags/*) is_hash=y; echo "${i#refs/tags/}" ;;
216 n,*) is_hash=y; echo "$i" ;;
221 # __git_refs accepts 0 or 1 arguments (to pass to __gitdir)
224 local i is_hash=y dir="$(__gitdir "${1-}")"
225 local cur="${COMP_WORDS[COMP_CWORD]}" format refs
226 if [ -d "$dir" ]; then
233 if [ -e "$dir/HEAD" ]; then echo HEAD; fi
234 format="refname:short"
235 refs="refs/tags refs/heads refs/remotes"
238 git --git-dir="$dir" for-each-ref --format="%($format)" \
242 for i in $(git ls-remote "$dir" 2>/dev/null); do
243 case "$is_hash,$i" in
246 n,refs/tags/*) is_hash=y; echo "${i#refs/tags/}" ;;
247 n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;
248 n,refs/remotes/*) is_hash=y; echo "${i#refs/remotes/}" ;;
249 n,*) is_hash=y; echo "$i" ;;
254 # __git_refs2 requires 1 argument (to pass to __git_refs)
258 for i in $(__git_refs "$1"); do
263 # __git_refs_remotes requires 1 argument (to pass to ls-remote)
264 __git_refs_remotes ()
266 local cmd i is_hash=y
267 for i in $(git ls-remote "$1" 2>/dev/null); do
268 case "$is_hash,$i" in
271 echo "$i:refs/remotes/$1/${i#refs/heads/}"
275 n,refs/tags/*) is_hash=y;;
283 local i ngoff IFS=$'\n' d="$(__gitdir)"
284 shopt -q nullglob || ngoff=1
286 for i in "$d/remotes"/*; do
287 echo ${i#$d/remotes/}
289 [ "$ngoff" ] && shopt -u nullglob
290 for i in $(git --git-dir="$d" config --list); do
300 __git_merge_strategies ()
302 if [ -n "$__git_merge_strategylist" ]; then
303 echo "$__git_merge_strategylist"
306 git merge -s help 2>&1 |
307 sed -n -e '/[Aa]vailable strategies are: /,/^$/{
315 __git_merge_strategylist=
316 __git_merge_strategylist=$(__git_merge_strategies 2>/dev/null)
318 __git_complete_file ()
320 local pfx ls ref cur="${COMP_WORDS[COMP_CWORD]}"
337 case "$COMP_WORDBREAKS" in
339 *) pfx="$ref:$pfx" ;;
343 COMPREPLY=($(compgen -P "$pfx" \
344 -W "$(git --git-dir="$(__gitdir)" ls-tree "$ls" \
345 | sed '/^100... blob /{
361 __gitcomp "$(__git_refs)"
366 __git_complete_revlist ()
368 local pfx cur="${COMP_WORDS[COMP_CWORD]}"
373 __gitcomp "$(__git_refs)" "$pfx" "$cur"
378 __gitcomp "$(__git_refs)" "$pfx" "$cur"
381 __gitcomp "$(__git_refs)"
386 __git_all_commands ()
388 if [ -n "$__git_all_commandlist" ]; then
389 echo "$__git_all_commandlist"
393 for i in $(git help -a|egrep '^ ')
396 *--*) : helper pattern;;
401 __git_all_commandlist=
402 __git_all_commandlist="$(__git_all_commands 2>/dev/null)"
404 __git_porcelain_commands ()
406 if [ -n "$__git_porcelain_commandlist" ]; then
407 echo "$__git_porcelain_commandlist"
411 for i in "help" $(__git_all_commands)
414 *--*) : helper pattern;;
415 applymbox) : ask gittus;;
416 applypatch) : ask gittus;;
417 archimport) : import;;
418 cat-file) : plumbing;;
419 check-attr) : plumbing;;
420 check-ref-format) : plumbing;;
421 checkout-index) : plumbing;;
422 commit-tree) : plumbing;;
423 count-objects) : infrequent;;
424 cvsexportcommit) : export;;
425 cvsimport) : import;;
426 cvsserver) : daemon;;
428 diff-files) : plumbing;;
429 diff-index) : plumbing;;
430 diff-tree) : plumbing;;
431 fast-import) : import;;
432 fast-export) : export;;
433 fsck-objects) : plumbing;;
434 fetch-pack) : plumbing;;
435 fmt-merge-msg) : plumbing;;
436 for-each-ref) : plumbing;;
437 hash-object) : plumbing;;
438 http-*) : transport;;
439 index-pack) : plumbing;;
440 init-db) : deprecated;;
441 local-fetch) : plumbing;;
442 lost-found) : infrequent;;
443 ls-files) : plumbing;;
444 ls-remote) : plumbing;;
445 ls-tree) : plumbing;;
446 mailinfo) : plumbing;;
447 mailsplit) : plumbing;;
448 merge-*) : plumbing;;
451 pack-objects) : plumbing;;
452 pack-redundant) : plumbing;;
453 pack-refs) : plumbing;;
454 parse-remote) : plumbing;;
455 patch-id) : plumbing;;
456 peek-remote) : plumbing;;
458 prune-packed) : plumbing;;
459 quiltimport) : import;;
460 read-tree) : plumbing;;
461 receive-pack) : plumbing;;
463 repo-config) : deprecated;;
465 rev-list) : plumbing;;
466 rev-parse) : plumbing;;
467 runstatus) : plumbing;;
468 sh-setup) : internal;;
470 show-ref) : plumbing;;
471 send-pack) : plumbing;;
472 show-index) : plumbing;;
474 stripspace) : plumbing;;
475 symbolic-ref) : plumbing;;
476 tar-tree) : deprecated;;
477 unpack-file) : plumbing;;
478 unpack-objects) : plumbing;;
479 update-index) : plumbing;;
480 update-ref) : plumbing;;
481 update-server-info) : daemon;;
482 upload-archive) : plumbing;;
483 upload-pack) : plumbing;;
484 write-tree) : plumbing;;
486 verify-pack) : infrequent;;
487 verify-tag) : plumbing;;
492 __git_porcelain_commandlist=
493 __git_porcelain_commandlist="$(__git_porcelain_commands 2>/dev/null)"
498 for i in $(git --git-dir="$(__gitdir)" config --list); do
508 # __git_aliased_command requires 1 argument
509 __git_aliased_command ()
511 local word cmdline=$(git --git-dir="$(__gitdir)" \
512 config --get "alias.$1")
513 for word in $cmdline; do
514 if [ "${word##-*}" ]; then
521 # __git_find_subcommand requires 1 argument
522 __git_find_subcommand ()
524 local word subcommand c=1
526 while [ $c -lt $COMP_CWORD ]; do
527 word="${COMP_WORDS[c]}"
528 for subcommand in $1; do
529 if [ "$subcommand" = "$word" ]; then
538 __git_has_doubledash ()
541 while [ $c -lt $COMP_CWORD ]; do
542 if [ "--" = "${COMP_WORDS[c]}" ]; then
550 __git_whitespacelist="nowarn warn error error-all fix"
554 local cur="${COMP_WORDS[COMP_CWORD]}" dir="$(__gitdir)"
555 if [ -d "$dir"/rebase-apply ]; then
556 __gitcomp "--skip --resolved --abort"
561 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
566 --signoff --utf8 --binary --3way --interactive
576 local cur="${COMP_WORDS[COMP_CWORD]}"
579 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
584 --stat --numstat --summary --check --index
585 --cached --index-info --reverse --reject --unidiff-zero
586 --apply --no-add --exclude=
587 --whitespace= --inaccurate-eof --verbose
596 __git_has_doubledash && return
598 local cur="${COMP_WORDS[COMP_CWORD]}"
602 --interactive --refresh --patch --update --dry-run
603 --ignore-errors --intent-to-add
612 local cur="${COMP_WORDS[COMP_CWORD]}"
615 __gitcomp "$(git archive --list)" "" "${cur##--format=}"
619 __gitcomp "$(__git_remotes)" "" "${cur##--remote=}"
624 --format= --list --verbose
625 --prefix= --remote= --exec=
635 __git_has_doubledash && return
637 local subcommands="start bad good skip reset visualize replay log run"
638 local subcommand="$(__git_find_subcommand "$subcommands")"
639 if [ -z "$subcommand" ]; then
640 __gitcomp "$subcommands"
644 case "$subcommand" in
646 __gitcomp "$(__git_refs)"
656 local i c=1 only_local_ref="n" has_r="n"
658 while [ $c -lt $COMP_CWORD ]; do
661 -d|-m) only_local_ref="y" ;;
667 case "${COMP_WORDS[COMP_CWORD]}" in
670 --color --no-color --verbose --abbrev= --no-abbrev
671 --track --no-track --contains --merged --no-merged
675 if [ $only_local_ref = "y" -a $has_r = "n" ]; then
676 __gitcomp "$(__git_heads)"
678 __gitcomp "$(__git_refs)"
686 local cmd="${COMP_WORDS[2]}"
687 case "$COMP_CWORD" in
689 __gitcomp "create list-heads verify unbundle"
697 __git_complete_revlist
706 __git_has_doubledash && return
708 __gitcomp "$(__git_refs)"
713 __gitcomp "$(__git_refs)"
718 local cur="${COMP_WORDS[COMP_CWORD]}"
721 __gitcomp "--edit --no-commit"
724 __gitcomp "$(__git_refs)"
731 __git_has_doubledash && return
733 local cur="${COMP_WORDS[COMP_CWORD]}"
736 __gitcomp "--dry-run --quiet"
745 local cur="${COMP_WORDS[COMP_CWORD]}"
770 __git_has_doubledash && return
772 local cur="${COMP_WORDS[COMP_CWORD]}"
776 --all --author= --signoff --verify --no-verify
777 --edit --amend --include --only --interactive
786 local cur="${COMP_WORDS[COMP_CWORD]}"
790 --all --tags --contains --abbrev= --candidates=
791 --exact-match --debug --long --match --always
795 __gitcomp "$(__git_refs)"
798 __git_diff_common_options="--stat --numstat --shortstat --summary
799 --patch-with-stat --name-only --name-status --color
800 --no-color --color-words --no-renames --check
801 --full-index --binary --abbrev --diff-filter=
803 --text --ignore-space-at-eol --ignore-space-change
804 --ignore-all-space --exit-code --quiet --ext-diff
806 --no-prefix --src-prefix= --dst-prefix=
807 --inter-hunk-context=
814 __git_has_doubledash && return
816 local cur="${COMP_WORDS[COMP_CWORD]}"
819 __gitcomp "--cached --pickaxe-all --pickaxe-regex
820 --base --ours --theirs
821 $__git_diff_common_options
831 local cur="${COMP_WORDS[COMP_CWORD]}"
833 if [ "$COMP_CWORD" = 2 ]; then
834 __gitcomp "$(__git_remotes)"
839 case "$COMP_WORDBREAKS" in
841 *) pfx="${cur%%:*}:" ;;
843 __gitcomp "$(__git_refs)" "$pfx" "${cur#*:}"
846 __gitcomp "$(__git_refs2 "${COMP_WORDS[2]}")"
854 local cur="${COMP_WORDS[COMP_CWORD]}"
858 --stdout --attach --thread
860 --numbered --start-number
865 --full-index --binary
868 --no-prefix --src-prefix= --dst-prefix=
869 --inline --suffix= --ignore-if-in-upstream
875 __git_complete_revlist
880 local cur="${COMP_WORDS[COMP_CWORD]}"
883 __gitcomp "--prune --aggressive"
892 __git_has_doubledash && return
894 local cur="${COMP_WORDS[COMP_CWORD]}"
899 --text --ignore-case --word-regexp --invert-match
901 --extended-regexp --basic-regexp --fixed-strings
902 --files-with-matches --name-only
903 --files-without-match
905 --and --or --not --all-match
915 local cur="${COMP_WORDS[COMP_CWORD]}"
918 __gitcomp "--all --info --man --web"
922 __gitcomp "$(__git_all_commands)
923 attributes cli core-tutorial cvs-migration
924 diffcore gitk glossary hooks ignore modules
925 repository-layout tutorial tutorial-2
932 local cur="${COMP_WORDS[COMP_CWORD]}"
936 false true umask group all world everybody
937 " "" "${cur##--shared=}"
941 __gitcomp "--quiet --bare --template= --shared --shared="
950 __git_has_doubledash && return
952 local cur="${COMP_WORDS[COMP_CWORD]}"
955 __gitcomp "--cached --deleted --modified --others --ignored
956 --stage --directory --no-empty-directory --unmerged
957 --killed --exclude= --exclude-from=
958 --exclude-per-directory= --exclude-standard
959 --error-unmatch --with-tree= --full-name
960 --abbrev --ignored --exclude-per-directory
970 __gitcomp "$(__git_remotes)"
978 # Options that go well for log, shortlog and gitk
979 __git_log_common_options="
981 --branches --tags --remotes
982 --first-parent --no-merges
984 --max-age= --since= --after=
985 --min-age= --until= --before=
987 # Options that go well for log and gitk (not shortlog)
988 __git_log_gitk_options="
989 --dense --sparse --full-history
990 --simplify-merges --simplify-by-decoration
993 # Options that go well for log and shortlog (not gitk)
994 __git_log_shortlog_options="
995 --author= --committer= --grep=
999 __git_log_pretty_formats="oneline short medium full fuller email raw format:"
1003 __git_has_doubledash && return
1005 local cur="${COMP_WORDS[COMP_CWORD]}"
1008 __gitcomp "$__git_log_pretty_formats
1009 " "" "${cur##--pretty=}"
1014 relative iso8601 rfc2822 short local default
1015 " "" "${cur##--date=}"
1020 $__git_log_common_options
1021 $__git_log_shortlog_options
1022 $__git_log_gitk_options
1023 --root --topo-order --date-order --reverse
1025 --abbrev-commit --abbrev=
1026 --relative-date --date=
1032 --parents --children
1034 $__git_diff_common_options
1035 --pickaxe-all --pickaxe-regex
1040 __git_complete_revlist
1045 local cur="${COMP_WORDS[COMP_CWORD]}"
1046 case "${COMP_WORDS[COMP_CWORD-1]}" in
1048 __gitcomp "$(__git_merge_strategies)"
1053 __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
1058 --no-commit --no-stat --log --no-log --squash --strategy
1059 --commit --stat --no-squash --ff --no-ff
1063 __gitcomp "$(__git_refs)"
1068 local cur="${COMP_WORDS[COMP_CWORD]}"
1072 kdiff3 tkdiff meld xxdiff emerge
1073 vimdiff gvimdiff ecmerge opendiff
1074 " "" "${cur##--tool=}"
1087 __gitcomp "$(__git_refs)"
1092 local cur="${COMP_WORDS[COMP_CWORD]}"
1095 __gitcomp "--dry-run"
1104 __gitcomp "--tags --all --stdin"
1109 local cur="${COMP_WORDS[COMP_CWORD]}"
1111 if [ "$COMP_CWORD" = 2 ]; then
1112 __gitcomp "$(__git_remotes)"
1114 __gitcomp "$(__git_refs "${COMP_WORDS[2]}")"
1120 local cur="${COMP_WORDS[COMP_CWORD]}"
1122 if [ "$COMP_CWORD" = 2 ]; then
1123 __gitcomp "$(__git_remotes)"
1128 case "$COMP_WORDBREAKS" in
1130 *) pfx="${cur%%:*}:" ;;
1133 __gitcomp "$(__git_refs "${COMP_WORDS[2]}")" "$pfx" "${cur#*:}"
1136 __gitcomp "$(__git_refs)" + "${cur#+}"
1139 __gitcomp "$(__git_refs)"
1147 local cur="${COMP_WORDS[COMP_CWORD]}" dir="$(__gitdir)"
1148 if [ -d "$dir"/rebase-apply ] || [ -d "$dir"/rebase-merge ]; then
1149 __gitcomp "--continue --skip --abort"
1152 case "${COMP_WORDS[COMP_CWORD-1]}" in
1154 __gitcomp "$(__git_merge_strategies)"
1159 __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
1163 __gitcomp "--onto --merge --strategy --interactive"
1166 __gitcomp "$(__git_refs)"
1171 local cur="${COMP_WORDS[COMP_CWORD]}"
1174 __gitcomp "--bcc --cc --cc-cmd --chain-reply-to --compose
1175 --dry-run --envelope-sender --from --identity
1176 --in-reply-to --no-chain-reply-to --no-signed-off-by-cc
1177 --no-suppress-from --no-thread --quiet
1178 --signed-off-by-cc --smtp-pass --smtp-server
1179 --smtp-server-port --smtp-ssl --smtp-user --subject
1180 --suppress-cc --suppress-from --thread --to
1181 --validate --no-validate"
1190 local cur="${COMP_WORDS[COMP_CWORD]}"
1191 local prv="${COMP_WORDS[COMP_CWORD-1]}"
1194 __gitcomp "$(__git_remotes)"
1198 __gitcomp "$(__git_refs)"
1202 local remote="${prv#remote.}"
1203 remote="${remote%.fetch}"
1204 __gitcomp "$(__git_refs_remotes "$remote")"
1208 local remote="${prv#remote.}"
1209 remote="${remote%.push}"
1210 __gitcomp "$(git --git-dir="$(__gitdir)" \
1211 for-each-ref --format='%(refname):%(refname)' \
1215 pull.twohead|pull.octopus)
1216 __gitcomp "$(__git_merge_strategies)"
1219 color.branch|color.diff|color.interactive|color.status|color.ui)
1220 __gitcomp "always never auto"
1224 __gitcomp "false true"
1229 normal black red green yellow blue magenta cyan white
1230 bold dim ul blink reverse
1242 --global --system --file=
1243 --list --replace-all
1244 --get --get-all --get-regexp
1245 --add --unset --unset-all
1246 --remove-section --rename-section
1251 local pfx="${cur%.*}."
1253 __gitcomp "remote merge mergeoptions" "$pfx" "$cur"
1257 local pfx="${cur%.*}."
1259 __gitcomp "$(__git_heads)" "$pfx" "$cur" "."
1263 local pfx="${cur%.*}."
1266 url proxy fetch push mirror skipDefaultUpdate
1267 receivepack uploadpack tagopt
1272 local pfx="${cur%.*}."
1274 __gitcomp "$(__git_remotes)" "$pfx" "$cur" "."
1280 branch.autosetupmerge
1281 branch.autosetuprebase
1284 color.branch.current
1295 color.diff.whitespace
1297 color.interactive.header
1298 color.interactive.help
1299 color.interactive.prompt
1303 color.status.changed
1305 color.status.nobranch
1306 color.status.untracked
1307 color.status.updated
1313 core.deltaBaseCacheLimit
1317 core.fsyncobjectfiles
1319 core.ignoreCygwinFSTricks
1321 core.logAllRefUpdates
1322 core.loosecompression
1324 core.packedGitWindowSize
1326 core.preferSymlinkRefs
1329 core.repositoryFormatVersion
1331 core.sharedRepository
1334 core.warnAmbiguousRefs
1337 diff.autorefreshindex
1354 gc.reflogexpireunreachable
1358 gitcvs.dbTableNamePrefix
1368 gui.copyblamethreshold
1372 gui.matchtrackingbranch
1373 gui.newbranchtemplate
1374 gui.pruneduringfetch
1375 gui.spellingdictionary
1391 i18n.logOutputEncoding
1406 mergetool.keepBackup
1408 pack.deltaCacheLimit
1418 receive.denyCurrentBranch
1420 receive.denyNonFastForwards
1423 repack.usedeltabaseoffset
1427 status.relativePaths
1428 status.showUntrackedFiles
1430 transfer.unpackLimit
1441 local subcommands="add rename rm show prune update"
1442 local subcommand="$(__git_find_subcommand "$subcommands")"
1443 if [ -z "$subcommand" ]; then
1444 __gitcomp "$subcommands"
1448 case "$subcommand" in
1449 rename|rm|show|prune)
1450 __gitcomp "$(__git_remotes)"
1453 local i c='' IFS=$'\n'
1454 for i in $(git --git-dir="$(__gitdir)" config --list); do
1472 __git_has_doubledash && return
1474 local cur="${COMP_WORDS[COMP_CWORD]}"
1477 __gitcomp "--merge --mixed --hard --soft"
1481 __gitcomp "$(__git_refs)"
1486 local cur="${COMP_WORDS[COMP_CWORD]}"
1489 __gitcomp "--edit --mainline --no-edit --no-commit --signoff"
1493 __gitcomp "$(__git_refs)"
1498 __git_has_doubledash && return
1500 local cur="${COMP_WORDS[COMP_CWORD]}"
1503 __gitcomp "--cached --dry-run --ignore-unmatch --quiet"
1512 __git_has_doubledash && return
1514 local cur="${COMP_WORDS[COMP_CWORD]}"
1518 $__git_log_common_options
1519 $__git_log_shortlog_options
1520 --numbered --summary
1525 __git_complete_revlist
1530 __git_has_doubledash && return
1532 local cur="${COMP_WORDS[COMP_CWORD]}"
1535 __gitcomp "$__git_log_pretty_formats
1536 " "" "${cur##--pretty=}"
1540 __gitcomp "--pretty=
1541 $__git_diff_common_options
1551 local cur="${COMP_WORDS[COMP_CWORD]}"
1555 --all --remotes --topo-order --current --more=
1556 --list --independent --merge-base --no-name
1557 --sha1-name --topics --reflog
1562 __git_complete_revlist
1567 local subcommands='save list show apply clear drop pop create branch'
1568 local subcommand="$(__git_find_subcommand "$subcommands")"
1569 if [ -z "$subcommand" ]; then
1570 __gitcomp "$subcommands"
1572 local cur="${COMP_WORDS[COMP_CWORD]}"
1573 case "$subcommand,$cur" in
1575 __gitcomp "--keep-index"
1580 show,--*|drop,--*|pop,--*|branch,--*)
1583 show,*|apply,*|drop,*|pop,*|branch,*)
1584 __gitcomp "$(git --git-dir="$(__gitdir)" stash list \
1585 | sed -n -e 's/:.*//p')"
1596 __git_has_doubledash && return
1598 local subcommands="add status init update summary foreach sync"
1599 if [ -z "$(__git_find_subcommand "$subcommands")" ]; then
1600 local cur="${COMP_WORDS[COMP_CWORD]}"
1603 __gitcomp "--quiet --cached"
1606 __gitcomp "$subcommands"
1616 init fetch clone rebase dcommit log find-rev
1617 set-tree commit-diff info create-ignore propget
1618 proplist show-ignore show-externals branch tag blame
1621 local subcommand="$(__git_find_subcommand "$subcommands")"
1622 if [ -z "$subcommand" ]; then
1623 __gitcomp "$subcommands"
1625 local remote_opts="--username= --config-dir= --no-auth-cache"
1627 --follow-parent --authors-file= --repack=
1628 --no-metadata --use-svm-props --use-svnsync-props
1629 --log-window-size= --no-checkout --quiet
1630 --repack-flags --use-log-author --localtime
1631 --ignore-paths= $remote_opts
1634 --template= --shared= --trunk= --tags=
1635 --branches= --stdlayout --minimize-url
1636 --no-metadata --use-svm-props --use-svnsync-props
1637 --rewrite-root= --prefix= --use-log-author
1638 --add-author-from $remote_opts
1641 --edit --rmdir --find-copies-harder --copy-similarity=
1644 local cur="${COMP_WORDS[COMP_CWORD]}"
1645 case "$subcommand,$cur" in
1647 __gitcomp "--revision= --fetch-all $fc_opts"
1650 __gitcomp "--revision= $fc_opts $init_opts"
1653 __gitcomp "$init_opts"
1657 --merge --strategy= --verbose --dry-run
1658 --fetch-all --no-rebase --commit-url
1659 --revision $cmt_opts $fc_opts
1663 __gitcomp "--stdin $cmt_opts $fc_opts"
1665 create-ignore,--*|propget,--*|proplist,--*|show-ignore,--*|\
1667 __gitcomp "--revision="
1671 --limit= --revision= --verbose --incremental
1672 --oneline --show-commit --non-recursive
1673 --authors-file= --color
1678 --merge --verbose --strategy= --local
1679 --fetch-all --dry-run $fc_opts
1683 __gitcomp "--message= --file= --revision= $cmt_opts"
1689 __gitcomp "--dry-run --message --tag"
1692 __gitcomp "--dry-run --message"
1695 __gitcomp "--git-format"
1699 --config-dir= --ignore-paths= --minimize
1700 --no-auth-cache --username=
1713 while [ $c -lt $COMP_CWORD ]; do
1714 i="${COMP_WORDS[c]}"
1717 __gitcomp "$(__git_tags)"
1727 case "${COMP_WORDS[COMP_CWORD-1]}" in
1733 __gitcomp "$(__git_tags)"
1739 __gitcomp "$(__git_refs)"
1746 local i c=1 command __git_dir
1748 while [ $c -lt $COMP_CWORD ]; do
1749 i="${COMP_WORDS[c]}"
1751 --git-dir=*) __git_dir="${i#--git-dir=}" ;;
1752 --bare) __git_dir="." ;;
1753 --version|-p|--paginate) ;;
1754 --help) command="help"; break ;;
1755 *) command="$i"; break ;;
1760 if [ -z "$command" ]; then
1761 case "${COMP_WORDS[COMP_CWORD]}" in
1773 *) __gitcomp "$(__git_porcelain_commands) $(__git_aliases)" ;;
1778 local expansion=$(__git_aliased_command "$command")
1779 [ "$expansion" ] && command="$expansion"
1784 apply) _git_apply ;;
1785 archive) _git_archive ;;
1786 bisect) _git_bisect ;;
1787 bundle) _git_bundle ;;
1788 branch) _git_branch ;;
1789 checkout) _git_checkout ;;
1790 cherry) _git_cherry ;;
1791 cherry-pick) _git_cherry_pick ;;
1792 clean) _git_clean ;;
1793 clone) _git_clone ;;
1794 commit) _git_commit ;;
1795 config) _git_config ;;
1796 describe) _git_describe ;;
1798 fetch) _git_fetch ;;
1799 format-patch) _git_format_patch ;;
1805 ls-files) _git_ls_files ;;
1806 ls-remote) _git_ls_remote ;;
1807 ls-tree) _git_ls_tree ;;
1809 mergetool) _git_mergetool;;
1810 merge-base) _git_merge_base ;;
1812 name-rev) _git_name_rev ;;
1815 rebase) _git_rebase ;;
1816 remote) _git_remote ;;
1817 reset) _git_reset ;;
1818 revert) _git_revert ;;
1820 send-email) _git_send_email ;;
1821 shortlog) _git_shortlog ;;
1823 show-branch) _git_show_branch ;;
1824 stash) _git_stash ;;
1826 submodule) _git_submodule ;;
1829 whatchanged) _git_log ;;
1836 __git_has_doubledash && return
1838 local cur="${COMP_WORDS[COMP_CWORD]}"
1839 local g="$(git rev-parse --git-dir 2>/dev/null)"
1841 if [ -f $g/MERGE_HEAD ]; then
1847 $__git_log_common_options
1848 $__git_log_gitk_options
1854 __git_complete_revlist
1857 complete -o bashdefault -o default -o nospace -F _git git 2>/dev/null \
1858 || complete -o default -o nospace -F _git git
1859 complete -o bashdefault -o default -o nospace -F _gitk gitk 2>/dev/null \
1860 || complete -o default -o nospace -F _gitk gitk
1862 # The following are necessary only for Cygwin, and only are needed
1863 # when the user has tab-completed the executable name and consequently
1864 # included the '.exe' suffix.
1866 if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
1867 complete -o bashdefault -o default -o nospace -F _git git.exe 2>/dev/null \
1868 || complete -o default -o nospace -F _git git.exe