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.
43 # You can also see if currently something is stashed, by setting
44 # GIT_PS1_SHOWSTASHSTATE to a nonempty value. If something is stashed,
45 # then a '$' will be shown next to the branch name.
47 # If you would like to see if there're untracked files, then you can
48 # set GIT_PS1_SHOWUNTRACKEDFILES to a nonempty value. If there're
49 # untracked files, then a '%' will be shown next to the branch name.
53 # *) Read Documentation/SubmittingPatches
54 # *) Send all patches to the current maintainer:
56 # "Shawn O. Pearce" <spearce@spearce.org>
58 # *) Always CC the Git mailing list:
63 case "$COMP_WORDBREAKS" in
65 *) COMP_WORDBREAKS="$COMP_WORDBREAKS:"
68 # __gitdir accepts 0 or 1 arguments (i.e., location)
69 # returns location of .git repo
72 if [ -z "${1-}" ]; then
73 if [ -n "${__git_dir-}" ]; then
75 elif [ -d .git ]; then
78 git rev-parse --git-dir 2>/dev/null
80 elif [ -d "$1/.git" ]; then
87 # __git_ps1 accepts 0 or 1 arguments (i.e., format string)
88 # returns text to add to bash PS1 prompt (includes branch name)
95 if [ -f "$g/rebase-merge/interactive" ]; then
97 b="$(cat "$g/rebase-merge/head-name")"
98 elif [ -d "$g/rebase-merge" ]; then
100 b="$(cat "$g/rebase-merge/head-name")"
102 if [ -d "$g/rebase-apply" ]; then
103 if [ -f "$g/rebase-apply/rebasing" ]; then
105 elif [ -f "$g/rebase-apply/applying" ]; then
110 elif [ -f "$g/MERGE_HEAD" ]; then
112 elif [ -f "$g/BISECT_LOG" ]; then
116 b="$(git symbolic-ref HEAD 2>/dev/null)" || {
119 case "${GIT_PS1_DESCRIBE_STYLE-}" in
121 git describe --contains HEAD ;;
123 git describe --contains --all HEAD ;;
127 git describe --exact-match HEAD ;;
128 esac 2>/dev/null)" ||
130 b="$(cut -c1-7 "$g/HEAD" 2>/dev/null)..." ||
142 if [ "true" = "$(git rev-parse --is-inside-git-dir 2>/dev/null)" ]; then
143 if [ "true" = "$(git rev-parse --is-bare-repository 2>/dev/null)" ]; then
148 elif [ "true" = "$(git rev-parse --is-inside-work-tree 2>/dev/null)" ]; then
149 if [ -n "${GIT_PS1_SHOWDIRTYSTATE-}" ]; then
150 if [ "$(git config --bool bash.showDirtyState)" != "false" ]; then
151 git diff --no-ext-diff --ignore-submodules \
152 --quiet --exit-code || w="*"
153 if git rev-parse --quiet --verify HEAD >/dev/null; then
154 git diff-index --cached --quiet \
155 --ignore-submodules HEAD -- || i="+"
161 if [ -n "${GIT_PS1_SHOWSTASHSTATE-}" ]; then
162 git rev-parse --verify refs/stash >/dev/null 2>&1 && s="$"
165 if [ -n "${GIT_PS1_SHOWUNTRACKEDFILES-}" ]; then
166 if [ -n "$(git ls-files --others --exclude-standard)" ]; then
172 if [ -n "${1-}" ]; then
173 printf "$1" "$c${b##refs/heads/}$w$i$s$u$r"
175 printf " (%s)" "$c${b##refs/heads/}$w$i$s$u$r"
180 # __gitcomp_1 requires 2 arguments
183 local c IFS=' '$'\t'$'\n'
186 --*=*) printf %s$'\n' "$c$2" ;;
187 *.) printf %s$'\n' "$c$2" ;;
188 *) printf %s$'\n' "$c$2 " ;;
193 # __gitcomp accepts 1, 2, 3, or 4 arguments
194 # generates completion reply with compgen
197 local cur="${COMP_WORDS[COMP_CWORD]}"
198 if [ $# -gt 2 ]; then
207 COMPREPLY=($(compgen -P "${2-}" \
208 -W "$(__gitcomp_1 "${1-}" "${4-}")" \
214 # __git_heads accepts 0 or 1 arguments (to pass to __gitdir)
217 local cmd i is_hash=y dir="$(__gitdir "${1-}")"
218 if [ -d "$dir" ]; then
219 git --git-dir="$dir" for-each-ref --format='%(refname:short)' \
223 for i in $(git ls-remote "${1-}" 2>/dev/null); do
224 case "$is_hash,$i" in
227 n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;
228 n,*) is_hash=y; echo "$i" ;;
233 # __git_tags accepts 0 or 1 arguments (to pass to __gitdir)
236 local cmd i is_hash=y dir="$(__gitdir "${1-}")"
237 if [ -d "$dir" ]; then
238 git --git-dir="$dir" for-each-ref --format='%(refname:short)' \
242 for i in $(git ls-remote "${1-}" 2>/dev/null); do
243 case "$is_hash,$i" in
246 n,refs/tags/*) is_hash=y; echo "${i#refs/tags/}" ;;
247 n,*) is_hash=y; echo "$i" ;;
252 # __git_refs accepts 0 or 1 arguments (to pass to __gitdir)
255 local i is_hash=y dir="$(__gitdir "${1-}")"
256 local cur="${COMP_WORDS[COMP_CWORD]}" format refs
257 if [ -d "$dir" ]; then
264 if [ -e "$dir/HEAD" ]; then echo HEAD; fi
265 format="refname:short"
266 refs="refs/tags refs/heads refs/remotes"
269 git --git-dir="$dir" for-each-ref --format="%($format)" \
273 for i in $(git ls-remote "$dir" 2>/dev/null); do
274 case "$is_hash,$i" in
277 n,refs/tags/*) is_hash=y; echo "${i#refs/tags/}" ;;
278 n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;
279 n,refs/remotes/*) is_hash=y; echo "${i#refs/remotes/}" ;;
280 n,*) is_hash=y; echo "$i" ;;
285 # __git_refs2 requires 1 argument (to pass to __git_refs)
289 for i in $(__git_refs "$1"); do
294 # __git_refs_remotes requires 1 argument (to pass to ls-remote)
295 __git_refs_remotes ()
297 local cmd i is_hash=y
298 for i in $(git ls-remote "$1" 2>/dev/null); do
299 case "$is_hash,$i" in
302 echo "$i:refs/remotes/$1/${i#refs/heads/}"
306 n,refs/tags/*) is_hash=y;;
314 local i ngoff IFS=$'\n' d="$(__gitdir)"
315 shopt -q nullglob || ngoff=1
317 for i in "$d/remotes"/*; do
318 echo ${i#$d/remotes/}
320 [ "$ngoff" ] && shopt -u nullglob
321 for i in $(git --git-dir="$d" config --list); do
331 __git_merge_strategies ()
333 if [ -n "${__git_merge_strategylist-}" ]; then
334 echo "$__git_merge_strategylist"
337 git merge -s help 2>&1 |
338 sed -n -e '/[Aa]vailable strategies are: /,/^$/{
346 __git_merge_strategylist=
347 __git_merge_strategylist=$(__git_merge_strategies 2>/dev/null)
349 __git_complete_file ()
351 local pfx ls ref cur="${COMP_WORDS[COMP_CWORD]}"
368 case "$COMP_WORDBREAKS" in
370 *) pfx="$ref:$pfx" ;;
374 COMPREPLY=($(compgen -P "$pfx" \
375 -W "$(git --git-dir="$(__gitdir)" ls-tree "$ls" \
376 | sed '/^100... blob /{
392 __gitcomp "$(__git_refs)"
397 __git_complete_revlist ()
399 local pfx cur="${COMP_WORDS[COMP_CWORD]}"
404 __gitcomp "$(__git_refs)" "$pfx" "$cur"
409 __gitcomp "$(__git_refs)" "$pfx" "$cur"
412 __gitcomp "$(__git_refs)"
417 __git_complete_remote_or_refspec ()
419 local cmd="${COMP_WORDS[1]}"
420 local cur="${COMP_WORDS[COMP_CWORD]}"
421 local i c=2 remote="" pfx="" lhs=1 no_complete_refspec=0
422 while [ $c -lt $COMP_CWORD ]; do
425 --all|--mirror) [ "$cmd" = "push" ] && no_complete_refspec=1 ;;
427 *) remote="$i"; break ;;
431 if [ -z "$remote" ]; then
432 __gitcomp "$(__git_remotes)"
435 if [ $no_complete_refspec = 1 ]; then
439 [ "$remote" = "." ] && remote=
442 case "$COMP_WORDBREAKS" in
444 *) pfx="${cur%%:*}:" ;;
456 if [ $lhs = 1 ]; then
457 __gitcomp "$(__git_refs2 "$remote")" "$pfx" "$cur"
459 __gitcomp "$(__git_refs)" "$pfx" "$cur"
463 if [ $lhs = 1 ]; then
464 __gitcomp "$(__git_refs "$remote")" "$pfx" "$cur"
466 __gitcomp "$(__git_refs)" "$pfx" "$cur"
470 if [ $lhs = 1 ]; then
471 __gitcomp "$(__git_refs)" "$pfx" "$cur"
473 __gitcomp "$(__git_refs "$remote")" "$pfx" "$cur"
479 __git_complete_strategy ()
481 case "${COMP_WORDS[COMP_CWORD-1]}" in
483 __gitcomp "$(__git_merge_strategies)"
486 local cur="${COMP_WORDS[COMP_CWORD]}"
489 __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
496 __git_all_commands ()
498 if [ -n "${__git_all_commandlist-}" ]; then
499 echo "$__git_all_commandlist"
503 for i in $(git help -a|egrep '^ ')
506 *--*) : helper pattern;;
511 __git_all_commandlist=
512 __git_all_commandlist="$(__git_all_commands 2>/dev/null)"
514 __git_porcelain_commands ()
516 if [ -n "${__git_porcelain_commandlist-}" ]; then
517 echo "$__git_porcelain_commandlist"
521 for i in "help" $(__git_all_commands)
524 *--*) : helper pattern;;
525 applymbox) : ask gittus;;
526 applypatch) : ask gittus;;
527 archimport) : import;;
528 cat-file) : plumbing;;
529 check-attr) : plumbing;;
530 check-ref-format) : plumbing;;
531 checkout-index) : plumbing;;
532 commit-tree) : plumbing;;
533 count-objects) : infrequent;;
534 cvsexportcommit) : export;;
535 cvsimport) : import;;
536 cvsserver) : daemon;;
538 diff-files) : plumbing;;
539 diff-index) : plumbing;;
540 diff-tree) : plumbing;;
541 fast-import) : import;;
542 fast-export) : export;;
543 fsck-objects) : plumbing;;
544 fetch-pack) : plumbing;;
545 fmt-merge-msg) : plumbing;;
546 for-each-ref) : plumbing;;
547 hash-object) : plumbing;;
548 http-*) : transport;;
549 index-pack) : plumbing;;
550 init-db) : deprecated;;
551 local-fetch) : plumbing;;
552 lost-found) : infrequent;;
553 ls-files) : plumbing;;
554 ls-remote) : plumbing;;
555 ls-tree) : plumbing;;
556 mailinfo) : plumbing;;
557 mailsplit) : plumbing;;
558 merge-*) : plumbing;;
561 pack-objects) : plumbing;;
562 pack-redundant) : plumbing;;
563 pack-refs) : plumbing;;
564 parse-remote) : plumbing;;
565 patch-id) : plumbing;;
566 peek-remote) : plumbing;;
568 prune-packed) : plumbing;;
569 quiltimport) : import;;
570 read-tree) : plumbing;;
571 receive-pack) : plumbing;;
573 repo-config) : deprecated;;
575 rev-list) : plumbing;;
576 rev-parse) : plumbing;;
577 runstatus) : plumbing;;
578 sh-setup) : internal;;
580 show-ref) : plumbing;;
581 send-pack) : plumbing;;
582 show-index) : plumbing;;
584 stripspace) : plumbing;;
585 symbolic-ref) : plumbing;;
586 tar-tree) : deprecated;;
587 unpack-file) : plumbing;;
588 unpack-objects) : plumbing;;
589 update-index) : plumbing;;
590 update-ref) : plumbing;;
591 update-server-info) : daemon;;
592 upload-archive) : plumbing;;
593 upload-pack) : plumbing;;
594 write-tree) : plumbing;;
596 verify-pack) : infrequent;;
597 verify-tag) : plumbing;;
602 __git_porcelain_commandlist=
603 __git_porcelain_commandlist="$(__git_porcelain_commands 2>/dev/null)"
608 for i in $(git --git-dir="$(__gitdir)" config --list); do
618 # __git_aliased_command requires 1 argument
619 __git_aliased_command ()
621 local word cmdline=$(git --git-dir="$(__gitdir)" \
622 config --get "alias.$1")
623 for word in $cmdline; do
624 if [ "${word##-*}" ]; then
631 # __git_find_subcommand requires 1 argument
632 __git_find_subcommand ()
634 local word subcommand c=1
636 while [ $c -lt $COMP_CWORD ]; do
637 word="${COMP_WORDS[c]}"
638 for subcommand in $1; do
639 if [ "$subcommand" = "$word" ]; then
648 __git_has_doubledash ()
651 while [ $c -lt $COMP_CWORD ]; do
652 if [ "--" = "${COMP_WORDS[c]}" ]; then
660 __git_whitespacelist="nowarn warn error error-all fix"
664 local cur="${COMP_WORDS[COMP_CWORD]}" dir="$(__gitdir)"
665 if [ -d "$dir"/rebase-apply ]; then
666 __gitcomp "--skip --resolved --abort"
671 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
676 --3way --committer-date-is-author-date --ignore-date
677 --interactive --keep --no-utf8 --signoff --utf8
687 local cur="${COMP_WORDS[COMP_CWORD]}"
690 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
695 --stat --numstat --summary --check --index
696 --cached --index-info --reverse --reject --unidiff-zero
697 --apply --no-add --exclude=
698 --whitespace= --inaccurate-eof --verbose
707 __git_has_doubledash && return
709 local cur="${COMP_WORDS[COMP_CWORD]}"
713 --interactive --refresh --patch --update --dry-run
714 --ignore-errors --intent-to-add
723 local cur="${COMP_WORDS[COMP_CWORD]}"
726 __gitcomp "$(git archive --list)" "" "${cur##--format=}"
730 __gitcomp "$(__git_remotes)" "" "${cur##--remote=}"
735 --format= --list --verbose
736 --prefix= --remote= --exec=
746 __git_has_doubledash && return
748 local subcommands="start bad good skip reset visualize replay log run"
749 local subcommand="$(__git_find_subcommand "$subcommands")"
750 if [ -z "$subcommand" ]; then
751 __gitcomp "$subcommands"
755 case "$subcommand" in
757 __gitcomp "$(__git_refs)"
767 local i c=1 only_local_ref="n" has_r="n"
769 while [ $c -lt $COMP_CWORD ]; do
772 -d|-m) only_local_ref="y" ;;
778 case "${COMP_WORDS[COMP_CWORD]}" in
781 --color --no-color --verbose --abbrev= --no-abbrev
782 --track --no-track --contains --merged --no-merged
786 if [ $only_local_ref = "y" -a $has_r = "n" ]; then
787 __gitcomp "$(__git_heads)"
789 __gitcomp "$(__git_refs)"
797 local cmd="${COMP_WORDS[2]}"
798 case "$COMP_CWORD" in
800 __gitcomp "create list-heads verify unbundle"
808 __git_complete_revlist
817 __git_has_doubledash && return
819 __gitcomp "$(__git_refs)"
824 __gitcomp "$(__git_refs)"
829 local cur="${COMP_WORDS[COMP_CWORD]}"
832 __gitcomp "--edit --no-commit"
835 __gitcomp "$(__git_refs)"
842 __git_has_doubledash && return
844 local cur="${COMP_WORDS[COMP_CWORD]}"
847 __gitcomp "--dry-run --quiet"
856 local cur="${COMP_WORDS[COMP_CWORD]}"
881 __git_has_doubledash && return
883 local cur="${COMP_WORDS[COMP_CWORD]}"
887 --all --author= --signoff --verify --no-verify
888 --edit --amend --include --only --interactive
897 local cur="${COMP_WORDS[COMP_CWORD]}"
901 --all --tags --contains --abbrev= --candidates=
902 --exact-match --debug --long --match --always
906 __gitcomp "$(__git_refs)"
909 __git_diff_common_options="--stat --numstat --shortstat --summary
910 --patch-with-stat --name-only --name-status --color
911 --no-color --color-words --no-renames --check
912 --full-index --binary --abbrev --diff-filter=
914 --text --ignore-space-at-eol --ignore-space-change
915 --ignore-all-space --exit-code --quiet --ext-diff
917 --no-prefix --src-prefix= --dst-prefix=
918 --inter-hunk-context=
925 __git_has_doubledash && return
927 local cur="${COMP_WORDS[COMP_CWORD]}"
930 __gitcomp "--cached --staged --pickaxe-all --pickaxe-regex
931 --base --ours --theirs
932 $__git_diff_common_options
940 __git_mergetools_common="diffuse ecmerge emerge kdiff3 meld opendiff
941 tkdiff vimdiff gvimdiff xxdiff araxis
946 local cur="${COMP_WORDS[COMP_CWORD]}"
949 __gitcomp "$__git_mergetools_common kompare" "" "${cur##--tool=}"
960 __git_fetch_options="
961 --quiet --verbose --append --upload-pack --force --keep --depth=
967 local cur="${COMP_WORDS[COMP_CWORD]}"
970 __gitcomp "$__git_fetch_options"
974 __git_complete_remote_or_refspec
979 local cur="${COMP_WORDS[COMP_CWORD]}"
984 " "" "${cur##--thread=}"
989 --stdout --attach --no-attach --thread --thread=
991 --numbered --start-number
996 --full-index --binary
999 --no-prefix --src-prefix= --dst-prefix=
1000 --inline --suffix= --ignore-if-in-upstream
1006 __git_complete_revlist
1011 local cur="${COMP_WORDS[COMP_CWORD]}"
1015 --tags --root --unreachable --cache --no-reflogs --full
1016 --strict --verbose --lost-found
1026 local cur="${COMP_WORDS[COMP_CWORD]}"
1029 __gitcomp "--prune --aggressive"
1038 __git_has_doubledash && return
1040 local cur="${COMP_WORDS[COMP_CWORD]}"
1045 --text --ignore-case --word-regexp --invert-match
1047 --extended-regexp --basic-regexp --fixed-strings
1048 --files-with-matches --name-only
1049 --files-without-match
1051 --and --or --not --all-match
1061 local cur="${COMP_WORDS[COMP_CWORD]}"
1064 __gitcomp "--all --info --man --web"
1068 __gitcomp "$(__git_all_commands)
1069 attributes cli core-tutorial cvs-migration
1070 diffcore gitk glossary hooks ignore modules
1071 repository-layout tutorial tutorial-2
1078 local cur="${COMP_WORDS[COMP_CWORD]}"
1082 false true umask group all world everybody
1083 " "" "${cur##--shared=}"
1087 __gitcomp "--quiet --bare --template= --shared --shared="
1096 __git_has_doubledash && return
1098 local cur="${COMP_WORDS[COMP_CWORD]}"
1101 __gitcomp "--cached --deleted --modified --others --ignored
1102 --stage --directory --no-empty-directory --unmerged
1103 --killed --exclude= --exclude-from=
1104 --exclude-per-directory= --exclude-standard
1105 --error-unmatch --with-tree= --full-name
1106 --abbrev --ignored --exclude-per-directory
1116 __gitcomp "$(__git_remotes)"
1124 # Options that go well for log, shortlog and gitk
1125 __git_log_common_options="
1127 --branches --tags --remotes
1128 --first-parent --merges --no-merges
1130 --max-age= --since= --after=
1131 --min-age= --until= --before=
1133 # Options that go well for log and gitk (not shortlog)
1134 __git_log_gitk_options="
1135 --dense --sparse --full-history
1136 --simplify-merges --simplify-by-decoration
1139 # Options that go well for log and shortlog (not gitk)
1140 __git_log_shortlog_options="
1141 --author= --committer= --grep=
1145 __git_log_pretty_formats="oneline short medium full fuller email raw format:"
1146 __git_log_date_formats="relative iso8601 rfc2822 short local default raw"
1150 __git_has_doubledash && return
1152 local cur="${COMP_WORDS[COMP_CWORD]}"
1153 local g="$(git rev-parse --git-dir 2>/dev/null)"
1155 if [ -f "$g/MERGE_HEAD" ]; then
1160 __gitcomp "$__git_log_pretty_formats
1161 " "" "${cur##--pretty=}"
1165 __gitcomp "$__git_log_pretty_formats
1166 " "" "${cur##--format=}"
1170 __gitcomp "$__git_log_date_formats" "" "${cur##--date=}"
1175 $__git_log_common_options
1176 $__git_log_shortlog_options
1177 $__git_log_gitk_options
1178 --root --topo-order --date-order --reverse
1179 --follow --full-diff
1180 --abbrev-commit --abbrev=
1181 --relative-date --date=
1182 --pretty= --format= --oneline
1187 --parents --children
1189 $__git_diff_common_options
1190 --pickaxe-all --pickaxe-regex
1195 __git_complete_revlist
1198 __git_merge_options="
1199 --no-commit --no-stat --log --no-log --squash --strategy
1200 --commit --stat --no-squash --ff --no-ff
1205 __git_complete_strategy && return
1207 local cur="${COMP_WORDS[COMP_CWORD]}"
1210 __gitcomp "$__git_merge_options"
1213 __gitcomp "$(__git_refs)"
1218 local cur="${COMP_WORDS[COMP_CWORD]}"
1221 __gitcomp "$__git_mergetools_common tortoisemerge" "" "${cur##--tool=}"
1234 __gitcomp "$(__git_refs)"
1239 local cur="${COMP_WORDS[COMP_CWORD]}"
1242 __gitcomp "--dry-run"
1251 __gitcomp "--tags --all --stdin"
1256 __git_complete_strategy && return
1258 local cur="${COMP_WORDS[COMP_CWORD]}"
1262 --rebase --no-rebase
1263 $__git_merge_options
1264 $__git_fetch_options
1269 __git_complete_remote_or_refspec
1274 local cur="${COMP_WORDS[COMP_CWORD]}"
1275 case "${COMP_WORDS[COMP_CWORD-1]}" in
1277 __gitcomp "$(__git_remotes)"
1282 __gitcomp "$(__git_remotes)" "" "${cur##--repo=}"
1287 --all --mirror --tags --dry-run --force --verbose
1288 --receive-pack= --repo=
1293 __git_complete_remote_or_refspec
1298 local cur="${COMP_WORDS[COMP_CWORD]}" dir="$(__gitdir)"
1299 if [ -d "$dir"/rebase-apply ] || [ -d "$dir"/rebase-merge ]; then
1300 __gitcomp "--continue --skip --abort"
1303 __git_complete_strategy && return
1306 __gitcomp "--onto --merge --strategy --interactive"
1309 __gitcomp "$(__git_refs)"
1312 __git_send_email_confirm_options="always never auto cc compose"
1313 __git_send_email_suppresscc_options="author self cc bodycc sob cccmd body all"
1317 local cur="${COMP_WORDS[COMP_CWORD]}"
1321 $__git_send_email_confirm_options
1322 " "" "${cur##--confirm=}"
1327 $__git_send_email_suppresscc_options
1328 " "" "${cur##--suppress-cc=}"
1332 --smtp-encryption=*)
1333 __gitcomp "ssl tls" "" "${cur##--smtp-encryption=}"
1337 __gitcomp "--annotate --bcc --cc --cc-cmd --chain-reply-to
1338 --compose --confirm= --dry-run --envelope-sender
1340 --in-reply-to --no-chain-reply-to --no-signed-off-by-cc
1341 --no-suppress-from --no-thread --quiet
1342 --signed-off-by-cc --smtp-pass --smtp-server
1343 --smtp-server-port --smtp-encryption= --smtp-user
1344 --subject --suppress-cc= --suppress-from --thread --to
1345 --validate --no-validate"
1352 __git_config_get_set_variables ()
1354 local prevword word config_file= c=$COMP_CWORD
1355 while [ $c -gt 1 ]; do
1356 word="${COMP_WORDS[c]}"
1358 --global|--system|--file=*)
1363 config_file="$word $prevword"
1371 git --git-dir="$(__gitdir)" config $config_file --list 2>/dev/null |
1384 local cur="${COMP_WORDS[COMP_CWORD]}"
1385 local prv="${COMP_WORDS[COMP_CWORD-1]}"
1388 __gitcomp "$(__git_remotes)"
1392 __gitcomp "$(__git_refs)"
1396 local remote="${prv#remote.}"
1397 remote="${remote%.fetch}"
1398 __gitcomp "$(__git_refs_remotes "$remote")"
1402 local remote="${prv#remote.}"
1403 remote="${remote%.push}"
1404 __gitcomp "$(git --git-dir="$(__gitdir)" \
1405 for-each-ref --format='%(refname):%(refname)' \
1409 pull.twohead|pull.octopus)
1410 __gitcomp "$(__git_merge_strategies)"
1413 color.branch|color.diff|color.interactive|\
1414 color.showbranch|color.status|color.ui)
1415 __gitcomp "always never auto"
1419 __gitcomp "false true"
1424 normal black red green yellow blue magenta cyan white
1425 bold dim ul blink reverse
1430 __gitcomp "man info web html"
1434 __gitcomp "$__git_log_date_formats"
1437 sendemail.aliasesfiletype)
1438 __gitcomp "mutt mailrc pine elm gnus"
1442 __gitcomp "$__git_send_email_confirm_options"
1445 sendemail.suppresscc)
1446 __gitcomp "$__git_send_email_suppresscc_options"
1449 --get|--get-all|--unset|--unset-all)
1450 __gitcomp "$(__git_config_get_set_variables)"
1461 --global --system --file=
1462 --list --replace-all
1463 --get --get-all --get-regexp
1464 --add --unset --unset-all
1465 --remove-section --rename-section
1470 local pfx="${cur%.*}."
1472 __gitcomp "remote merge mergeoptions rebase" "$pfx" "$cur"
1476 local pfx="${cur%.*}."
1478 __gitcomp "$(__git_heads)" "$pfx" "$cur" "."
1482 local pfx="${cur%.*}."
1485 argprompt cmd confirm needsfile noconsole norescan
1486 prompt revprompt revunmerged title
1491 local pfx="${cur%.*}."
1493 __gitcomp "cmd path" "$pfx" "$cur"
1497 local pfx="${cur%.*}."
1499 __gitcomp "cmd path" "$pfx" "$cur"
1503 local pfx="${cur%.*}."
1505 __gitcomp "cmd path trustExitCode" "$pfx" "$cur"
1509 local pfx="${cur%.*}."
1511 __gitcomp "$(__git_all_commands)" "$pfx" "$cur"
1515 local pfx="${cur%.*}."
1518 url proxy fetch push mirror skipDefaultUpdate
1519 receivepack uploadpack tagopt pushurl
1524 local pfx="${cur%.*}."
1526 __gitcomp "$(__git_remotes)" "$pfx" "$cur" "."
1530 local pfx="${cur%.*}."
1532 __gitcomp "insteadof" "$pfx" "$cur"
1540 branch.autosetupmerge
1541 branch.autosetuprebase
1544 color.branch.current
1555 color.diff.whitespace
1560 color.interactive.header
1561 color.interactive.help
1562 color.interactive.prompt
1567 color.status.changed
1569 color.status.nobranch
1570 color.status.untracked
1571 color.status.updated
1578 core.deltaBaseCacheLimit
1582 core.fsyncobjectfiles
1584 core.ignoreCygwinFSTricks
1586 core.logAllRefUpdates
1587 core.loosecompression
1589 core.packedGitWindowSize
1591 core.preferSymlinkRefs
1594 core.repositoryFormatVersion
1596 core.sharedRepository
1599 core.warnAmbiguousRefs
1602 diff.autorefreshindex
1608 diff.suppressBlankEmpty
1620 format.subjectprefix
1629 gc.reflogexpireunreachable
1633 gitcvs.commitmsgannotation
1634 gitcvs.dbTableNamePrefix
1645 gui.copyblamethreshold
1649 gui.matchtrackingbranch
1650 gui.newbranchtemplate
1651 gui.pruneduringfetch
1652 gui.spellingdictionary
1668 i18n.logOutputEncoding
1673 imap.preformattedHTML
1682 interactive.singlekey
1695 mergetool.keepBackup
1698 pack.deltaCacheLimit
1711 receive.denyCurrentBranch
1713 receive.denyNonFastForwards
1716 repack.usedeltabaseoffset
1719 sendemail.aliasesfile
1720 sendemail.aliasesfiletype
1724 sendemail.chainreplyto
1726 sendemail.envelopesender
1728 sendemail.signedoffbycc
1729 sendemail.smtpencryption
1731 sendemail.smtpserver
1732 sendemail.smtpserverport
1734 sendemail.suppresscc
1735 sendemail.suppressfrom
1740 status.relativePaths
1741 status.showUntrackedFiles
1743 transfer.unpackLimit
1755 local subcommands="add rename rm show prune update set-head"
1756 local subcommand="$(__git_find_subcommand "$subcommands")"
1757 if [ -z "$subcommand" ]; then
1758 __gitcomp "$subcommands"
1762 case "$subcommand" in
1763 rename|rm|show|prune)
1764 __gitcomp "$(__git_remotes)"
1767 local i c='' IFS=$'\n'
1768 for i in $(git --git-dir="$(__gitdir)" config --list); do
1786 __git_has_doubledash && return
1788 local cur="${COMP_WORDS[COMP_CWORD]}"
1791 __gitcomp "--merge --mixed --hard --soft"
1795 __gitcomp "$(__git_refs)"
1800 local cur="${COMP_WORDS[COMP_CWORD]}"
1803 __gitcomp "--edit --mainline --no-edit --no-commit --signoff"
1807 __gitcomp "$(__git_refs)"
1812 __git_has_doubledash && return
1814 local cur="${COMP_WORDS[COMP_CWORD]}"
1817 __gitcomp "--cached --dry-run --ignore-unmatch --quiet"
1826 __git_has_doubledash && return
1828 local cur="${COMP_WORDS[COMP_CWORD]}"
1832 $__git_log_common_options
1833 $__git_log_shortlog_options
1834 --numbered --summary
1839 __git_complete_revlist
1844 __git_has_doubledash && return
1846 local cur="${COMP_WORDS[COMP_CWORD]}"
1849 __gitcomp "$__git_log_pretty_formats
1850 " "" "${cur##--pretty=}"
1854 __gitcomp "$__git_log_pretty_formats
1855 " "" "${cur##--format=}"
1859 __gitcomp "--pretty= --format= --abbrev-commit --oneline
1860 $__git_diff_common_options
1870 local cur="${COMP_WORDS[COMP_CWORD]}"
1874 --all --remotes --topo-order --current --more=
1875 --list --independent --merge-base --no-name
1877 --sha1-name --sparse --topics --reflog
1882 __git_complete_revlist
1887 local subcommands='save list show apply clear drop pop create branch'
1888 local subcommand="$(__git_find_subcommand "$subcommands")"
1889 if [ -z "$subcommand" ]; then
1890 __gitcomp "$subcommands"
1892 local cur="${COMP_WORDS[COMP_CWORD]}"
1893 case "$subcommand,$cur" in
1895 __gitcomp "--keep-index"
1900 show,--*|drop,--*|branch,--*)
1903 show,*|apply,*|drop,*|pop,*|branch,*)
1904 __gitcomp "$(git --git-dir="$(__gitdir)" stash list \
1905 | sed -n -e 's/:.*//p')"
1916 __git_has_doubledash && return
1918 local subcommands="add status init update summary foreach sync"
1919 if [ -z "$(__git_find_subcommand "$subcommands")" ]; then
1920 local cur="${COMP_WORDS[COMP_CWORD]}"
1923 __gitcomp "--quiet --cached"
1926 __gitcomp "$subcommands"
1936 init fetch clone rebase dcommit log find-rev
1937 set-tree commit-diff info create-ignore propget
1938 proplist show-ignore show-externals branch tag blame
1941 local subcommand="$(__git_find_subcommand "$subcommands")"
1942 if [ -z "$subcommand" ]; then
1943 __gitcomp "$subcommands"
1945 local remote_opts="--username= --config-dir= --no-auth-cache"
1947 --follow-parent --authors-file= --repack=
1948 --no-metadata --use-svm-props --use-svnsync-props
1949 --log-window-size= --no-checkout --quiet
1950 --repack-flags --use-log-author --localtime
1951 --ignore-paths= $remote_opts
1954 --template= --shared= --trunk= --tags=
1955 --branches= --stdlayout --minimize-url
1956 --no-metadata --use-svm-props --use-svnsync-props
1957 --rewrite-root= --prefix= --use-log-author
1958 --add-author-from $remote_opts
1961 --edit --rmdir --find-copies-harder --copy-similarity=
1964 local cur="${COMP_WORDS[COMP_CWORD]}"
1965 case "$subcommand,$cur" in
1967 __gitcomp "--revision= --fetch-all $fc_opts"
1970 __gitcomp "--revision= $fc_opts $init_opts"
1973 __gitcomp "$init_opts"
1977 --merge --strategy= --verbose --dry-run
1978 --fetch-all --no-rebase --commit-url
1979 --revision $cmt_opts $fc_opts
1983 __gitcomp "--stdin $cmt_opts $fc_opts"
1985 create-ignore,--*|propget,--*|proplist,--*|show-ignore,--*|\
1987 __gitcomp "--revision="
1991 --limit= --revision= --verbose --incremental
1992 --oneline --show-commit --non-recursive
1993 --authors-file= --color
1998 --merge --verbose --strategy= --local
1999 --fetch-all --dry-run $fc_opts
2003 __gitcomp "--message= --file= --revision= $cmt_opts"
2009 __gitcomp "--dry-run --message --tag"
2012 __gitcomp "--dry-run --message"
2015 __gitcomp "--git-format"
2019 --config-dir= --ignore-paths= --minimize
2020 --no-auth-cache --username=
2033 while [ $c -lt $COMP_CWORD ]; do
2034 i="${COMP_WORDS[c]}"
2037 __gitcomp "$(__git_tags)"
2047 case "${COMP_WORDS[COMP_CWORD-1]}" in
2053 __gitcomp "$(__git_tags)"
2059 __gitcomp "$(__git_refs)"
2066 local i c=1 command __git_dir
2068 while [ $c -lt $COMP_CWORD ]; do
2069 i="${COMP_WORDS[c]}"
2071 --git-dir=*) __git_dir="${i#--git-dir=}" ;;
2072 --bare) __git_dir="." ;;
2073 --version|-p|--paginate) ;;
2074 --help) command="help"; break ;;
2075 *) command="$i"; break ;;
2080 if [ -z "$command" ]; then
2081 case "${COMP_WORDS[COMP_CWORD]}" in
2094 *) __gitcomp "$(__git_porcelain_commands) $(__git_aliases)" ;;
2099 local expansion=$(__git_aliased_command "$command")
2100 [ "$expansion" ] && command="$expansion"
2105 apply) _git_apply ;;
2106 archive) _git_archive ;;
2107 bisect) _git_bisect ;;
2108 bundle) _git_bundle ;;
2109 branch) _git_branch ;;
2110 checkout) _git_checkout ;;
2111 cherry) _git_cherry ;;
2112 cherry-pick) _git_cherry_pick ;;
2113 clean) _git_clean ;;
2114 clone) _git_clone ;;
2115 commit) _git_commit ;;
2116 config) _git_config ;;
2117 describe) _git_describe ;;
2119 difftool) _git_difftool ;;
2120 fetch) _git_fetch ;;
2121 format-patch) _git_format_patch ;;
2128 ls-files) _git_ls_files ;;
2129 ls-remote) _git_ls_remote ;;
2130 ls-tree) _git_ls_tree ;;
2132 mergetool) _git_mergetool;;
2133 merge-base) _git_merge_base ;;
2135 name-rev) _git_name_rev ;;
2138 rebase) _git_rebase ;;
2139 remote) _git_remote ;;
2140 reset) _git_reset ;;
2141 revert) _git_revert ;;
2143 send-email) _git_send_email ;;
2144 shortlog) _git_shortlog ;;
2146 show-branch) _git_show_branch ;;
2147 stash) _git_stash ;;
2149 submodule) _git_submodule ;;
2152 whatchanged) _git_log ;;
2159 __git_has_doubledash && return
2161 local cur="${COMP_WORDS[COMP_CWORD]}"
2162 local g="$(__gitdir)"
2164 if [ -f "$g/MERGE_HEAD" ]; then
2170 $__git_log_common_options
2171 $__git_log_gitk_options
2177 __git_complete_revlist
2180 complete -o bashdefault -o default -o nospace -F _git git 2>/dev/null \
2181 || complete -o default -o nospace -F _git git
2182 complete -o bashdefault -o default -o nospace -F _gitk gitk 2>/dev/null \
2183 || complete -o default -o nospace -F _gitk gitk
2185 # The following are necessary only for Cygwin, and only are needed
2186 # when the user has tab-completed the executable name and consequently
2187 # included the '.exe' suffix.
2189 if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
2190 complete -o bashdefault -o default -o nospace -F _git git.exe 2>/dev/null \
2191 || complete -o default -o nospace -F _git git.exe