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
1052 --and --or --not --all-match
1062 local cur="${COMP_WORDS[COMP_CWORD]}"
1065 __gitcomp "--all --info --man --web"
1069 __gitcomp "$(__git_all_commands)
1070 attributes cli core-tutorial cvs-migration
1071 diffcore gitk glossary hooks ignore modules
1072 repository-layout tutorial tutorial-2
1079 local cur="${COMP_WORDS[COMP_CWORD]}"
1083 false true umask group all world everybody
1084 " "" "${cur##--shared=}"
1088 __gitcomp "--quiet --bare --template= --shared --shared="
1097 __git_has_doubledash && return
1099 local cur="${COMP_WORDS[COMP_CWORD]}"
1102 __gitcomp "--cached --deleted --modified --others --ignored
1103 --stage --directory --no-empty-directory --unmerged
1104 --killed --exclude= --exclude-from=
1105 --exclude-per-directory= --exclude-standard
1106 --error-unmatch --with-tree= --full-name
1107 --abbrev --ignored --exclude-per-directory
1117 __gitcomp "$(__git_remotes)"
1125 # Options that go well for log, shortlog and gitk
1126 __git_log_common_options="
1128 --branches --tags --remotes
1129 --first-parent --merges --no-merges
1131 --max-age= --since= --after=
1132 --min-age= --until= --before=
1134 # Options that go well for log and gitk (not shortlog)
1135 __git_log_gitk_options="
1136 --dense --sparse --full-history
1137 --simplify-merges --simplify-by-decoration
1140 # Options that go well for log and shortlog (not gitk)
1141 __git_log_shortlog_options="
1142 --author= --committer= --grep=
1146 __git_log_pretty_formats="oneline short medium full fuller email raw format:"
1147 __git_log_date_formats="relative iso8601 rfc2822 short local default raw"
1151 __git_has_doubledash && return
1153 local cur="${COMP_WORDS[COMP_CWORD]}"
1154 local g="$(git rev-parse --git-dir 2>/dev/null)"
1156 if [ -f "$g/MERGE_HEAD" ]; then
1161 __gitcomp "$__git_log_pretty_formats
1162 " "" "${cur##--pretty=}"
1166 __gitcomp "$__git_log_pretty_formats
1167 " "" "${cur##--format=}"
1171 __gitcomp "$__git_log_date_formats" "" "${cur##--date=}"
1176 $__git_log_common_options
1177 $__git_log_shortlog_options
1178 $__git_log_gitk_options
1179 --root --topo-order --date-order --reverse
1180 --follow --full-diff
1181 --abbrev-commit --abbrev=
1182 --relative-date --date=
1183 --pretty= --format= --oneline
1188 --parents --children
1190 $__git_diff_common_options
1191 --pickaxe-all --pickaxe-regex
1196 __git_complete_revlist
1199 __git_merge_options="
1200 --no-commit --no-stat --log --no-log --squash --strategy
1201 --commit --stat --no-squash --ff --no-ff
1206 __git_complete_strategy && return
1208 local cur="${COMP_WORDS[COMP_CWORD]}"
1211 __gitcomp "$__git_merge_options"
1214 __gitcomp "$(__git_refs)"
1219 local cur="${COMP_WORDS[COMP_CWORD]}"
1222 __gitcomp "$__git_mergetools_common tortoisemerge" "" "${cur##--tool=}"
1235 __gitcomp "$(__git_refs)"
1240 local cur="${COMP_WORDS[COMP_CWORD]}"
1243 __gitcomp "--dry-run"
1252 __gitcomp "--tags --all --stdin"
1257 __git_complete_strategy && return
1259 local cur="${COMP_WORDS[COMP_CWORD]}"
1263 --rebase --no-rebase
1264 $__git_merge_options
1265 $__git_fetch_options
1270 __git_complete_remote_or_refspec
1275 local cur="${COMP_WORDS[COMP_CWORD]}"
1276 case "${COMP_WORDS[COMP_CWORD-1]}" in
1278 __gitcomp "$(__git_remotes)"
1283 __gitcomp "$(__git_remotes)" "" "${cur##--repo=}"
1288 --all --mirror --tags --dry-run --force --verbose
1289 --receive-pack= --repo=
1294 __git_complete_remote_or_refspec
1299 local cur="${COMP_WORDS[COMP_CWORD]}" dir="$(__gitdir)"
1300 if [ -d "$dir"/rebase-apply ] || [ -d "$dir"/rebase-merge ]; then
1301 __gitcomp "--continue --skip --abort"
1304 __git_complete_strategy && return
1307 __gitcomp "--onto --merge --strategy --interactive"
1310 __gitcomp "$(__git_refs)"
1313 __git_send_email_confirm_options="always never auto cc compose"
1314 __git_send_email_suppresscc_options="author self cc bodycc sob cccmd body all"
1318 local cur="${COMP_WORDS[COMP_CWORD]}"
1322 $__git_send_email_confirm_options
1323 " "" "${cur##--confirm=}"
1328 $__git_send_email_suppresscc_options
1329 " "" "${cur##--suppress-cc=}"
1333 --smtp-encryption=*)
1334 __gitcomp "ssl tls" "" "${cur##--smtp-encryption=}"
1338 __gitcomp "--annotate --bcc --cc --cc-cmd --chain-reply-to
1339 --compose --confirm= --dry-run --envelope-sender
1341 --in-reply-to --no-chain-reply-to --no-signed-off-by-cc
1342 --no-suppress-from --no-thread --quiet
1343 --signed-off-by-cc --smtp-pass --smtp-server
1344 --smtp-server-port --smtp-encryption= --smtp-user
1345 --subject --suppress-cc= --suppress-from --thread --to
1346 --validate --no-validate"
1353 __git_config_get_set_variables ()
1355 local prevword word config_file= c=$COMP_CWORD
1356 while [ $c -gt 1 ]; do
1357 word="${COMP_WORDS[c]}"
1359 --global|--system|--file=*)
1364 config_file="$word $prevword"
1372 git --git-dir="$(__gitdir)" config $config_file --list 2>/dev/null |
1385 local cur="${COMP_WORDS[COMP_CWORD]}"
1386 local prv="${COMP_WORDS[COMP_CWORD-1]}"
1389 __gitcomp "$(__git_remotes)"
1393 __gitcomp "$(__git_refs)"
1397 local remote="${prv#remote.}"
1398 remote="${remote%.fetch}"
1399 __gitcomp "$(__git_refs_remotes "$remote")"
1403 local remote="${prv#remote.}"
1404 remote="${remote%.push}"
1405 __gitcomp "$(git --git-dir="$(__gitdir)" \
1406 for-each-ref --format='%(refname):%(refname)' \
1410 pull.twohead|pull.octopus)
1411 __gitcomp "$(__git_merge_strategies)"
1414 color.branch|color.diff|color.interactive|\
1415 color.showbranch|color.status|color.ui)
1416 __gitcomp "always never auto"
1420 __gitcomp "false true"
1425 normal black red green yellow blue magenta cyan white
1426 bold dim ul blink reverse
1431 __gitcomp "man info web html"
1435 __gitcomp "$__git_log_date_formats"
1438 sendemail.aliasesfiletype)
1439 __gitcomp "mutt mailrc pine elm gnus"
1443 __gitcomp "$__git_send_email_confirm_options"
1446 sendemail.suppresscc)
1447 __gitcomp "$__git_send_email_suppresscc_options"
1450 --get|--get-all|--unset|--unset-all)
1451 __gitcomp "$(__git_config_get_set_variables)"
1462 --global --system --file=
1463 --list --replace-all
1464 --get --get-all --get-regexp
1465 --add --unset --unset-all
1466 --remove-section --rename-section
1471 local pfx="${cur%.*}."
1473 __gitcomp "remote merge mergeoptions rebase" "$pfx" "$cur"
1477 local pfx="${cur%.*}."
1479 __gitcomp "$(__git_heads)" "$pfx" "$cur" "."
1483 local pfx="${cur%.*}."
1486 argprompt cmd confirm needsfile noconsole norescan
1487 prompt revprompt revunmerged title
1492 local pfx="${cur%.*}."
1494 __gitcomp "cmd path" "$pfx" "$cur"
1498 local pfx="${cur%.*}."
1500 __gitcomp "cmd path" "$pfx" "$cur"
1504 local pfx="${cur%.*}."
1506 __gitcomp "cmd path trustExitCode" "$pfx" "$cur"
1510 local pfx="${cur%.*}."
1512 __gitcomp "$(__git_all_commands)" "$pfx" "$cur"
1516 local pfx="${cur%.*}."
1519 url proxy fetch push mirror skipDefaultUpdate
1520 receivepack uploadpack tagopt pushurl
1525 local pfx="${cur%.*}."
1527 __gitcomp "$(__git_remotes)" "$pfx" "$cur" "."
1531 local pfx="${cur%.*}."
1533 __gitcomp "insteadof" "$pfx" "$cur"
1541 branch.autosetupmerge
1542 branch.autosetuprebase
1545 color.branch.current
1556 color.diff.whitespace
1561 color.interactive.header
1562 color.interactive.help
1563 color.interactive.prompt
1568 color.status.changed
1570 color.status.nobranch
1571 color.status.untracked
1572 color.status.updated
1579 core.deltaBaseCacheLimit
1583 core.fsyncobjectfiles
1585 core.ignoreCygwinFSTricks
1587 core.logAllRefUpdates
1588 core.loosecompression
1590 core.packedGitWindowSize
1592 core.preferSymlinkRefs
1595 core.repositoryFormatVersion
1597 core.sharedRepository
1600 core.warnAmbiguousRefs
1603 diff.autorefreshindex
1609 diff.suppressBlankEmpty
1621 format.subjectprefix
1630 gc.reflogexpireunreachable
1634 gitcvs.commitmsgannotation
1635 gitcvs.dbTableNamePrefix
1646 gui.copyblamethreshold
1650 gui.matchtrackingbranch
1651 gui.newbranchtemplate
1652 gui.pruneduringfetch
1653 gui.spellingdictionary
1669 i18n.logOutputEncoding
1674 imap.preformattedHTML
1683 interactive.singlekey
1696 mergetool.keepBackup
1699 pack.deltaCacheLimit
1712 receive.denyCurrentBranch
1714 receive.denyNonFastForwards
1717 repack.usedeltabaseoffset
1720 sendemail.aliasesfile
1721 sendemail.aliasesfiletype
1725 sendemail.chainreplyto
1727 sendemail.envelopesender
1729 sendemail.signedoffbycc
1730 sendemail.smtpencryption
1732 sendemail.smtpserver
1733 sendemail.smtpserverport
1735 sendemail.suppresscc
1736 sendemail.suppressfrom
1741 status.relativePaths
1742 status.showUntrackedFiles
1744 transfer.unpackLimit
1756 local subcommands="add rename rm show prune update set-head"
1757 local subcommand="$(__git_find_subcommand "$subcommands")"
1758 if [ -z "$subcommand" ]; then
1759 __gitcomp "$subcommands"
1763 case "$subcommand" in
1764 rename|rm|show|prune)
1765 __gitcomp "$(__git_remotes)"
1768 local i c='' IFS=$'\n'
1769 for i in $(git --git-dir="$(__gitdir)" config --list); do
1787 __git_has_doubledash && return
1789 local cur="${COMP_WORDS[COMP_CWORD]}"
1792 __gitcomp "--merge --mixed --hard --soft"
1796 __gitcomp "$(__git_refs)"
1801 local cur="${COMP_WORDS[COMP_CWORD]}"
1804 __gitcomp "--edit --mainline --no-edit --no-commit --signoff"
1808 __gitcomp "$(__git_refs)"
1813 __git_has_doubledash && return
1815 local cur="${COMP_WORDS[COMP_CWORD]}"
1818 __gitcomp "--cached --dry-run --ignore-unmatch --quiet"
1827 __git_has_doubledash && return
1829 local cur="${COMP_WORDS[COMP_CWORD]}"
1833 $__git_log_common_options
1834 $__git_log_shortlog_options
1835 --numbered --summary
1840 __git_complete_revlist
1845 __git_has_doubledash && return
1847 local cur="${COMP_WORDS[COMP_CWORD]}"
1850 __gitcomp "$__git_log_pretty_formats
1851 " "" "${cur##--pretty=}"
1855 __gitcomp "$__git_log_pretty_formats
1856 " "" "${cur##--format=}"
1860 __gitcomp "--pretty= --format= --abbrev-commit --oneline
1861 $__git_diff_common_options
1871 local cur="${COMP_WORDS[COMP_CWORD]}"
1875 --all --remotes --topo-order --current --more=
1876 --list --independent --merge-base --no-name
1878 --sha1-name --sparse --topics --reflog
1883 __git_complete_revlist
1888 local subcommands='save list show apply clear drop pop create branch'
1889 local subcommand="$(__git_find_subcommand "$subcommands")"
1890 if [ -z "$subcommand" ]; then
1891 __gitcomp "$subcommands"
1893 local cur="${COMP_WORDS[COMP_CWORD]}"
1894 case "$subcommand,$cur" in
1896 __gitcomp "--keep-index"
1901 show,--*|drop,--*|branch,--*)
1904 show,*|apply,*|drop,*|pop,*|branch,*)
1905 __gitcomp "$(git --git-dir="$(__gitdir)" stash list \
1906 | sed -n -e 's/:.*//p')"
1917 __git_has_doubledash && return
1919 local subcommands="add status init update summary foreach sync"
1920 if [ -z "$(__git_find_subcommand "$subcommands")" ]; then
1921 local cur="${COMP_WORDS[COMP_CWORD]}"
1924 __gitcomp "--quiet --cached"
1927 __gitcomp "$subcommands"
1937 init fetch clone rebase dcommit log find-rev
1938 set-tree commit-diff info create-ignore propget
1939 proplist show-ignore show-externals branch tag blame
1942 local subcommand="$(__git_find_subcommand "$subcommands")"
1943 if [ -z "$subcommand" ]; then
1944 __gitcomp "$subcommands"
1946 local remote_opts="--username= --config-dir= --no-auth-cache"
1948 --follow-parent --authors-file= --repack=
1949 --no-metadata --use-svm-props --use-svnsync-props
1950 --log-window-size= --no-checkout --quiet
1951 --repack-flags --use-log-author --localtime
1952 --ignore-paths= $remote_opts
1955 --template= --shared= --trunk= --tags=
1956 --branches= --stdlayout --minimize-url
1957 --no-metadata --use-svm-props --use-svnsync-props
1958 --rewrite-root= --prefix= --use-log-author
1959 --add-author-from $remote_opts
1962 --edit --rmdir --find-copies-harder --copy-similarity=
1965 local cur="${COMP_WORDS[COMP_CWORD]}"
1966 case "$subcommand,$cur" in
1968 __gitcomp "--revision= --fetch-all $fc_opts"
1971 __gitcomp "--revision= $fc_opts $init_opts"
1974 __gitcomp "$init_opts"
1978 --merge --strategy= --verbose --dry-run
1979 --fetch-all --no-rebase --commit-url
1980 --revision $cmt_opts $fc_opts
1984 __gitcomp "--stdin $cmt_opts $fc_opts"
1986 create-ignore,--*|propget,--*|proplist,--*|show-ignore,--*|\
1988 __gitcomp "--revision="
1992 --limit= --revision= --verbose --incremental
1993 --oneline --show-commit --non-recursive
1994 --authors-file= --color
1999 --merge --verbose --strategy= --local
2000 --fetch-all --dry-run $fc_opts
2004 __gitcomp "--message= --file= --revision= $cmt_opts"
2010 __gitcomp "--dry-run --message --tag"
2013 __gitcomp "--dry-run --message"
2016 __gitcomp "--git-format"
2020 --config-dir= --ignore-paths= --minimize
2021 --no-auth-cache --username=
2034 while [ $c -lt $COMP_CWORD ]; do
2035 i="${COMP_WORDS[c]}"
2038 __gitcomp "$(__git_tags)"
2048 case "${COMP_WORDS[COMP_CWORD-1]}" in
2054 __gitcomp "$(__git_tags)"
2060 __gitcomp "$(__git_refs)"
2067 local i c=1 command __git_dir
2069 while [ $c -lt $COMP_CWORD ]; do
2070 i="${COMP_WORDS[c]}"
2072 --git-dir=*) __git_dir="${i#--git-dir=}" ;;
2073 --bare) __git_dir="." ;;
2074 --version|-p|--paginate) ;;
2075 --help) command="help"; break ;;
2076 *) command="$i"; break ;;
2081 if [ -z "$command" ]; then
2082 case "${COMP_WORDS[COMP_CWORD]}" in
2095 *) __gitcomp "$(__git_porcelain_commands) $(__git_aliases)" ;;
2100 local expansion=$(__git_aliased_command "$command")
2101 [ "$expansion" ] && command="$expansion"
2106 apply) _git_apply ;;
2107 archive) _git_archive ;;
2108 bisect) _git_bisect ;;
2109 bundle) _git_bundle ;;
2110 branch) _git_branch ;;
2111 checkout) _git_checkout ;;
2112 cherry) _git_cherry ;;
2113 cherry-pick) _git_cherry_pick ;;
2114 clean) _git_clean ;;
2115 clone) _git_clone ;;
2116 commit) _git_commit ;;
2117 config) _git_config ;;
2118 describe) _git_describe ;;
2120 difftool) _git_difftool ;;
2121 fetch) _git_fetch ;;
2122 format-patch) _git_format_patch ;;
2129 ls-files) _git_ls_files ;;
2130 ls-remote) _git_ls_remote ;;
2131 ls-tree) _git_ls_tree ;;
2133 mergetool) _git_mergetool;;
2134 merge-base) _git_merge_base ;;
2136 name-rev) _git_name_rev ;;
2139 rebase) _git_rebase ;;
2140 remote) _git_remote ;;
2141 reset) _git_reset ;;
2142 revert) _git_revert ;;
2144 send-email) _git_send_email ;;
2145 shortlog) _git_shortlog ;;
2147 show-branch) _git_show_branch ;;
2148 stash) _git_stash ;;
2150 submodule) _git_submodule ;;
2153 whatchanged) _git_log ;;
2160 __git_has_doubledash && return
2162 local cur="${COMP_WORDS[COMP_CWORD]}"
2163 local g="$(__gitdir)"
2165 if [ -f "$g/MERGE_HEAD" ]; then
2171 $__git_log_common_options
2172 $__git_log_gitk_options
2178 __git_complete_revlist
2181 complete -o bashdefault -o default -o nospace -F _git git 2>/dev/null \
2182 || complete -o default -o nospace -F _git git
2183 complete -o bashdefault -o default -o nospace -F _gitk gitk 2>/dev/null \
2184 || complete -o default -o nospace -F _gitk gitk
2186 # The following are necessary only for Cygwin, and only are needed
2187 # when the user has tab-completed the executable name and consequently
2188 # included the '.exe' suffix.
2190 if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
2191 complete -o bashdefault -o default -o nospace -F _git git.exe 2>/dev/null \
2192 || complete -o default -o nospace -F _git git.exe