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 --ignore-whitespace --ignore-space-change
678 --interactive --keep --no-utf8 --signoff --utf8
688 local cur="${COMP_WORDS[COMP_CWORD]}"
691 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
696 --stat --numstat --summary --check --index
697 --cached --index-info --reverse --reject --unidiff-zero
698 --apply --no-add --exclude=
699 --ignore-whitespace --ignore-space-change
700 --whitespace= --inaccurate-eof --verbose
709 __git_has_doubledash && return
711 local cur="${COMP_WORDS[COMP_CWORD]}"
715 --interactive --refresh --patch --update --dry-run
716 --ignore-errors --intent-to-add
725 local cur="${COMP_WORDS[COMP_CWORD]}"
728 __gitcomp "$(git archive --list)" "" "${cur##--format=}"
732 __gitcomp "$(__git_remotes)" "" "${cur##--remote=}"
737 --format= --list --verbose
738 --prefix= --remote= --exec=
748 __git_has_doubledash && return
750 local subcommands="start bad good skip reset visualize replay log run"
751 local subcommand="$(__git_find_subcommand "$subcommands")"
752 if [ -z "$subcommand" ]; then
753 __gitcomp "$subcommands"
757 case "$subcommand" in
759 __gitcomp "$(__git_refs)"
769 local i c=1 only_local_ref="n" has_r="n"
771 while [ $c -lt $COMP_CWORD ]; do
774 -d|-m) only_local_ref="y" ;;
780 case "${COMP_WORDS[COMP_CWORD]}" in
783 --color --no-color --verbose --abbrev= --no-abbrev
784 --track --no-track --contains --merged --no-merged
788 if [ $only_local_ref = "y" -a $has_r = "n" ]; then
789 __gitcomp "$(__git_heads)"
791 __gitcomp "$(__git_refs)"
799 local cmd="${COMP_WORDS[2]}"
800 case "$COMP_CWORD" in
802 __gitcomp "create list-heads verify unbundle"
810 __git_complete_revlist
819 __git_has_doubledash && return
821 __gitcomp "$(__git_refs)"
826 __gitcomp "$(__git_refs)"
831 local cur="${COMP_WORDS[COMP_CWORD]}"
834 __gitcomp "--edit --no-commit"
837 __gitcomp "$(__git_refs)"
844 __git_has_doubledash && return
846 local cur="${COMP_WORDS[COMP_CWORD]}"
849 __gitcomp "--dry-run --quiet"
858 local cur="${COMP_WORDS[COMP_CWORD]}"
883 __git_has_doubledash && return
885 local cur="${COMP_WORDS[COMP_CWORD]}"
889 --all --author= --signoff --verify --no-verify
890 --edit --amend --include --only --interactive
899 local cur="${COMP_WORDS[COMP_CWORD]}"
903 --all --tags --contains --abbrev= --candidates=
904 --exact-match --debug --long --match --always
908 __gitcomp "$(__git_refs)"
911 __git_diff_common_options="--stat --numstat --shortstat --summary
912 --patch-with-stat --name-only --name-status --color
913 --no-color --color-words --no-renames --check
914 --full-index --binary --abbrev --diff-filter=
916 --text --ignore-space-at-eol --ignore-space-change
917 --ignore-all-space --exit-code --quiet --ext-diff
919 --no-prefix --src-prefix= --dst-prefix=
920 --inter-hunk-context=
927 __git_has_doubledash && return
929 local cur="${COMP_WORDS[COMP_CWORD]}"
932 __gitcomp "--cached --staged --pickaxe-all --pickaxe-regex
933 --base --ours --theirs
934 $__git_diff_common_options
942 __git_mergetools_common="diffuse ecmerge emerge kdiff3 meld opendiff
943 tkdiff vimdiff gvimdiff xxdiff araxis
948 local cur="${COMP_WORDS[COMP_CWORD]}"
951 __gitcomp "$__git_mergetools_common kompare" "" "${cur##--tool=}"
962 __git_fetch_options="
963 --quiet --verbose --append --upload-pack --force --keep --depth=
969 local cur="${COMP_WORDS[COMP_CWORD]}"
972 __gitcomp "$__git_fetch_options"
976 __git_complete_remote_or_refspec
981 local cur="${COMP_WORDS[COMP_CWORD]}"
986 " "" "${cur##--thread=}"
991 --stdout --attach --no-attach --thread --thread=
993 --numbered --start-number
998 --full-index --binary
1001 --no-prefix --src-prefix= --dst-prefix=
1002 --inline --suffix= --ignore-if-in-upstream
1008 __git_complete_revlist
1013 local cur="${COMP_WORDS[COMP_CWORD]}"
1017 --tags --root --unreachable --cache --no-reflogs --full
1018 --strict --verbose --lost-found
1028 local cur="${COMP_WORDS[COMP_CWORD]}"
1031 __gitcomp "--prune --aggressive"
1040 __git_has_doubledash && return
1042 local cur="${COMP_WORDS[COMP_CWORD]}"
1047 --text --ignore-case --word-regexp --invert-match
1049 --extended-regexp --basic-regexp --fixed-strings
1050 --files-with-matches --name-only
1051 --files-without-match
1053 --and --or --not --all-match
1063 local cur="${COMP_WORDS[COMP_CWORD]}"
1066 __gitcomp "--all --info --man --web"
1070 __gitcomp "$(__git_all_commands)
1071 attributes cli core-tutorial cvs-migration
1072 diffcore gitk glossary hooks ignore modules
1073 repository-layout tutorial tutorial-2
1080 local cur="${COMP_WORDS[COMP_CWORD]}"
1084 false true umask group all world everybody
1085 " "" "${cur##--shared=}"
1089 __gitcomp "--quiet --bare --template= --shared --shared="
1098 __git_has_doubledash && return
1100 local cur="${COMP_WORDS[COMP_CWORD]}"
1103 __gitcomp "--cached --deleted --modified --others --ignored
1104 --stage --directory --no-empty-directory --unmerged
1105 --killed --exclude= --exclude-from=
1106 --exclude-per-directory= --exclude-standard
1107 --error-unmatch --with-tree= --full-name
1108 --abbrev --ignored --exclude-per-directory
1118 __gitcomp "$(__git_remotes)"
1126 # Options that go well for log, shortlog and gitk
1127 __git_log_common_options="
1129 --branches --tags --remotes
1130 --first-parent --merges --no-merges
1132 --max-age= --since= --after=
1133 --min-age= --until= --before=
1135 # Options that go well for log and gitk (not shortlog)
1136 __git_log_gitk_options="
1137 --dense --sparse --full-history
1138 --simplify-merges --simplify-by-decoration
1141 # Options that go well for log and shortlog (not gitk)
1142 __git_log_shortlog_options="
1143 --author= --committer= --grep=
1147 __git_log_pretty_formats="oneline short medium full fuller email raw format:"
1148 __git_log_date_formats="relative iso8601 rfc2822 short local default raw"
1152 __git_has_doubledash && return
1154 local cur="${COMP_WORDS[COMP_CWORD]}"
1155 local g="$(git rev-parse --git-dir 2>/dev/null)"
1157 if [ -f "$g/MERGE_HEAD" ]; then
1162 __gitcomp "$__git_log_pretty_formats
1163 " "" "${cur##--pretty=}"
1167 __gitcomp "$__git_log_pretty_formats
1168 " "" "${cur##--format=}"
1172 __gitcomp "$__git_log_date_formats" "" "${cur##--date=}"
1177 $__git_log_common_options
1178 $__git_log_shortlog_options
1179 $__git_log_gitk_options
1180 --root --topo-order --date-order --reverse
1181 --follow --full-diff
1182 --abbrev-commit --abbrev=
1183 --relative-date --date=
1184 --pretty= --format= --oneline
1189 --parents --children
1191 $__git_diff_common_options
1192 --pickaxe-all --pickaxe-regex
1197 __git_complete_revlist
1200 __git_merge_options="
1201 --no-commit --no-stat --log --no-log --squash --strategy
1202 --commit --stat --no-squash --ff --no-ff
1207 __git_complete_strategy && return
1209 local cur="${COMP_WORDS[COMP_CWORD]}"
1212 __gitcomp "$__git_merge_options"
1215 __gitcomp "$(__git_refs)"
1220 local cur="${COMP_WORDS[COMP_CWORD]}"
1223 __gitcomp "$__git_mergetools_common tortoisemerge" "" "${cur##--tool=}"
1236 __gitcomp "$(__git_refs)"
1241 local cur="${COMP_WORDS[COMP_CWORD]}"
1244 __gitcomp "--dry-run"
1253 __gitcomp "--tags --all --stdin"
1258 __git_complete_strategy && return
1260 local cur="${COMP_WORDS[COMP_CWORD]}"
1264 --rebase --no-rebase
1265 $__git_merge_options
1266 $__git_fetch_options
1271 __git_complete_remote_or_refspec
1276 local cur="${COMP_WORDS[COMP_CWORD]}"
1277 case "${COMP_WORDS[COMP_CWORD-1]}" in
1279 __gitcomp "$(__git_remotes)"
1284 __gitcomp "$(__git_remotes)" "" "${cur##--repo=}"
1289 --all --mirror --tags --dry-run --force --verbose
1290 --receive-pack= --repo=
1295 __git_complete_remote_or_refspec
1300 local cur="${COMP_WORDS[COMP_CWORD]}" dir="$(__gitdir)"
1301 if [ -d "$dir"/rebase-apply ] || [ -d "$dir"/rebase-merge ]; then
1302 __gitcomp "--continue --skip --abort"
1305 __git_complete_strategy && return
1308 __gitcomp "--onto --merge --strategy --interactive"
1311 __gitcomp "$(__git_refs)"
1314 __git_send_email_confirm_options="always never auto cc compose"
1315 __git_send_email_suppresscc_options="author self cc bodycc sob cccmd body all"
1319 local cur="${COMP_WORDS[COMP_CWORD]}"
1323 $__git_send_email_confirm_options
1324 " "" "${cur##--confirm=}"
1329 $__git_send_email_suppresscc_options
1330 " "" "${cur##--suppress-cc=}"
1334 --smtp-encryption=*)
1335 __gitcomp "ssl tls" "" "${cur##--smtp-encryption=}"
1339 __gitcomp "--annotate --bcc --cc --cc-cmd --chain-reply-to
1340 --compose --confirm= --dry-run --envelope-sender
1342 --in-reply-to --no-chain-reply-to --no-signed-off-by-cc
1343 --no-suppress-from --no-thread --quiet
1344 --signed-off-by-cc --smtp-pass --smtp-server
1345 --smtp-server-port --smtp-encryption= --smtp-user
1346 --subject --suppress-cc= --suppress-from --thread --to
1347 --validate --no-validate"
1354 __git_config_get_set_variables ()
1356 local prevword word config_file= c=$COMP_CWORD
1357 while [ $c -gt 1 ]; do
1358 word="${COMP_WORDS[c]}"
1360 --global|--system|--file=*)
1365 config_file="$word $prevword"
1373 git --git-dir="$(__gitdir)" config $config_file --list 2>/dev/null |
1386 local cur="${COMP_WORDS[COMP_CWORD]}"
1387 local prv="${COMP_WORDS[COMP_CWORD-1]}"
1390 __gitcomp "$(__git_remotes)"
1394 __gitcomp "$(__git_refs)"
1398 local remote="${prv#remote.}"
1399 remote="${remote%.fetch}"
1400 __gitcomp "$(__git_refs_remotes "$remote")"
1404 local remote="${prv#remote.}"
1405 remote="${remote%.push}"
1406 __gitcomp "$(git --git-dir="$(__gitdir)" \
1407 for-each-ref --format='%(refname):%(refname)' \
1411 pull.twohead|pull.octopus)
1412 __gitcomp "$(__git_merge_strategies)"
1415 color.branch|color.diff|color.interactive|\
1416 color.showbranch|color.status|color.ui)
1417 __gitcomp "always never auto"
1421 __gitcomp "false true"
1426 normal black red green yellow blue magenta cyan white
1427 bold dim ul blink reverse
1432 __gitcomp "man info web html"
1436 __gitcomp "$__git_log_date_formats"
1439 sendemail.aliasesfiletype)
1440 __gitcomp "mutt mailrc pine elm gnus"
1444 __gitcomp "$__git_send_email_confirm_options"
1447 sendemail.suppresscc)
1448 __gitcomp "$__git_send_email_suppresscc_options"
1451 --get|--get-all|--unset|--unset-all)
1452 __gitcomp "$(__git_config_get_set_variables)"
1463 --global --system --file=
1464 --list --replace-all
1465 --get --get-all --get-regexp
1466 --add --unset --unset-all
1467 --remove-section --rename-section
1472 local pfx="${cur%.*}."
1474 __gitcomp "remote merge mergeoptions rebase" "$pfx" "$cur"
1478 local pfx="${cur%.*}."
1480 __gitcomp "$(__git_heads)" "$pfx" "$cur" "."
1484 local pfx="${cur%.*}."
1487 argprompt cmd confirm needsfile noconsole norescan
1488 prompt revprompt revunmerged title
1493 local pfx="${cur%.*}."
1495 __gitcomp "cmd path" "$pfx" "$cur"
1499 local pfx="${cur%.*}."
1501 __gitcomp "cmd path" "$pfx" "$cur"
1505 local pfx="${cur%.*}."
1507 __gitcomp "cmd path trustExitCode" "$pfx" "$cur"
1511 local pfx="${cur%.*}."
1513 __gitcomp "$(__git_all_commands)" "$pfx" "$cur"
1517 local pfx="${cur%.*}."
1520 url proxy fetch push mirror skipDefaultUpdate
1521 receivepack uploadpack tagopt pushurl
1526 local pfx="${cur%.*}."
1528 __gitcomp "$(__git_remotes)" "$pfx" "$cur" "."
1532 local pfx="${cur%.*}."
1534 __gitcomp "insteadof" "$pfx" "$cur"
1541 apply.ignorewhitespace
1543 branch.autosetupmerge
1544 branch.autosetuprebase
1547 color.branch.current
1558 color.diff.whitespace
1563 color.interactive.header
1564 color.interactive.help
1565 color.interactive.prompt
1570 color.status.changed
1572 color.status.nobranch
1573 color.status.untracked
1574 color.status.updated
1581 core.deltaBaseCacheLimit
1585 core.fsyncobjectfiles
1587 core.ignoreCygwinFSTricks
1589 core.logAllRefUpdates
1590 core.loosecompression
1592 core.packedGitWindowSize
1594 core.preferSymlinkRefs
1597 core.repositoryFormatVersion
1599 core.sharedRepository
1602 core.warnAmbiguousRefs
1605 diff.autorefreshindex
1611 diff.suppressBlankEmpty
1623 format.subjectprefix
1632 gc.reflogexpireunreachable
1636 gitcvs.commitmsgannotation
1637 gitcvs.dbTableNamePrefix
1648 gui.copyblamethreshold
1652 gui.matchtrackingbranch
1653 gui.newbranchtemplate
1654 gui.pruneduringfetch
1655 gui.spellingdictionary
1671 i18n.logOutputEncoding
1676 imap.preformattedHTML
1685 interactive.singlekey
1698 mergetool.keepBackup
1701 pack.deltaCacheLimit
1714 receive.denyCurrentBranch
1716 receive.denyNonFastForwards
1719 repack.usedeltabaseoffset
1722 sendemail.aliasesfile
1723 sendemail.aliasesfiletype
1727 sendemail.chainreplyto
1729 sendemail.envelopesender
1731 sendemail.signedoffbycc
1732 sendemail.smtpencryption
1734 sendemail.smtpserver
1735 sendemail.smtpserverport
1737 sendemail.suppresscc
1738 sendemail.suppressfrom
1743 status.relativePaths
1744 status.showUntrackedFiles
1746 transfer.unpackLimit
1758 local subcommands="add rename rm show prune update set-head"
1759 local subcommand="$(__git_find_subcommand "$subcommands")"
1760 if [ -z "$subcommand" ]; then
1761 __gitcomp "$subcommands"
1765 case "$subcommand" in
1766 rename|rm|show|prune)
1767 __gitcomp "$(__git_remotes)"
1770 local i c='' IFS=$'\n'
1771 for i in $(git --git-dir="$(__gitdir)" config --list); do
1789 __git_has_doubledash && return
1791 local cur="${COMP_WORDS[COMP_CWORD]}"
1794 __gitcomp "--merge --mixed --hard --soft"
1798 __gitcomp "$(__git_refs)"
1803 local cur="${COMP_WORDS[COMP_CWORD]}"
1806 __gitcomp "--edit --mainline --no-edit --no-commit --signoff"
1810 __gitcomp "$(__git_refs)"
1815 __git_has_doubledash && return
1817 local cur="${COMP_WORDS[COMP_CWORD]}"
1820 __gitcomp "--cached --dry-run --ignore-unmatch --quiet"
1829 __git_has_doubledash && return
1831 local cur="${COMP_WORDS[COMP_CWORD]}"
1835 $__git_log_common_options
1836 $__git_log_shortlog_options
1837 --numbered --summary
1842 __git_complete_revlist
1847 __git_has_doubledash && return
1849 local cur="${COMP_WORDS[COMP_CWORD]}"
1852 __gitcomp "$__git_log_pretty_formats
1853 " "" "${cur##--pretty=}"
1857 __gitcomp "$__git_log_pretty_formats
1858 " "" "${cur##--format=}"
1862 __gitcomp "--pretty= --format= --abbrev-commit --oneline
1863 $__git_diff_common_options
1873 local cur="${COMP_WORDS[COMP_CWORD]}"
1877 --all --remotes --topo-order --current --more=
1878 --list --independent --merge-base --no-name
1880 --sha1-name --sparse --topics --reflog
1885 __git_complete_revlist
1890 local subcommands='save list show apply clear drop pop create branch'
1891 local subcommand="$(__git_find_subcommand "$subcommands")"
1892 if [ -z "$subcommand" ]; then
1893 __gitcomp "$subcommands"
1895 local cur="${COMP_WORDS[COMP_CWORD]}"
1896 case "$subcommand,$cur" in
1898 __gitcomp "--keep-index"
1903 show,--*|drop,--*|branch,--*)
1906 show,*|apply,*|drop,*|pop,*|branch,*)
1907 __gitcomp "$(git --git-dir="$(__gitdir)" stash list \
1908 | sed -n -e 's/:.*//p')"
1919 __git_has_doubledash && return
1921 local subcommands="add status init update summary foreach sync"
1922 if [ -z "$(__git_find_subcommand "$subcommands")" ]; then
1923 local cur="${COMP_WORDS[COMP_CWORD]}"
1926 __gitcomp "--quiet --cached"
1929 __gitcomp "$subcommands"
1939 init fetch clone rebase dcommit log find-rev
1940 set-tree commit-diff info create-ignore propget
1941 proplist show-ignore show-externals branch tag blame
1944 local subcommand="$(__git_find_subcommand "$subcommands")"
1945 if [ -z "$subcommand" ]; then
1946 __gitcomp "$subcommands"
1948 local remote_opts="--username= --config-dir= --no-auth-cache"
1950 --follow-parent --authors-file= --repack=
1951 --no-metadata --use-svm-props --use-svnsync-props
1952 --log-window-size= --no-checkout --quiet
1953 --repack-flags --use-log-author --localtime
1954 --ignore-paths= $remote_opts
1957 --template= --shared= --trunk= --tags=
1958 --branches= --stdlayout --minimize-url
1959 --no-metadata --use-svm-props --use-svnsync-props
1960 --rewrite-root= --prefix= --use-log-author
1961 --add-author-from $remote_opts
1964 --edit --rmdir --find-copies-harder --copy-similarity=
1967 local cur="${COMP_WORDS[COMP_CWORD]}"
1968 case "$subcommand,$cur" in
1970 __gitcomp "--revision= --fetch-all $fc_opts"
1973 __gitcomp "--revision= $fc_opts $init_opts"
1976 __gitcomp "$init_opts"
1980 --merge --strategy= --verbose --dry-run
1981 --fetch-all --no-rebase --commit-url
1982 --revision $cmt_opts $fc_opts
1986 __gitcomp "--stdin $cmt_opts $fc_opts"
1988 create-ignore,--*|propget,--*|proplist,--*|show-ignore,--*|\
1990 __gitcomp "--revision="
1994 --limit= --revision= --verbose --incremental
1995 --oneline --show-commit --non-recursive
1996 --authors-file= --color
2001 --merge --verbose --strategy= --local
2002 --fetch-all --dry-run $fc_opts
2006 __gitcomp "--message= --file= --revision= $cmt_opts"
2012 __gitcomp "--dry-run --message --tag"
2015 __gitcomp "--dry-run --message"
2018 __gitcomp "--git-format"
2022 --config-dir= --ignore-paths= --minimize
2023 --no-auth-cache --username=
2036 while [ $c -lt $COMP_CWORD ]; do
2037 i="${COMP_WORDS[c]}"
2040 __gitcomp "$(__git_tags)"
2050 case "${COMP_WORDS[COMP_CWORD-1]}" in
2056 __gitcomp "$(__git_tags)"
2062 __gitcomp "$(__git_refs)"
2069 local i c=1 command __git_dir
2071 while [ $c -lt $COMP_CWORD ]; do
2072 i="${COMP_WORDS[c]}"
2074 --git-dir=*) __git_dir="${i#--git-dir=}" ;;
2075 --bare) __git_dir="." ;;
2076 --version|-p|--paginate) ;;
2077 --help) command="help"; break ;;
2078 *) command="$i"; break ;;
2083 if [ -z "$command" ]; then
2084 case "${COMP_WORDS[COMP_CWORD]}" in
2097 *) __gitcomp "$(__git_porcelain_commands) $(__git_aliases)" ;;
2102 local expansion=$(__git_aliased_command "$command")
2103 [ "$expansion" ] && command="$expansion"
2108 apply) _git_apply ;;
2109 archive) _git_archive ;;
2110 bisect) _git_bisect ;;
2111 bundle) _git_bundle ;;
2112 branch) _git_branch ;;
2113 checkout) _git_checkout ;;
2114 cherry) _git_cherry ;;
2115 cherry-pick) _git_cherry_pick ;;
2116 clean) _git_clean ;;
2117 clone) _git_clone ;;
2118 commit) _git_commit ;;
2119 config) _git_config ;;
2120 describe) _git_describe ;;
2122 difftool) _git_difftool ;;
2123 fetch) _git_fetch ;;
2124 format-patch) _git_format_patch ;;
2131 ls-files) _git_ls_files ;;
2132 ls-remote) _git_ls_remote ;;
2133 ls-tree) _git_ls_tree ;;
2135 mergetool) _git_mergetool;;
2136 merge-base) _git_merge_base ;;
2138 name-rev) _git_name_rev ;;
2141 rebase) _git_rebase ;;
2142 remote) _git_remote ;;
2143 reset) _git_reset ;;
2144 revert) _git_revert ;;
2146 send-email) _git_send_email ;;
2147 shortlog) _git_shortlog ;;
2149 show-branch) _git_show_branch ;;
2150 stash) _git_stash ;;
2152 submodule) _git_submodule ;;
2155 whatchanged) _git_log ;;
2162 __git_has_doubledash && return
2164 local cur="${COMP_WORDS[COMP_CWORD]}"
2165 local g="$(__gitdir)"
2167 if [ -f "$g/MERGE_HEAD" ]; then
2173 $__git_log_common_options
2174 $__git_log_gitk_options
2180 __git_complete_revlist
2183 complete -o bashdefault -o default -o nospace -F _git git 2>/dev/null \
2184 || complete -o default -o nospace -F _git git
2185 complete -o bashdefault -o default -o nospace -F _gitk gitk 2>/dev/null \
2186 || complete -o default -o nospace -F _gitk gitk
2188 # The following are necessary only for Cygwin, and only are needed
2189 # when the user has tab-completed the executable name and consequently
2190 # included the '.exe' suffix.
2192 if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
2193 complete -o bashdefault -o default -o nospace -F _git git.exe 2>/dev/null \
2194 || complete -o default -o nospace -F _git git.exe