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) Consider changing your PS1 to also show the current branch:
25 # PS1='[\u@\h \W$(__git_ps1 " (%s)")]\$ '
27 # The argument to __git_ps1 will be displayed only if you
28 # are currently in a git repository. The %s token will be
29 # the name of the current branch.
31 # In addition, if you set GIT_PS1_SHOWDIRTYSTATE to a nonempty
32 # value, unstaged (*) and staged (+) changes will be shown next
33 # to the branch name. You can configure this per-repository
34 # with the bash.showDirtyState variable, which defaults to true
35 # once GIT_PS1_SHOWDIRTYSTATE is enabled.
37 # You can also see if currently something is stashed, by setting
38 # GIT_PS1_SHOWSTASHSTATE to a nonempty value. If something is stashed,
39 # then a '$' will be shown next to the branch name.
41 # If you would like to see if there're untracked files, then you can
42 # set GIT_PS1_SHOWUNTRACKEDFILES to a nonempty value. If there're
43 # untracked files, then a '%' will be shown next to the branch name.
47 # *) Read Documentation/SubmittingPatches
48 # *) Send all patches to the current maintainer:
50 # "Shawn O. Pearce" <spearce@spearce.org>
52 # *) Always CC the Git mailing list:
57 case "$COMP_WORDBREAKS" in
59 *) COMP_WORDBREAKS
="$COMP_WORDBREAKS:"
62 # __gitdir accepts 0 or 1 arguments (i.e., location)
63 # returns location of .git repo
66 if [ -z "${1-}" ]; then
67 if [ -n "${__git_dir-}" ]; then
69 elif [ -d .git
]; then
72 git rev-parse
--git-dir 2>/dev
/null
74 elif [ -d "$1/.git" ]; then
81 # __git_ps1 accepts 0 or 1 arguments (i.e., format string)
82 # returns text to add to bash PS1 prompt (includes branch name)
89 if [ -f "$g/rebase-merge/interactive" ]; then
91 b
="$(cat "$g/rebase-merge
/head-name
")"
92 elif [ -d "$g/rebase-merge" ]; then
94 b
="$(cat "$g/rebase-merge
/head-name
")"
96 if [ -d "$g/rebase-apply" ]; then
97 if [ -f "$g/rebase-apply/rebasing" ]; then
99 elif [ -f "$g/rebase-apply/applying" ]; then
104 elif [ -f "$g/MERGE_HEAD" ]; then
106 elif [ -f "$g/BISECT_LOG" ]; then
110 b
="$(git symbolic-ref HEAD 2>/dev/null)" ||
{
113 case "${GIT_PS1_DESCRIBE_STYLE-}" in
115 git describe --contains HEAD ;;
117 git describe --contains --all HEAD ;;
121 git describe --exact-match HEAD ;;
122 esac 2>/dev/null)" ||
124 b
="$(cut -c1-7 "$g/HEAD
" 2>/dev/null)..." ||
136 if [ "true" = "$(git rev-parse --is-inside-git-dir 2>/dev/null)" ]; then
137 if [ "true" = "$(git rev-parse --is-bare-repository 2>/dev/null)" ]; then
142 elif [ "true" = "$(git rev-parse --is-inside-work-tree 2>/dev/null)" ]; then
143 if [ -n "${GIT_PS1_SHOWDIRTYSTATE-}" ]; then
144 if [ "$(git config --bool bash.showDirtyState)" != "false" ]; then
145 git
diff --no-ext-diff --quiet --exit-code || w
="*"
146 if git rev-parse
--quiet --verify HEAD
>/dev
/null
; then
147 git diff-index
--cached --quiet HEAD
-- || i
="+"
153 if [ -n "${GIT_PS1_SHOWSTASHSTATE-}" ]; then
154 git rev-parse
--verify refs
/stash
>/dev
/null
2>&1 && s
="$"
157 if [ -n "${GIT_PS1_SHOWUNTRACKEDFILES-}" ]; then
158 if [ -n "$(git ls-files --others --exclude-standard)" ]; then
164 if [ -n "${1-}" ]; then
165 printf "$1" "$c${b##refs/heads/}$w$i$s$u$r"
167 printf " (%s)" "$c${b##refs/heads/}$w$i$s$u$r"
172 # __gitcomp_1 requires 2 arguments
175 local c IFS
=' '$
'\t'$
'\n'
178 --*=*) printf %s$
'\n' "$c$2" ;;
179 *.
) printf %s$
'\n' "$c$2" ;;
180 *) printf %s$
'\n' "$c$2 " ;;
185 # __gitcomp accepts 1, 2, 3, or 4 arguments
186 # generates completion reply with compgen
189 local cur
="${COMP_WORDS[COMP_CWORD]}"
190 if [ $# -gt 2 ]; then
199 COMPREPLY
=($
(compgen
-P "${2-}" \
200 -W "$(__gitcomp_1 "${1-}" "${4-}")" \
206 # __git_heads accepts 0 or 1 arguments (to pass to __gitdir)
209 local cmd i is_hash
=y dir
="$(__gitdir "${1-}")"
210 if [ -d "$dir" ]; then
211 git
--git-dir="$dir" for-each-ref
--format='%(refname:short)' \
215 for i
in $
(git ls-remote
"${1-}" 2>/dev
/null
); do
216 case "$is_hash,$i" in
219 n
,refs
/heads
/*) is_hash
=y
; echo "${i#refs/heads/}" ;;
220 n
,*) is_hash
=y
; echo "$i" ;;
225 # __git_tags accepts 0 or 1 arguments (to pass to __gitdir)
228 local cmd i is_hash
=y dir
="$(__gitdir "${1-}")"
229 if [ -d "$dir" ]; then
230 git
--git-dir="$dir" for-each-ref
--format='%(refname:short)' \
234 for i
in $
(git ls-remote
"${1-}" 2>/dev
/null
); do
235 case "$is_hash,$i" in
238 n
,refs
/tags
/*) is_hash
=y
; echo "${i#refs/tags/}" ;;
239 n
,*) is_hash
=y
; echo "$i" ;;
244 # __git_refs accepts 0 or 1 arguments (to pass to __gitdir)
247 local i is_hash
=y dir
="$(__gitdir "${1-}")"
248 local cur
="${COMP_WORDS[COMP_CWORD]}" format refs
249 if [ -d "$dir" ]; then
256 if [ -e "$dir/HEAD" ]; then echo HEAD
; fi
257 format
="refname:short"
258 refs
="refs/tags refs/heads refs/remotes"
261 git
--git-dir="$dir" for-each-ref
--format="%($format)" \
265 for i
in $
(git ls-remote
"$dir" 2>/dev
/null
); do
266 case "$is_hash,$i" in
269 n
,refs
/tags
/*) is_hash
=y
; echo "${i#refs/tags/}" ;;
270 n
,refs
/heads
/*) is_hash
=y
; echo "${i#refs/heads/}" ;;
271 n
,refs
/remotes
/*) is_hash
=y
; echo "${i#refs/remotes/}" ;;
272 n
,*) is_hash
=y
; echo "$i" ;;
277 # __git_refs2 requires 1 argument (to pass to __git_refs)
281 for i
in $
(__git_refs
"$1"); do
286 # __git_refs_remotes requires 1 argument (to pass to ls-remote)
287 __git_refs_remotes
()
289 local cmd i is_hash
=y
290 for i
in $
(git ls-remote
"$1" 2>/dev
/null
); do
291 case "$is_hash,$i" in
294 echo "$i:refs/remotes/$1/${i#refs/heads/}"
298 n
,refs
/tags
/*) is_hash
=y
;;
306 local i ngoff IFS
=$
'\n' d
="$(__gitdir)"
307 shopt -q nullglob || ngoff
=1
309 for i
in "$d/remotes"/*; do
310 echo ${i#$d/remotes/}
312 [ "$ngoff" ] && shopt -u nullglob
313 for i
in $
(git
--git-dir="$d" config
--get-regexp 'remote\..*\.url' 2>/dev
/null
); do
319 __git_list_merge_strategies
()
321 git merge
-s help 2>&1 |
322 sed -n -e '/[Aa]vailable strategies are: /,/^$/{
331 __git_merge_strategies
=
332 # 'git merge -s help' (and thus detection of the merge strategy
333 # list) fails, unfortunately, if run outside of any git working
334 # tree. __git_merge_strategies is set to the empty string in
335 # that case, and the detection will be repeated the next time it
337 __git_compute_merge_strategies
()
339 : ${__git_merge_strategies:=$(__git_list_merge_strategies)}
342 __git_complete_file
()
344 local pfx
ls ref cur
="${COMP_WORDS[COMP_CWORD]}"
361 case "$COMP_WORDBREAKS" in
363 *) pfx
="$ref:$pfx" ;;
367 COMPREPLY
=($
(compgen
-P "$pfx" \
368 -W "$(git --git-dir="$
(__gitdir
)" ls-tree "$ls" \
369 | sed '/^100... blob /{
385 __gitcomp
"$(__git_refs)"
390 __git_complete_revlist
()
392 local pfx cur
="${COMP_WORDS[COMP_CWORD]}"
397 __gitcomp
"$(__git_refs)" "$pfx" "$cur"
402 __gitcomp
"$(__git_refs)" "$pfx" "$cur"
405 __gitcomp
"$(__git_refs)"
410 __git_complete_remote_or_refspec
()
412 local cmd
="${COMP_WORDS[1]}"
413 local cur
="${COMP_WORDS[COMP_CWORD]}"
414 local i c
=2 remote
="" pfx
="" lhs
=1 no_complete_refspec
=0
415 while [ $c -lt $COMP_CWORD ]; do
418 --mirror) [ "$cmd" = "push" ] && no_complete_refspec
=1 ;;
421 push
) no_complete_refspec
=1 ;;
430 *) remote
="$i"; break ;;
434 if [ -z "$remote" ]; then
435 __gitcomp
"$(__git_remotes)"
438 if [ $no_complete_refspec = 1 ]; then
442 [ "$remote" = "." ] && remote
=
445 case "$COMP_WORDBREAKS" in
447 *) pfx
="${cur%%:*}:" ;;
459 if [ $lhs = 1 ]; then
460 __gitcomp
"$(__git_refs2 "$remote")" "$pfx" "$cur"
462 __gitcomp
"$(__git_refs)" "$pfx" "$cur"
466 if [ $lhs = 1 ]; then
467 __gitcomp
"$(__git_refs "$remote")" "$pfx" "$cur"
469 __gitcomp
"$(__git_refs)" "$pfx" "$cur"
473 if [ $lhs = 1 ]; then
474 __gitcomp
"$(__git_refs)" "$pfx" "$cur"
476 __gitcomp
"$(__git_refs "$remote")" "$pfx" "$cur"
482 __git_complete_strategy
()
484 __git_compute_merge_strategies
485 case "${COMP_WORDS[COMP_CWORD-1]}" in
487 __gitcomp
"$__git_merge_strategies"
490 local cur
="${COMP_WORDS[COMP_CWORD]}"
493 __gitcomp
"$__git_merge_strategies" "" "${cur##--strategy=}"
500 __git_list_all_commands
()
503 for i
in $
(git
help -a|
egrep '^ [a-zA-Z0-9]')
506 *--*) : helper pattern
;;
513 __git_compute_all_commands
()
515 : ${__git_all_commands:=$(__git_list_all_commands)}
518 __git_list_porcelain_commands
()
521 __git_compute_all_commands
522 for i
in "help" $__git_all_commands
525 *--*) : helper pattern
;;
526 applymbox
) : ask gittus
;;
527 applypatch
) : ask gittus
;;
528 archimport
) : import
;;
529 cat-file
) : plumbing
;;
530 check-attr
) : plumbing
;;
531 check-ref-format
) : plumbing
;;
532 checkout-index
) : plumbing
;;
533 commit-tree
) : plumbing
;;
534 count-objects
) : infrequent
;;
535 cvsexportcommit
) : export;;
536 cvsimport
) : import
;;
537 cvsserver
) : daemon
;;
539 diff-files
) : plumbing
;;
540 diff-index
) : plumbing
;;
541 diff-tree
) : plumbing
;;
542 fast-import
) : import
;;
543 fast-export
) : export;;
544 fsck-objects
) : plumbing
;;
545 fetch-pack
) : plumbing
;;
546 fmt-merge-msg
) : plumbing
;;
547 for-each-ref
) : plumbing
;;
548 hash-object
) : plumbing
;;
549 http-
*) : transport
;;
550 index-pack
) : plumbing
;;
551 init-db
) : deprecated
;;
552 local-fetch
) : plumbing
;;
553 lost-found
) : infrequent
;;
554 ls-files
) : plumbing
;;
555 ls-remote
) : plumbing
;;
556 ls-tree
) : plumbing
;;
557 mailinfo
) : plumbing
;;
558 mailsplit
) : plumbing
;;
559 merge-
*) : plumbing
;;
562 pack-objects
) : plumbing
;;
563 pack-redundant
) : plumbing
;;
564 pack-refs
) : plumbing
;;
565 parse-remote
) : plumbing
;;
566 patch-id
) : plumbing
;;
567 peek-remote
) : plumbing
;;
569 prune-packed
) : plumbing
;;
570 quiltimport
) : import
;;
571 read-tree
) : plumbing
;;
572 receive-pack
) : plumbing
;;
574 remote-
*) : transport
;;
575 repo-config
) : deprecated
;;
577 rev-list
) : plumbing
;;
578 rev-parse
) : plumbing
;;
579 runstatus
) : plumbing
;;
580 sh-setup
) : internal
;;
582 show-ref
) : plumbing
;;
583 send-pack
) : plumbing
;;
584 show-index
) : plumbing
;;
586 stripspace
) : plumbing
;;
587 symbolic-ref
) : plumbing
;;
588 tar-tree
) : deprecated
;;
589 unpack-file
) : plumbing
;;
590 unpack-objects
) : plumbing
;;
591 update-index
) : plumbing
;;
592 update-ref
) : plumbing
;;
593 update-server-info
) : daemon
;;
594 upload-archive
) : plumbing
;;
595 upload-pack
) : plumbing
;;
596 write-tree
) : plumbing
;;
598 verify-pack
) : infrequent
;;
599 verify-tag
) : plumbing
;;
605 __git_porcelain_commands
=
606 __git_compute_porcelain_commands
()
608 __git_compute_all_commands
609 : ${__git_porcelain_commands:=$(__git_list_porcelain_commands)}
615 for i
in $
(git
--git-dir="$(__gitdir)" config
--get-regexp "alias\..*" 2>/dev
/null
); do
625 # __git_aliased_command requires 1 argument
626 __git_aliased_command
()
628 local word cmdline
=$
(git
--git-dir="$(__gitdir)" \
629 config
--get "alias.$1")
630 for word
in $cmdline; do
631 if [ "${word##-*}" ]; then
638 # __git_find_on_cmdline requires 1 argument
639 __git_find_on_cmdline
()
641 local word subcommand c
=1
643 while [ $c -lt $COMP_CWORD ]; do
644 word
="${COMP_WORDS[c]}"
645 for subcommand
in $1; do
646 if [ "$subcommand" = "$word" ]; then
655 __git_has_doubledash
()
658 while [ $c -lt $COMP_CWORD ]; do
659 if [ "--" = "${COMP_WORDS[c]}" ]; then
667 __git_whitespacelist
="nowarn warn error error-all fix"
671 local cur
="${COMP_WORDS[COMP_CWORD]}" dir
="$(__gitdir)"
672 if [ -d "$dir"/rebase-apply
]; then
673 __gitcomp
"--skip --resolved --abort"
678 __gitcomp
"$__git_whitespacelist" "" "${cur##--whitespace=}"
683 --3way --committer-date-is-author-date --ignore-date
684 --ignore-whitespace --ignore-space-change
685 --interactive --keep --no-utf8 --signoff --utf8
686 --whitespace= --scissors
695 local cur
="${COMP_WORDS[COMP_CWORD]}"
698 __gitcomp
"$__git_whitespacelist" "" "${cur##--whitespace=}"
703 --stat --numstat --summary --check --index
704 --cached --index-info --reverse --reject --unidiff-zero
705 --apply --no-add --exclude=
706 --ignore-whitespace --ignore-space-change
707 --whitespace= --inaccurate-eof --verbose
716 __git_has_doubledash
&& return
718 local cur
="${COMP_WORDS[COMP_CWORD]}"
722 --interactive --refresh --patch --update --dry-run
723 --ignore-errors --intent-to-add
732 local cur
="${COMP_WORDS[COMP_CWORD]}"
735 __gitcomp
"$(git archive --list)" "" "${cur##--format=}"
739 __gitcomp
"$(__git_remotes)" "" "${cur##--remote=}"
744 --format= --list --verbose
745 --prefix= --remote= --exec=
755 __git_has_doubledash
&& return
757 local subcommands
="start bad good skip reset visualize replay log run"
758 local subcommand
="$(__git_find_on_cmdline "$subcommands")"
759 if [ -z "$subcommand" ]; then
760 __gitcomp
"$subcommands"
764 case "$subcommand" in
766 __gitcomp
"$(__git_refs)"
776 local i c
=1 only_local_ref
="n" has_r
="n"
778 while [ $c -lt $COMP_CWORD ]; do
781 -d|
-m) only_local_ref
="y" ;;
787 case "${COMP_WORDS[COMP_CWORD]}" in
790 --color --no-color --verbose --abbrev= --no-abbrev
791 --track --no-track --contains --merged --no-merged
795 if [ $only_local_ref = "y" -a $has_r = "n" ]; then
796 __gitcomp
"$(__git_heads)"
798 __gitcomp
"$(__git_refs)"
806 local cmd
="${COMP_WORDS[2]}"
807 case "$COMP_CWORD" in
809 __gitcomp
"create list-heads verify unbundle"
817 __git_complete_revlist
826 __git_has_doubledash
&& return
828 local cur
="${COMP_WORDS[COMP_CWORD]}"
831 __gitcomp
"diff3 merge" "" "${cur##--conflict=}"
835 --quiet --ours --theirs --track --no-track --merge
840 __gitcomp
"$(__git_refs)"
847 __gitcomp
"$(__git_refs)"
852 local cur
="${COMP_WORDS[COMP_CWORD]}"
855 __gitcomp
"--edit --no-commit"
858 __gitcomp
"$(__git_refs)"
865 __git_has_doubledash
&& return
867 local cur
="${COMP_WORDS[COMP_CWORD]}"
870 __gitcomp
"--dry-run --quiet"
879 local cur
="${COMP_WORDS[COMP_CWORD]}"
904 __git_has_doubledash
&& return
906 local cur
="${COMP_WORDS[COMP_CWORD]}"
909 __gitcomp
"default strip verbatim whitespace
910 " "" "${cur##--cleanup=}"
914 __gitcomp
"$(__git_refs)" "" "${cur##--reuse-message=}"
918 __gitcomp
"$(__git_refs)" "" "${cur##--reedit-message=}"
922 __gitcomp
"all no normal" "" "${cur##--untracked-files=}"
927 --all --author= --signoff --verify --no-verify
928 --edit --amend --include --only --interactive
929 --dry-run --reuse-message= --reedit-message=
930 --reset-author --file= --message= --template=
931 --cleanup= --untracked-files --untracked-files=
941 local cur
="${COMP_WORDS[COMP_CWORD]}"
945 --all --tags --contains --abbrev= --candidates=
946 --exact-match --debug --long --match --always
950 __gitcomp
"$(__git_refs)"
953 __git_diff_common_options
="--stat --numstat --shortstat --summary
954 --patch-with-stat --name-only --name-status --color
955 --no-color --color-words --no-renames --check
956 --full-index --binary --abbrev --diff-filter=
958 --text --ignore-space-at-eol --ignore-space-change
959 --ignore-all-space --exit-code --quiet --ext-diff
961 --no-prefix --src-prefix= --dst-prefix=
962 --inter-hunk-context=
965 --dirstat --dirstat= --dirstat-by-file
966 --dirstat-by-file= --cumulative
971 __git_has_doubledash
&& return
973 local cur
="${COMP_WORDS[COMP_CWORD]}"
976 __gitcomp
"--cached --staged --pickaxe-all --pickaxe-regex
977 --base --ours --theirs
978 $__git_diff_common_options
986 __git_mergetools_common
="diffuse ecmerge emerge kdiff3 meld opendiff
987 tkdiff vimdiff gvimdiff xxdiff araxis p4merge
992 __git_has_doubledash
&& return
994 local cur
="${COMP_WORDS[COMP_CWORD]}"
997 __gitcomp
"$__git_mergetools_common kompare" "" "${cur##--tool=}"
1001 __gitcomp
"--cached --staged --pickaxe-all --pickaxe-regex
1002 --base --ours --theirs
1003 --no-renames --diff-filter= --find-copies-harder
1004 --relative --ignore-submodules
1012 __git_fetch_options
="
1013 --quiet --verbose --append --upload-pack --force --keep --depth=
1014 --tags --no-tags --all --prune --dry-run
1019 local cur
="${COMP_WORDS[COMP_CWORD]}"
1022 __gitcomp
"$__git_fetch_options"
1026 __git_complete_remote_or_refspec
1029 _git_format_patch
()
1031 local cur
="${COMP_WORDS[COMP_CWORD]}"
1036 " "" "${cur##--thread=}"
1041 --stdout --attach --no-attach --thread --thread=
1043 --numbered --start-number
1047 --in-reply-to= --cc=
1048 --full-index --binary
1051 --no-prefix --src-prefix= --dst-prefix=
1052 --inline --suffix= --ignore-if-in-upstream
1058 __git_complete_revlist
1063 local cur
="${COMP_WORDS[COMP_CWORD]}"
1067 --tags --root --unreachable --cache --no-reflogs --full
1068 --strict --verbose --lost-found
1078 local cur
="${COMP_WORDS[COMP_CWORD]}"
1081 __gitcomp
"--prune --aggressive"
1090 __git_has_doubledash
&& return
1092 local cur
="${COMP_WORDS[COMP_CWORD]}"
1097 --text --ignore-case --word-regexp --invert-match
1099 --extended-regexp --basic-regexp --fixed-strings
1100 --files-with-matches --name-only
1101 --files-without-match
1104 --and --or --not --all-match
1110 __gitcomp
"$(__git_refs)"
1115 local cur
="${COMP_WORDS[COMP_CWORD]}"
1118 __gitcomp
"--all --info --man --web"
1122 __git_compute_all_commands
1123 __gitcomp
"$__git_all_commands
1124 attributes cli core-tutorial cvs-migration
1125 diffcore gitk glossary hooks ignore modules
1126 repository-layout tutorial tutorial-2
1133 local cur
="${COMP_WORDS[COMP_CWORD]}"
1137 false true umask group all world everybody
1138 " "" "${cur##--shared=}"
1142 __gitcomp
"--quiet --bare --template= --shared --shared="
1151 __git_has_doubledash
&& return
1153 local cur
="${COMP_WORDS[COMP_CWORD]}"
1156 __gitcomp
"--cached --deleted --modified --others --ignored
1157 --stage --directory --no-empty-directory --unmerged
1158 --killed --exclude= --exclude-from=
1159 --exclude-per-directory= --exclude-standard
1160 --error-unmatch --with-tree= --full-name
1161 --abbrev --ignored --exclude-per-directory
1171 __gitcomp
"$(__git_remotes)"
1179 # Options that go well for log, shortlog and gitk
1180 __git_log_common_options
="
1182 --branches --tags --remotes
1183 --first-parent --merges --no-merges
1185 --max-age= --since= --after=
1186 --min-age= --until= --before=
1188 # Options that go well for log and gitk (not shortlog)
1189 __git_log_gitk_options
="
1190 --dense --sparse --full-history
1191 --simplify-merges --simplify-by-decoration
1194 # Options that go well for log and shortlog (not gitk)
1195 __git_log_shortlog_options
="
1196 --author= --committer= --grep=
1200 __git_log_pretty_formats
="oneline short medium full fuller email raw format:"
1201 __git_log_date_formats
="relative iso8601 rfc2822 short local default raw"
1205 __git_has_doubledash
&& return
1207 local cur
="${COMP_WORDS[COMP_CWORD]}"
1208 local g
="$(git rev-parse --git-dir 2>/dev/null)"
1210 if [ -f "$g/MERGE_HEAD" ]; then
1215 __gitcomp
"$__git_log_pretty_formats
1216 " "" "${cur##--pretty=}"
1220 __gitcomp
"$__git_log_pretty_formats
1221 " "" "${cur##--format=}"
1225 __gitcomp
"$__git_log_date_formats" "" "${cur##--date=}"
1229 __gitcomp
"long short" "" "${cur##--decorate=}"
1234 $__git_log_common_options
1235 $__git_log_shortlog_options
1236 $__git_log_gitk_options
1237 --root --topo-order --date-order --reverse
1238 --follow --full-diff
1239 --abbrev-commit --abbrev=
1240 --relative-date --date=
1241 --pretty= --format= --oneline
1244 --decorate --decorate=
1246 --parents --children
1248 $__git_diff_common_options
1249 --pickaxe-all --pickaxe-regex
1254 __git_complete_revlist
1257 __git_merge_options
="
1258 --no-commit --no-stat --log --no-log --squash --strategy
1259 --commit --stat --no-squash --ff --no-ff --ff-only
1264 __git_complete_strategy
&& return
1266 local cur
="${COMP_WORDS[COMP_CWORD]}"
1269 __gitcomp
"$__git_merge_options"
1272 __gitcomp
"$(__git_refs)"
1277 local cur
="${COMP_WORDS[COMP_CWORD]}"
1280 __gitcomp
"$__git_mergetools_common tortoisemerge" "" "${cur##--tool=}"
1293 __gitcomp
"$(__git_refs)"
1298 local cur
="${COMP_WORDS[COMP_CWORD]}"
1301 __gitcomp
"--dry-run"
1310 __gitcomp
"--tags --all --stdin"
1315 __git_complete_strategy
&& return
1317 local cur
="${COMP_WORDS[COMP_CWORD]}"
1321 --rebase --no-rebase
1322 $__git_merge_options
1323 $__git_fetch_options
1328 __git_complete_remote_or_refspec
1333 local cur
="${COMP_WORDS[COMP_CWORD]}"
1334 case "${COMP_WORDS[COMP_CWORD-1]}" in
1336 __gitcomp
"$(__git_remotes)"
1341 __gitcomp
"$(__git_remotes)" "" "${cur##--repo=}"
1346 --all --mirror --tags --dry-run --force --verbose
1347 --receive-pack= --repo=
1352 __git_complete_remote_or_refspec
1357 local cur
="${COMP_WORDS[COMP_CWORD]}" dir
="$(__gitdir)"
1358 if [ -d "$dir"/rebase-apply
] ||
[ -d "$dir"/rebase-merge
]; then
1359 __gitcomp
"--continue --skip --abort"
1362 __git_complete_strategy
&& return
1365 __gitcomp
"$__git_whitespacelist" "" "${cur##--whitespace=}"
1370 --onto --merge --strategy --interactive
1371 --preserve-merges --stat --no-stat
1372 --committer-date-is-author-date --ignore-date
1373 --ignore-whitespace --whitespace=
1378 __gitcomp
"$(__git_refs)"
1381 __git_send_email_confirm_options
="always never auto cc compose"
1382 __git_send_email_suppresscc_options
="author self cc bodycc sob cccmd body all"
1386 local cur
="${COMP_WORDS[COMP_CWORD]}"
1390 $__git_send_email_confirm_options
1391 " "" "${cur##--confirm=}"
1396 $__git_send_email_suppresscc_options
1397 " "" "${cur##--suppress-cc=}"
1401 --smtp-encryption=*)
1402 __gitcomp
"ssl tls" "" "${cur##--smtp-encryption=}"
1406 __gitcomp
"--annotate --bcc --cc --cc-cmd --chain-reply-to
1407 --compose --confirm= --dry-run --envelope-sender
1409 --in-reply-to --no-chain-reply-to --no-signed-off-by-cc
1410 --no-suppress-from --no-thread --quiet
1411 --signed-off-by-cc --smtp-pass --smtp-server
1412 --smtp-server-port --smtp-encryption= --smtp-user
1413 --subject --suppress-cc= --suppress-from --thread --to
1414 --validate --no-validate"
1421 __git_config_get_set_variables
()
1423 local prevword word config_file
= c
=$COMP_CWORD
1424 while [ $c -gt 1 ]; do
1425 word
="${COMP_WORDS[c]}"
1427 --global|
--system|
--file=*)
1432 config_file
="$word $prevword"
1440 git
--git-dir="$(__gitdir)" config
$config_file --list 2>/dev
/null |
1453 local cur
="${COMP_WORDS[COMP_CWORD]}"
1454 local prv
="${COMP_WORDS[COMP_CWORD-1]}"
1457 __gitcomp
"$(__git_remotes)"
1461 __gitcomp
"$(__git_refs)"
1465 local remote
="${prv#remote.}"
1466 remote
="${remote%.fetch}"
1467 __gitcomp
"$(__git_refs_remotes "$remote")"
1471 local remote
="${prv#remote.}"
1472 remote
="${remote%.push}"
1473 __gitcomp
"$(git --git-dir="$
(__gitdir
)" \
1474 for-each-ref --format='%(refname):%(refname)' \
1478 pull.twohead|pull.octopus
)
1479 __git_compute_merge_strategies
1480 __gitcomp
"$__git_merge_strategies"
1483 color.branch|color.
diff|color.interactive|\
1484 color.showbranch|color.status|color.ui
)
1485 __gitcomp
"always never auto"
1489 __gitcomp
"false true"
1494 normal black red green yellow blue magenta cyan white
1495 bold dim ul blink reverse
1500 __gitcomp
"man info web html"
1504 __gitcomp
"$__git_log_date_formats"
1507 sendemail.aliasesfiletype
)
1508 __gitcomp
"mutt mailrc pine elm gnus"
1512 __gitcomp
"$__git_send_email_confirm_options"
1515 sendemail.suppresscc
)
1516 __gitcomp
"$__git_send_email_suppresscc_options"
1519 --get|
--get-all|
--unset|
--unset-all)
1520 __gitcomp
"$(__git_config_get_set_variables)"
1531 --global --system --file=
1532 --list --replace-all
1533 --get --get-all --get-regexp
1534 --add --unset --unset-all
1535 --remove-section --rename-section
1540 local pfx
="${cur%.*}."
1542 __gitcomp
"remote merge mergeoptions rebase" "$pfx" "$cur"
1546 local pfx
="${cur%.*}."
1548 __gitcomp
"$(__git_heads)" "$pfx" "$cur" "."
1552 local pfx
="${cur%.*}."
1555 argprompt cmd confirm needsfile noconsole norescan
1556 prompt revprompt revunmerged title
1561 local pfx
="${cur%.*}."
1563 __gitcomp
"cmd path" "$pfx" "$cur"
1567 local pfx
="${cur%.*}."
1569 __gitcomp
"cmd path" "$pfx" "$cur"
1573 local pfx
="${cur%.*}."
1575 __gitcomp
"cmd path trustExitCode" "$pfx" "$cur"
1579 local pfx
="${cur%.*}."
1581 __git_compute_all_commands
1582 __gitcomp
"$__git_all_commands" "$pfx" "$cur"
1586 local pfx
="${cur%.*}."
1589 url proxy fetch push mirror skipDefaultUpdate
1590 receivepack uploadpack tagopt pushurl
1595 local pfx
="${cur%.*}."
1597 __gitcomp
"$(__git_remotes)" "$pfx" "$cur" "."
1601 local pfx
="${cur%.*}."
1603 __gitcomp
"insteadOf pushInsteadOf" "$pfx" "$cur"
1610 apply.ignorewhitespace
1612 branch.autosetupmerge
1613 branch.autosetuprebase
1616 color.branch.current
1627 color.diff.whitespace
1632 color.interactive.header
1633 color.interactive.help
1634 color.interactive.prompt
1639 color.status.changed
1641 color.status.nobranch
1642 color.status.untracked
1643 color.status.updated
1650 core.deltaBaseCacheLimit
1654 core.fsyncobjectfiles
1656 core.ignoreCygwinFSTricks
1658 core.logAllRefUpdates
1659 core.loosecompression
1661 core.packedGitWindowSize
1663 core.preferSymlinkRefs
1666 core.repositoryFormatVersion
1668 core.sharedRepository
1671 core.warnAmbiguousRefs
1674 diff.autorefreshindex
1680 diff.suppressBlankEmpty
1692 format.subjectprefix
1701 gc.reflogexpireunreachable
1705 gitcvs.commitmsgannotation
1706 gitcvs.dbTableNamePrefix
1717 gui.copyblamethreshold
1721 gui.matchtrackingbranch
1722 gui.newbranchtemplate
1723 gui.pruneduringfetch
1724 gui.spellingdictionary
1740 i18n.logOutputEncoding
1745 imap.preformattedHTML
1754 interactive.singlekey
1767 mergetool.keepBackup
1770 pack.deltaCacheLimit
1783 receive.denyCurrentBranch
1785 receive.denyNonFastForwards
1788 repack.usedeltabaseoffset
1791 sendemail.aliasesfile
1792 sendemail.aliasesfiletype
1796 sendemail.chainreplyto
1798 sendemail.envelopesender
1800 sendemail.signedoffbycc
1801 sendemail.smtpencryption
1803 sendemail.smtpserver
1804 sendemail.smtpserverport
1806 sendemail.suppresscc
1807 sendemail.suppressfrom
1812 status.relativePaths
1813 status.showUntrackedFiles
1815 transfer.unpackLimit
1827 local subcommands
="add rename rm show prune update set-head"
1828 local subcommand
="$(__git_find_on_cmdline "$subcommands")"
1829 if [ -z "$subcommand" ]; then
1830 __gitcomp
"$subcommands"
1834 case "$subcommand" in
1835 rename|
rm|show|prune
)
1836 __gitcomp
"$(__git_remotes)"
1839 local i c
='' IFS
=$
'\n'
1840 for i
in $
(git
--git-dir="$(__gitdir)" config
--get-regexp "remotes\..*" 2>/dev
/null
); do
1854 __gitcomp
"$(__git_refs)"
1859 __git_has_doubledash
&& return
1861 local cur
="${COMP_WORDS[COMP_CWORD]}"
1864 __gitcomp
"--merge --mixed --hard --soft --patch"
1868 __gitcomp
"$(__git_refs)"
1873 local cur
="${COMP_WORDS[COMP_CWORD]}"
1876 __gitcomp
"--edit --mainline --no-edit --no-commit --signoff"
1880 __gitcomp
"$(__git_refs)"
1885 __git_has_doubledash
&& return
1887 local cur
="${COMP_WORDS[COMP_CWORD]}"
1890 __gitcomp
"--cached --dry-run --ignore-unmatch --quiet"
1899 __git_has_doubledash
&& return
1901 local cur
="${COMP_WORDS[COMP_CWORD]}"
1905 $__git_log_common_options
1906 $__git_log_shortlog_options
1907 --numbered --summary
1912 __git_complete_revlist
1917 __git_has_doubledash
&& return
1919 local cur
="${COMP_WORDS[COMP_CWORD]}"
1922 __gitcomp
"$__git_log_pretty_formats
1923 " "" "${cur##--pretty=}"
1927 __gitcomp
"$__git_log_pretty_formats
1928 " "" "${cur##--format=}"
1932 __gitcomp
"--pretty= --format= --abbrev-commit --oneline
1933 $__git_diff_common_options
1943 local cur
="${COMP_WORDS[COMP_CWORD]}"
1947 --all --remotes --topo-order --current --more=
1948 --list --independent --merge-base --no-name
1950 --sha1-name --sparse --topics --reflog
1955 __git_complete_revlist
1960 local cur
="${COMP_WORDS[COMP_CWORD]}"
1961 local save_opts
='--keep-index --no-keep-index --quiet --patch'
1962 local subcommands
='save list show apply clear drop pop create branch'
1963 local subcommand
="$(__git_find_on_cmdline "$subcommands")"
1964 if [ -z "$subcommand" ]; then
1967 __gitcomp
"$save_opts"
1970 if [ -z "$(__git_find_on_cmdline "$save_opts")" ]; then
1971 __gitcomp
"$subcommands"
1978 case "$subcommand,$cur" in
1980 __gitcomp
"$save_opts"
1983 __gitcomp
"--index --quiet"
1985 show
,--*|drop
,--*|branch
,--*)
1988 show
,*|apply
,*|drop
,*|pop
,*|branch
,*)
1989 __gitcomp
"$(git --git-dir="$
(__gitdir
)" stash list \
1990 | sed -n -e 's/:.*//p')"
2001 __git_has_doubledash
&& return
2003 local subcommands
="add status init update summary foreach sync"
2004 if [ -z "$(__git_find_on_cmdline "$subcommands")" ]; then
2005 local cur
="${COMP_WORDS[COMP_CWORD]}"
2008 __gitcomp
"--quiet --cached"
2011 __gitcomp
"$subcommands"
2021 init fetch clone rebase dcommit log find-rev
2022 set-tree commit-diff info create-ignore propget
2023 proplist show-ignore show-externals branch tag blame
2026 local subcommand
="$(__git_find_on_cmdline "$subcommands")"
2027 if [ -z "$subcommand" ]; then
2028 __gitcomp
"$subcommands"
2030 local remote_opts
="--username= --config-dir= --no-auth-cache"
2032 --follow-parent --authors-file= --repack=
2033 --no-metadata --use-svm-props --use-svnsync-props
2034 --log-window-size= --no-checkout --quiet
2035 --repack-flags --use-log-author --localtime
2036 --ignore-paths= $remote_opts
2039 --template= --shared= --trunk= --tags=
2040 --branches= --stdlayout --minimize-url
2041 --no-metadata --use-svm-props --use-svnsync-props
2042 --rewrite-root= --prefix= --use-log-author
2043 --add-author-from $remote_opts
2046 --edit --rmdir --find-copies-harder --copy-similarity=
2049 local cur
="${COMP_WORDS[COMP_CWORD]}"
2050 case "$subcommand,$cur" in
2052 __gitcomp
"--revision= --fetch-all $fc_opts"
2055 __gitcomp
"--revision= $fc_opts $init_opts"
2058 __gitcomp
"$init_opts"
2062 --merge --strategy= --verbose --dry-run
2063 --fetch-all --no-rebase --commit-url
2064 --revision $cmt_opts $fc_opts
2068 __gitcomp
"--stdin $cmt_opts $fc_opts"
2070 create-ignore
,--*|propget
,--*|proplist
,--*|show-ignore
,--*|\
2072 __gitcomp
"--revision="
2076 --limit= --revision= --verbose --incremental
2077 --oneline --show-commit --non-recursive
2078 --authors-file= --color
2083 --merge --verbose --strategy= --local
2084 --fetch-all --dry-run $fc_opts
2088 __gitcomp
"--message= --file= --revision= $cmt_opts"
2094 __gitcomp
"--dry-run --message --tag"
2097 __gitcomp
"--dry-run --message"
2100 __gitcomp
"--git-format"
2104 --config-dir= --ignore-paths= --minimize
2105 --no-auth-cache --username=
2118 while [ $c -lt $COMP_CWORD ]; do
2119 i
="${COMP_WORDS[c]}"
2122 __gitcomp
"$(__git_tags)"
2132 case "${COMP_WORDS[COMP_CWORD-1]}" in
2138 __gitcomp
"$(__git_tags)"
2144 __gitcomp
"$(__git_refs)"
2151 local i c
=1 command __git_dir
2153 while [ $c -lt $COMP_CWORD ]; do
2154 i
="${COMP_WORDS[c]}"
2156 --git-dir=*) __git_dir
="${i#--git-dir=}" ;;
2157 --bare) __git_dir
="." ;;
2158 --version|
-p|
--paginate) ;;
2159 --help) command="help"; break ;;
2160 *) command="$i"; break ;;
2165 if [ -z "$command" ]; then
2166 case "${COMP_WORDS[COMP_CWORD]}" in
2179 *) __git_compute_porcelain_commands
2180 __gitcomp
"$__git_porcelain_commands $(__git_aliases)" ;;
2185 local expansion
=$
(__git_aliased_command
"$command")
2186 [ "$expansion" ] && command="$expansion"
2191 apply
) _git_apply
;;
2192 archive
) _git_archive
;;
2193 bisect
) _git_bisect
;;
2194 bundle
) _git_bundle
;;
2195 branch
) _git_branch
;;
2196 checkout
) _git_checkout
;;
2197 cherry
) _git_cherry
;;
2198 cherry-pick
) _git_cherry_pick
;;
2199 clean
) _git_clean
;;
2200 clone
) _git_clone
;;
2201 commit
) _git_commit
;;
2202 config
) _git_config
;;
2203 describe
) _git_describe
;;
2205 difftool
) _git_difftool
;;
2206 fetch
) _git_fetch
;;
2207 format-patch
) _git_format_patch
;;
2214 ls-files
) _git_ls_files
;;
2215 ls-remote
) _git_ls_remote
;;
2216 ls-tree
) _git_ls_tree
;;
2218 mergetool
) _git_mergetool
;;
2219 merge-base
) _git_merge_base
;;
2221 name-rev
) _git_name_rev
;;
2224 rebase
) _git_rebase
;;
2225 remote
) _git_remote
;;
2226 replace
) _git_replace
;;
2227 reset) _git_reset
;;
2228 revert
) _git_revert
;;
2230 send-email
) _git_send_email
;;
2231 shortlog
) _git_shortlog
;;
2233 show-branch
) _git_show_branch
;;
2234 stash
) _git_stash
;;
2236 submodule
) _git_submodule
;;
2239 whatchanged
) _git_log
;;
2246 __git_has_doubledash
&& return
2248 local cur
="${COMP_WORDS[COMP_CWORD]}"
2249 local g
="$(__gitdir)"
2251 if [ -f "$g/MERGE_HEAD" ]; then
2257 $__git_log_common_options
2258 $__git_log_gitk_options
2264 __git_complete_revlist
2267 complete
-o bashdefault
-o default
-o nospace
-F _git git
2>/dev
/null \
2268 || complete
-o default
-o nospace
-F _git git
2269 complete
-o bashdefault
-o default
-o nospace
-F _gitk gitk
2>/dev
/null \
2270 || complete
-o default
-o nospace
-F _gitk gitk
2272 # The following are necessary only for Cygwin, and only are needed
2273 # when the user has tab-completed the executable name and consequently
2274 # included the '.exe' suffix.
2276 if [ Cygwin
= "$(uname -o 2>/dev/null)" ]; then
2277 complete
-o bashdefault
-o default
-o nospace
-F _git git.exe
2>/dev
/null \
2278 || complete
-o default
-o nospace
-F _git git.exe