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
165 printf "${1:- (%s)}" "$c${b##refs/heads/}${f:+ $f}$r"
169 # __gitcomp_1 requires 2 arguments
172 local c IFS
=' '$
'\t'$
'\n'
175 --*=*) printf %s$
'\n' "$c$2" ;;
176 *.
) printf %s$
'\n' "$c$2" ;;
177 *) printf %s$
'\n' "$c$2 " ;;
182 # __gitcomp accepts 1, 2, 3, or 4 arguments
183 # generates completion reply with compgen
186 local cur
="${COMP_WORDS[COMP_CWORD]}"
187 if [ $# -gt 2 ]; then
196 COMPREPLY
=($
(compgen
-P "${2-}" \
197 -W "$(__gitcomp_1 "${1-}" "${4-}")" \
203 # __git_heads accepts 0 or 1 arguments (to pass to __gitdir)
206 local cmd i is_hash
=y dir
="$(__gitdir "${1-}")"
207 if [ -d "$dir" ]; then
208 git
--git-dir="$dir" for-each-ref
--format='%(refname:short)' \
212 for i
in $
(git ls-remote
"${1-}" 2>/dev
/null
); do
213 case "$is_hash,$i" in
216 n
,refs
/heads
/*) is_hash
=y
; echo "${i#refs/heads/}" ;;
217 n
,*) is_hash
=y
; echo "$i" ;;
222 # __git_tags accepts 0 or 1 arguments (to pass to __gitdir)
225 local cmd i is_hash
=y dir
="$(__gitdir "${1-}")"
226 if [ -d "$dir" ]; then
227 git
--git-dir="$dir" for-each-ref
--format='%(refname:short)' \
231 for i
in $
(git ls-remote
"${1-}" 2>/dev
/null
); do
232 case "$is_hash,$i" in
235 n
,refs
/tags
/*) is_hash
=y
; echo "${i#refs/tags/}" ;;
236 n
,*) is_hash
=y
; echo "$i" ;;
241 # __git_refs accepts 0 or 1 arguments (to pass to __gitdir)
244 local i is_hash
=y dir
="$(__gitdir "${1-}")"
245 local cur
="${COMP_WORDS[COMP_CWORD]}" format refs
246 if [ -d "$dir" ]; then
253 for i
in HEAD FETCH_HEAD ORIG_HEAD MERGE_HEAD
; do
254 if [ -e "$dir/$i" ]; then echo $i; fi
256 format
="refname:short"
257 refs
="refs/tags refs/heads refs/remotes"
260 git
--git-dir="$dir" for-each-ref
--format="%($format)" \
264 for i
in $
(git ls-remote
"$dir" 2>/dev
/null
); do
265 case "$is_hash,$i" in
268 n
,refs
/tags
/*) is_hash
=y
; echo "${i#refs/tags/}" ;;
269 n
,refs
/heads
/*) is_hash
=y
; echo "${i#refs/heads/}" ;;
270 n
,refs
/remotes
/*) is_hash
=y
; echo "${i#refs/remotes/}" ;;
271 n
,*) is_hash
=y
; echo "$i" ;;
276 # __git_refs2 requires 1 argument (to pass to __git_refs)
280 for i
in $
(__git_refs
"$1"); do
285 # __git_refs_remotes requires 1 argument (to pass to ls-remote)
286 __git_refs_remotes
()
288 local cmd i is_hash
=y
289 for i
in $
(git ls-remote
"$1" 2>/dev
/null
); do
290 case "$is_hash,$i" in
293 echo "$i:refs/remotes/$1/${i#refs/heads/}"
297 n
,refs
/tags
/*) is_hash
=y
;;
305 local i ngoff IFS
=$
'\n' d
="$(__gitdir)"
306 shopt -q nullglob || ngoff
=1
308 for i
in "$d/remotes"/*; do
309 echo ${i#$d/remotes/}
311 [ "$ngoff" ] && shopt -u nullglob
312 for i
in $
(git
--git-dir="$d" config
--get-regexp 'remote\..*\.url' 2>/dev
/null
); do
318 __git_list_merge_strategies
()
320 git merge
-s help 2>&1 |
321 sed -n -e '/[Aa]vailable strategies are: /,/^$/{
330 __git_merge_strategies
=
331 # 'git merge -s help' (and thus detection of the merge strategy
332 # list) fails, unfortunately, if run outside of any git working
333 # tree. __git_merge_strategies is set to the empty string in
334 # that case, and the detection will be repeated the next time it
336 __git_compute_merge_strategies
()
338 : ${__git_merge_strategies:=$(__git_list_merge_strategies)}
341 __git_complete_file
()
343 local pfx
ls ref cur
="${COMP_WORDS[COMP_CWORD]}"
360 case "$COMP_WORDBREAKS" in
362 *) pfx
="$ref:$pfx" ;;
366 COMPREPLY
=($
(compgen
-P "$pfx" \
367 -W "$(git --git-dir="$
(__gitdir
)" ls-tree "$ls" \
368 | sed '/^100... blob /{
384 __gitcomp
"$(__git_refs)"
389 __git_complete_revlist
()
391 local pfx cur
="${COMP_WORDS[COMP_CWORD]}"
396 __gitcomp
"$(__git_refs)" "$pfx" "$cur"
401 __gitcomp
"$(__git_refs)" "$pfx" "$cur"
404 __gitcomp
"$(__git_refs)"
409 __git_complete_remote_or_refspec
()
411 local cmd
="${COMP_WORDS[1]}"
412 local cur
="${COMP_WORDS[COMP_CWORD]}"
413 local i c
=2 remote
="" pfx
="" lhs
=1 no_complete_refspec
=0
414 while [ $c -lt $COMP_CWORD ]; do
417 --mirror) [ "$cmd" = "push" ] && no_complete_refspec
=1 ;;
420 push
) no_complete_refspec
=1 ;;
429 *) remote
="$i"; break ;;
433 if [ -z "$remote" ]; then
434 __gitcomp
"$(__git_remotes)"
437 if [ $no_complete_refspec = 1 ]; then
441 [ "$remote" = "." ] && remote
=
444 case "$COMP_WORDBREAKS" in
446 *) pfx
="${cur%%:*}:" ;;
458 if [ $lhs = 1 ]; then
459 __gitcomp
"$(__git_refs2 "$remote")" "$pfx" "$cur"
461 __gitcomp
"$(__git_refs)" "$pfx" "$cur"
465 if [ $lhs = 1 ]; then
466 __gitcomp
"$(__git_refs "$remote")" "$pfx" "$cur"
468 __gitcomp
"$(__git_refs)" "$pfx" "$cur"
472 if [ $lhs = 1 ]; then
473 __gitcomp
"$(__git_refs)" "$pfx" "$cur"
475 __gitcomp
"$(__git_refs "$remote")" "$pfx" "$cur"
481 __git_complete_strategy
()
483 __git_compute_merge_strategies
484 case "${COMP_WORDS[COMP_CWORD-1]}" in
486 __gitcomp
"$__git_merge_strategies"
489 local cur
="${COMP_WORDS[COMP_CWORD]}"
492 __gitcomp
"$__git_merge_strategies" "" "${cur##--strategy=}"
499 __git_list_all_commands
()
502 for i
in $
(git
help -a|
egrep '^ [a-zA-Z0-9]')
505 *--*) : helper pattern
;;
512 __git_compute_all_commands
()
514 : ${__git_all_commands:=$(__git_list_all_commands)}
517 __git_list_porcelain_commands
()
520 __git_compute_all_commands
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 remote-
*) : transport
;;
574 repo-config
) : deprecated
;;
576 rev-list
) : plumbing
;;
577 rev-parse
) : plumbing
;;
578 runstatus
) : plumbing
;;
579 sh-setup
) : internal
;;
581 show-ref
) : plumbing
;;
582 send-pack
) : plumbing
;;
583 show-index
) : plumbing
;;
585 stripspace
) : plumbing
;;
586 symbolic-ref
) : plumbing
;;
587 tar-tree
) : deprecated
;;
588 unpack-file
) : plumbing
;;
589 unpack-objects
) : plumbing
;;
590 update-index
) : plumbing
;;
591 update-ref
) : plumbing
;;
592 update-server-info
) : daemon
;;
593 upload-archive
) : plumbing
;;
594 upload-pack
) : plumbing
;;
595 write-tree
) : plumbing
;;
597 verify-pack
) : infrequent
;;
598 verify-tag
) : plumbing
;;
604 __git_porcelain_commands
=
605 __git_compute_porcelain_commands
()
607 __git_compute_all_commands
608 : ${__git_porcelain_commands:=$(__git_list_porcelain_commands)}
614 for i
in $
(git
--git-dir="$(__gitdir)" config
--get-regexp "alias\..*" 2>/dev
/null
); do
624 # __git_aliased_command requires 1 argument
625 __git_aliased_command
()
627 local word cmdline
=$
(git
--git-dir="$(__gitdir)" \
628 config
--get "alias.$1")
629 for word
in $cmdline; do
630 if [ "${word##-*}" ]; then
637 # __git_find_on_cmdline requires 1 argument
638 __git_find_on_cmdline
()
640 local word subcommand c
=1
642 while [ $c -lt $COMP_CWORD ]; do
643 word
="${COMP_WORDS[c]}"
644 for subcommand
in $1; do
645 if [ "$subcommand" = "$word" ]; then
654 __git_has_doubledash
()
657 while [ $c -lt $COMP_CWORD ]; do
658 if [ "--" = "${COMP_WORDS[c]}" ]; then
666 __git_whitespacelist
="nowarn warn error error-all fix"
670 local cur
="${COMP_WORDS[COMP_CWORD]}" dir
="$(__gitdir)"
671 if [ -d "$dir"/rebase-apply
]; then
672 __gitcomp
"--skip --continue --resolved --abort"
677 __gitcomp
"$__git_whitespacelist" "" "${cur##--whitespace=}"
682 --3way --committer-date-is-author-date --ignore-date
683 --ignore-whitespace --ignore-space-change
684 --interactive --keep --no-utf8 --signoff --utf8
685 --whitespace= --scissors
694 local cur
="${COMP_WORDS[COMP_CWORD]}"
697 __gitcomp
"$__git_whitespacelist" "" "${cur##--whitespace=}"
702 --stat --numstat --summary --check --index
703 --cached --index-info --reverse --reject --unidiff-zero
704 --apply --no-add --exclude=
705 --ignore-whitespace --ignore-space-change
706 --whitespace= --inaccurate-eof --verbose
715 __git_has_doubledash
&& return
717 local cur
="${COMP_WORDS[COMP_CWORD]}"
721 --interactive --refresh --patch --update --dry-run
722 --ignore-errors --intent-to-add
731 local cur
="${COMP_WORDS[COMP_CWORD]}"
734 __gitcomp
"$(git archive --list)" "" "${cur##--format=}"
738 __gitcomp
"$(__git_remotes)" "" "${cur##--remote=}"
743 --format= --list --verbose
744 --prefix= --remote= --exec=
754 __git_has_doubledash
&& return
756 local subcommands
="start bad good skip reset visualize replay log run"
757 local subcommand
="$(__git_find_on_cmdline "$subcommands")"
758 if [ -z "$subcommand" ]; then
759 __gitcomp
"$subcommands"
763 case "$subcommand" in
765 __gitcomp
"$(__git_refs)"
775 local i c
=1 only_local_ref
="n" has_r
="n"
777 while [ $c -lt $COMP_CWORD ]; do
780 -d|
-m) only_local_ref
="y" ;;
786 case "${COMP_WORDS[COMP_CWORD]}" in
789 --color --no-color --verbose --abbrev= --no-abbrev
790 --track --no-track --contains --merged --no-merged
794 if [ $only_local_ref = "y" -a $has_r = "n" ]; then
795 __gitcomp
"$(__git_heads)"
797 __gitcomp
"$(__git_refs)"
805 local cmd
="${COMP_WORDS[2]}"
806 case "$COMP_CWORD" in
808 __gitcomp
"create list-heads verify unbundle"
816 __git_complete_revlist
825 __git_has_doubledash
&& return
827 local cur
="${COMP_WORDS[COMP_CWORD]}"
830 __gitcomp
"diff3 merge" "" "${cur##--conflict=}"
834 --quiet --ours --theirs --track --no-track --merge
839 __gitcomp
"$(__git_refs)"
846 __gitcomp
"$(__git_refs)"
851 local cur
="${COMP_WORDS[COMP_CWORD]}"
854 __gitcomp
"--edit --no-commit"
857 __gitcomp
"$(__git_refs)"
864 __git_has_doubledash
&& return
866 local cur
="${COMP_WORDS[COMP_CWORD]}"
869 __gitcomp
"--dry-run --quiet"
878 local cur
="${COMP_WORDS[COMP_CWORD]}"
903 __git_has_doubledash
&& return
905 local cur
="${COMP_WORDS[COMP_CWORD]}"
908 __gitcomp
"default strip verbatim whitespace
909 " "" "${cur##--cleanup=}"
913 __gitcomp
"$(__git_refs)" "" "${cur##--reuse-message=}"
917 __gitcomp
"$(__git_refs)" "" "${cur##--reedit-message=}"
921 __gitcomp
"all no normal" "" "${cur##--untracked-files=}"
926 --all --author= --signoff --verify --no-verify
927 --edit --amend --include --only --interactive
928 --dry-run --reuse-message= --reedit-message=
929 --reset-author --file= --message= --template=
930 --cleanup= --untracked-files --untracked-files=
940 local cur
="${COMP_WORDS[COMP_CWORD]}"
944 --all --tags --contains --abbrev= --candidates=
945 --exact-match --debug --long --match --always
949 __gitcomp
"$(__git_refs)"
952 __git_diff_common_options
="--stat --numstat --shortstat --summary
953 --patch-with-stat --name-only --name-status --color
954 --no-color --color-words --no-renames --check
955 --full-index --binary --abbrev --diff-filter=
957 --text --ignore-space-at-eol --ignore-space-change
958 --ignore-all-space --exit-code --quiet --ext-diff
960 --no-prefix --src-prefix= --dst-prefix=
961 --inter-hunk-context=
964 --dirstat --dirstat= --dirstat-by-file
965 --dirstat-by-file= --cumulative
970 __git_has_doubledash
&& return
972 local cur
="${COMP_WORDS[COMP_CWORD]}"
975 __gitcomp
"--cached --staged --pickaxe-all --pickaxe-regex
976 --base --ours --theirs
977 $__git_diff_common_options
985 __git_mergetools_common
="diffuse ecmerge emerge kdiff3 meld opendiff
986 tkdiff vimdiff gvimdiff xxdiff araxis p4merge
991 __git_has_doubledash
&& return
993 local cur
="${COMP_WORDS[COMP_CWORD]}"
996 __gitcomp
"$__git_mergetools_common kompare" "" "${cur##--tool=}"
1000 __gitcomp
"--cached --staged --pickaxe-all --pickaxe-regex
1001 --base --ours --theirs
1002 --no-renames --diff-filter= --find-copies-harder
1003 --relative --ignore-submodules
1011 __git_fetch_options
="
1012 --quiet --verbose --append --upload-pack --force --keep --depth=
1013 --tags --no-tags --all --prune --dry-run
1018 local cur
="${COMP_WORDS[COMP_CWORD]}"
1021 __gitcomp
"$__git_fetch_options"
1025 __git_complete_remote_or_refspec
1028 _git_format_patch
()
1030 local cur
="${COMP_WORDS[COMP_CWORD]}"
1035 " "" "${cur##--thread=}"
1040 --stdout --attach --no-attach --thread --thread=
1042 --numbered --start-number
1046 --in-reply-to= --cc=
1047 --full-index --binary
1050 --no-prefix --src-prefix= --dst-prefix=
1051 --inline --suffix= --ignore-if-in-upstream
1057 __git_complete_revlist
1062 local cur
="${COMP_WORDS[COMP_CWORD]}"
1066 --tags --root --unreachable --cache --no-reflogs --full
1067 --strict --verbose --lost-found
1077 local cur
="${COMP_WORDS[COMP_CWORD]}"
1080 __gitcomp
"--prune --aggressive"
1089 __git_has_doubledash
&& return
1091 local cur
="${COMP_WORDS[COMP_CWORD]}"
1096 --text --ignore-case --word-regexp --invert-match
1098 --extended-regexp --basic-regexp --fixed-strings
1099 --files-with-matches --name-only
1100 --files-without-match
1103 --and --or --not --all-match
1109 __gitcomp
"$(__git_refs)"
1114 local cur
="${COMP_WORDS[COMP_CWORD]}"
1117 __gitcomp
"--all --info --man --web"
1121 __git_compute_all_commands
1122 __gitcomp
"$__git_all_commands
1123 attributes cli core-tutorial cvs-migration
1124 diffcore gitk glossary hooks ignore modules
1125 repository-layout tutorial tutorial-2
1132 local cur
="${COMP_WORDS[COMP_CWORD]}"
1136 false true umask group all world everybody
1137 " "" "${cur##--shared=}"
1141 __gitcomp
"--quiet --bare --template= --shared --shared="
1150 __git_has_doubledash
&& return
1152 local cur
="${COMP_WORDS[COMP_CWORD]}"
1155 __gitcomp
"--cached --deleted --modified --others --ignored
1156 --stage --directory --no-empty-directory --unmerged
1157 --killed --exclude= --exclude-from=
1158 --exclude-per-directory= --exclude-standard
1159 --error-unmatch --with-tree= --full-name
1160 --abbrev --ignored --exclude-per-directory
1170 __gitcomp
"$(__git_remotes)"
1178 # Options that go well for log, shortlog and gitk
1179 __git_log_common_options
="
1181 --branches --tags --remotes
1182 --first-parent --merges --no-merges
1184 --max-age= --since= --after=
1185 --min-age= --until= --before=
1187 # Options that go well for log and gitk (not shortlog)
1188 __git_log_gitk_options
="
1189 --dense --sparse --full-history
1190 --simplify-merges --simplify-by-decoration
1193 # Options that go well for log and shortlog (not gitk)
1194 __git_log_shortlog_options
="
1195 --author= --committer= --grep=
1199 __git_log_pretty_formats
="oneline short medium full fuller email raw format:"
1200 __git_log_date_formats
="relative iso8601 rfc2822 short local default raw"
1204 __git_has_doubledash
&& return
1206 local cur
="${COMP_WORDS[COMP_CWORD]}"
1207 local g
="$(git rev-parse --git-dir 2>/dev/null)"
1209 if [ -f "$g/MERGE_HEAD" ]; then
1214 __gitcomp
"$__git_log_pretty_formats
1215 " "" "${cur##--pretty=}"
1219 __gitcomp
"$__git_log_pretty_formats
1220 " "" "${cur##--format=}"
1224 __gitcomp
"$__git_log_date_formats" "" "${cur##--date=}"
1228 __gitcomp
"long short" "" "${cur##--decorate=}"
1233 $__git_log_common_options
1234 $__git_log_shortlog_options
1235 $__git_log_gitk_options
1236 --root --topo-order --date-order --reverse
1237 --follow --full-diff
1238 --abbrev-commit --abbrev=
1239 --relative-date --date=
1240 --pretty= --format= --oneline
1243 --decorate --decorate=
1245 --parents --children
1247 $__git_diff_common_options
1248 --pickaxe-all --pickaxe-regex
1253 __git_complete_revlist
1256 __git_merge_options
="
1257 --no-commit --no-stat --log --no-log --squash --strategy
1258 --commit --stat --no-squash --ff --no-ff --ff-only
1263 __git_complete_strategy
&& return
1265 local cur
="${COMP_WORDS[COMP_CWORD]}"
1268 __gitcomp
"$__git_merge_options"
1271 __gitcomp
"$(__git_refs)"
1276 local cur
="${COMP_WORDS[COMP_CWORD]}"
1279 __gitcomp
"$__git_mergetools_common tortoisemerge" "" "${cur##--tool=}"
1292 __gitcomp
"$(__git_refs)"
1297 local cur
="${COMP_WORDS[COMP_CWORD]}"
1300 __gitcomp
"--dry-run"
1309 __gitcomp
"--tags --all --stdin"
1314 local subcommands
="edit show"
1315 if [ -z "$(__git_find_on_cmdline "$subcommands")" ]; then
1316 __gitcomp
"$subcommands"
1320 case "${COMP_WORDS[COMP_CWORD-1]}" in
1325 __gitcomp
"$(__git_refs)"
1332 __git_complete_strategy
&& return
1334 local cur
="${COMP_WORDS[COMP_CWORD]}"
1338 --rebase --no-rebase
1339 $__git_merge_options
1340 $__git_fetch_options
1345 __git_complete_remote_or_refspec
1350 local cur
="${COMP_WORDS[COMP_CWORD]}"
1351 case "${COMP_WORDS[COMP_CWORD-1]}" in
1353 __gitcomp
"$(__git_remotes)"
1358 __gitcomp
"$(__git_remotes)" "" "${cur##--repo=}"
1363 --all --mirror --tags --dry-run --force --verbose
1364 --receive-pack= --repo=
1369 __git_complete_remote_or_refspec
1374 local cur
="${COMP_WORDS[COMP_CWORD]}" dir
="$(__gitdir)"
1375 if [ -d "$dir"/rebase-apply
] ||
[ -d "$dir"/rebase-merge
]; then
1376 __gitcomp
"--continue --skip --abort"
1379 __git_complete_strategy
&& return
1382 __gitcomp
"$__git_whitespacelist" "" "${cur##--whitespace=}"
1387 --onto --merge --strategy --interactive
1388 --preserve-merges --stat --no-stat
1389 --committer-date-is-author-date --ignore-date
1390 --ignore-whitespace --whitespace=
1396 __gitcomp
"$(__git_refs)"
1399 __git_send_email_confirm_options
="always never auto cc compose"
1400 __git_send_email_suppresscc_options
="author self cc bodycc sob cccmd body all"
1404 local cur
="${COMP_WORDS[COMP_CWORD]}"
1408 $__git_send_email_confirm_options
1409 " "" "${cur##--confirm=}"
1414 $__git_send_email_suppresscc_options
1415 " "" "${cur##--suppress-cc=}"
1419 --smtp-encryption=*)
1420 __gitcomp
"ssl tls" "" "${cur##--smtp-encryption=}"
1424 __gitcomp
"--annotate --bcc --cc --cc-cmd --chain-reply-to
1425 --compose --confirm= --dry-run --envelope-sender
1427 --in-reply-to --no-chain-reply-to --no-signed-off-by-cc
1428 --no-suppress-from --no-thread --quiet
1429 --signed-off-by-cc --smtp-pass --smtp-server
1430 --smtp-server-port --smtp-encryption= --smtp-user
1431 --subject --suppress-cc= --suppress-from --thread --to
1432 --validate --no-validate"
1439 __git_config_get_set_variables
()
1441 local prevword word config_file
= c
=$COMP_CWORD
1442 while [ $c -gt 1 ]; do
1443 word
="${COMP_WORDS[c]}"
1445 --global|
--system|
--file=*)
1450 config_file
="$word $prevword"
1458 git
--git-dir="$(__gitdir)" config
$config_file --list 2>/dev
/null |
1471 local cur
="${COMP_WORDS[COMP_CWORD]}"
1472 local prv
="${COMP_WORDS[COMP_CWORD-1]}"
1475 __gitcomp
"$(__git_remotes)"
1479 __gitcomp
"$(__git_refs)"
1483 local remote
="${prv#remote.}"
1484 remote
="${remote%.fetch}"
1485 __gitcomp
"$(__git_refs_remotes "$remote")"
1489 local remote
="${prv#remote.}"
1490 remote
="${remote%.push}"
1491 __gitcomp
"$(git --git-dir="$
(__gitdir
)" \
1492 for-each-ref --format='%(refname):%(refname)' \
1496 pull.twohead|pull.octopus
)
1497 __git_compute_merge_strategies
1498 __gitcomp
"$__git_merge_strategies"
1501 color.branch|color.
diff|color.interactive|\
1502 color.showbranch|color.status|color.ui
)
1503 __gitcomp
"always never auto"
1507 __gitcomp
"false true"
1512 normal black red green yellow blue magenta cyan white
1513 bold dim ul blink reverse
1518 __gitcomp
"man info web html"
1522 __gitcomp
"$__git_log_date_formats"
1525 sendemail.aliasesfiletype
)
1526 __gitcomp
"mutt mailrc pine elm gnus"
1530 __gitcomp
"$__git_send_email_confirm_options"
1533 sendemail.suppresscc
)
1534 __gitcomp
"$__git_send_email_suppresscc_options"
1537 --get|
--get-all|
--unset|
--unset-all)
1538 __gitcomp
"$(__git_config_get_set_variables)"
1549 --global --system --file=
1550 --list --replace-all
1551 --get --get-all --get-regexp
1552 --add --unset --unset-all
1553 --remove-section --rename-section
1558 local pfx
="${cur%.*}."
1560 __gitcomp
"remote merge mergeoptions rebase" "$pfx" "$cur"
1564 local pfx
="${cur%.*}."
1566 __gitcomp
"$(__git_heads)" "$pfx" "$cur" "."
1570 local pfx
="${cur%.*}."
1573 argprompt cmd confirm needsfile noconsole norescan
1574 prompt revprompt revunmerged title
1579 local pfx
="${cur%.*}."
1581 __gitcomp
"cmd path" "$pfx" "$cur"
1585 local pfx
="${cur%.*}."
1587 __gitcomp
"cmd path" "$pfx" "$cur"
1591 local pfx
="${cur%.*}."
1593 __gitcomp
"cmd path trustExitCode" "$pfx" "$cur"
1597 local pfx
="${cur%.*}."
1599 __git_compute_all_commands
1600 __gitcomp
"$__git_all_commands" "$pfx" "$cur"
1604 local pfx
="${cur%.*}."
1607 url proxy fetch push mirror skipDefaultUpdate
1608 receivepack uploadpack tagopt pushurl
1613 local pfx
="${cur%.*}."
1615 __gitcomp
"$(__git_remotes)" "$pfx" "$cur" "."
1619 local pfx
="${cur%.*}."
1621 __gitcomp
"insteadOf pushInsteadOf" "$pfx" "$cur"
1628 apply.ignorewhitespace
1630 branch.autosetupmerge
1631 branch.autosetuprebase
1634 color.branch.current
1645 color.diff.whitespace
1650 color.interactive.header
1651 color.interactive.help
1652 color.interactive.prompt
1657 color.status.changed
1659 color.status.nobranch
1660 color.status.untracked
1661 color.status.updated
1668 core.deltaBaseCacheLimit
1672 core.fsyncobjectfiles
1674 core.ignoreCygwinFSTricks
1676 core.logAllRefUpdates
1677 core.loosecompression
1679 core.packedGitWindowSize
1681 core.preferSymlinkRefs
1684 core.repositoryFormatVersion
1686 core.sharedRepository
1689 core.warnAmbiguousRefs
1692 diff.autorefreshindex
1698 diff.suppressBlankEmpty
1710 format.subjectprefix
1719 gc.reflogexpireunreachable
1723 gitcvs.commitmsgannotation
1724 gitcvs.dbTableNamePrefix
1735 gui.copyblamethreshold
1739 gui.matchtrackingbranch
1740 gui.newbranchtemplate
1741 gui.pruneduringfetch
1742 gui.spellingdictionary
1758 i18n.logOutputEncoding
1763 imap.preformattedHTML
1772 interactive.singlekey
1785 mergetool.keepBackup
1788 pack.deltaCacheLimit
1801 receive.denyCurrentBranch
1803 receive.denyNonFastForwards
1806 repack.usedeltabaseoffset
1809 sendemail.aliasesfile
1810 sendemail.aliasesfiletype
1814 sendemail.chainreplyto
1816 sendemail.envelopesender
1818 sendemail.signedoffbycc
1819 sendemail.smtpencryption
1821 sendemail.smtpserver
1822 sendemail.smtpserverport
1824 sendemail.suppresscc
1825 sendemail.suppressfrom
1830 status.relativePaths
1831 status.showUntrackedFiles
1833 transfer.unpackLimit
1845 local subcommands
="add rename rm show prune update set-head"
1846 local subcommand
="$(__git_find_on_cmdline "$subcommands")"
1847 if [ -z "$subcommand" ]; then
1848 __gitcomp
"$subcommands"
1852 case "$subcommand" in
1853 rename|
rm|show|prune
)
1854 __gitcomp
"$(__git_remotes)"
1857 local i c
='' IFS
=$
'\n'
1858 for i
in $
(git
--git-dir="$(__gitdir)" config
--get-regexp "remotes\..*" 2>/dev
/null
); do
1872 __gitcomp
"$(__git_refs)"
1877 __git_has_doubledash
&& return
1879 local cur
="${COMP_WORDS[COMP_CWORD]}"
1882 __gitcomp
"--merge --mixed --hard --soft --patch"
1886 __gitcomp
"$(__git_refs)"
1891 local cur
="${COMP_WORDS[COMP_CWORD]}"
1894 __gitcomp
"--edit --mainline --no-edit --no-commit --signoff"
1898 __gitcomp
"$(__git_refs)"
1903 __git_has_doubledash
&& return
1905 local cur
="${COMP_WORDS[COMP_CWORD]}"
1908 __gitcomp
"--cached --dry-run --ignore-unmatch --quiet"
1917 __git_has_doubledash
&& return
1919 local cur
="${COMP_WORDS[COMP_CWORD]}"
1923 $__git_log_common_options
1924 $__git_log_shortlog_options
1925 --numbered --summary
1930 __git_complete_revlist
1935 __git_has_doubledash
&& return
1937 local cur
="${COMP_WORDS[COMP_CWORD]}"
1940 __gitcomp
"$__git_log_pretty_formats
1941 " "" "${cur##--pretty=}"
1945 __gitcomp
"$__git_log_pretty_formats
1946 " "" "${cur##--format=}"
1950 __gitcomp
"--pretty= --format= --abbrev-commit --oneline
1951 $__git_diff_common_options
1961 local cur
="${COMP_WORDS[COMP_CWORD]}"
1965 --all --remotes --topo-order --current --more=
1966 --list --independent --merge-base --no-name
1968 --sha1-name --sparse --topics --reflog
1973 __git_complete_revlist
1978 local cur
="${COMP_WORDS[COMP_CWORD]}"
1979 local save_opts
='--keep-index --no-keep-index --quiet --patch'
1980 local subcommands
='save list show apply clear drop pop create branch'
1981 local subcommand
="$(__git_find_on_cmdline "$subcommands")"
1982 if [ -z "$subcommand" ]; then
1985 __gitcomp
"$save_opts"
1988 if [ -z "$(__git_find_on_cmdline "$save_opts")" ]; then
1989 __gitcomp
"$subcommands"
1996 case "$subcommand,$cur" in
1998 __gitcomp
"$save_opts"
2001 __gitcomp
"--index --quiet"
2003 show
,--*|drop
,--*|branch
,--*)
2006 show
,*|apply
,*|drop
,*|pop
,*|branch
,*)
2007 __gitcomp
"$(git --git-dir="$
(__gitdir
)" stash list \
2008 | sed -n -e 's/:.*//p')"
2019 __git_has_doubledash
&& return
2021 local subcommands
="add status init update summary foreach sync"
2022 if [ -z "$(__git_find_on_cmdline "$subcommands")" ]; then
2023 local cur
="${COMP_WORDS[COMP_CWORD]}"
2026 __gitcomp
"--quiet --cached"
2029 __gitcomp
"$subcommands"
2039 init fetch clone rebase dcommit log find-rev
2040 set-tree commit-diff info create-ignore propget
2041 proplist show-ignore show-externals branch tag blame
2042 migrate mkdirs reset gc
2044 local subcommand
="$(__git_find_on_cmdline "$subcommands")"
2045 if [ -z "$subcommand" ]; then
2046 __gitcomp
"$subcommands"
2048 local remote_opts
="--username= --config-dir= --no-auth-cache"
2050 --follow-parent --authors-file= --repack=
2051 --no-metadata --use-svm-props --use-svnsync-props
2052 --log-window-size= --no-checkout --quiet
2053 --repack-flags --use-log-author --localtime
2054 --ignore-paths= $remote_opts
2057 --template= --shared= --trunk= --tags=
2058 --branches= --stdlayout --minimize-url
2059 --no-metadata --use-svm-props --use-svnsync-props
2060 --rewrite-root= --prefix= --use-log-author
2061 --add-author-from $remote_opts
2064 --edit --rmdir --find-copies-harder --copy-similarity=
2067 local cur
="${COMP_WORDS[COMP_CWORD]}"
2068 case "$subcommand,$cur" in
2070 __gitcomp
"--revision= --fetch-all $fc_opts"
2073 __gitcomp
"--revision= $fc_opts $init_opts"
2076 __gitcomp
"$init_opts"
2080 --merge --strategy= --verbose --dry-run
2081 --fetch-all --no-rebase --commit-url
2082 --revision $cmt_opts $fc_opts
2086 __gitcomp
"--stdin $cmt_opts $fc_opts"
2088 create-ignore
,--*|propget
,--*|proplist
,--*|show-ignore
,--*|\
2089 show-externals
,--*|mkdirs
,--*)
2090 __gitcomp
"--revision="
2094 --limit= --revision= --verbose --incremental
2095 --oneline --show-commit --non-recursive
2096 --authors-file= --color
2101 --merge --verbose --strategy= --local
2102 --fetch-all --dry-run $fc_opts
2106 __gitcomp
"--message= --file= --revision= $cmt_opts"
2112 __gitcomp
"--dry-run --message --tag"
2115 __gitcomp
"--dry-run --message"
2118 __gitcomp
"--git-format"
2122 --config-dir= --ignore-paths= --minimize
2123 --no-auth-cache --username=
2127 __gitcomp
"--revision= --parent"
2139 while [ $c -lt $COMP_CWORD ]; do
2140 i
="${COMP_WORDS[c]}"
2143 __gitcomp
"$(__git_tags)"
2153 case "${COMP_WORDS[COMP_CWORD-1]}" in
2159 __gitcomp
"$(__git_tags)"
2165 __gitcomp
"$(__git_refs)"
2172 local i c
=1 command __git_dir
2174 while [ $c -lt $COMP_CWORD ]; do
2175 i
="${COMP_WORDS[c]}"
2177 --git-dir=*) __git_dir
="${i#--git-dir=}" ;;
2178 --bare) __git_dir
="." ;;
2179 --version|
-p|
--paginate) ;;
2180 --help) command="help"; break ;;
2181 *) command="$i"; break ;;
2186 if [ -z "$command" ]; then
2187 case "${COMP_WORDS[COMP_CWORD]}" in
2200 *) __git_compute_porcelain_commands
2201 __gitcomp
"$__git_porcelain_commands $(__git_aliases)" ;;
2206 local expansion
=$
(__git_aliased_command
"$command")
2207 [ "$expansion" ] && command="$expansion"
2212 apply
) _git_apply
;;
2213 archive
) _git_archive
;;
2214 bisect
) _git_bisect
;;
2215 bundle
) _git_bundle
;;
2216 branch
) _git_branch
;;
2217 checkout
) _git_checkout
;;
2218 cherry
) _git_cherry
;;
2219 cherry-pick
) _git_cherry_pick
;;
2220 clean
) _git_clean
;;
2221 clone
) _git_clone
;;
2222 commit
) _git_commit
;;
2223 config
) _git_config
;;
2224 describe
) _git_describe
;;
2226 difftool
) _git_difftool
;;
2227 fetch
) _git_fetch
;;
2228 format-patch
) _git_format_patch
;;
2235 ls-files
) _git_ls_files
;;
2236 ls-remote
) _git_ls_remote
;;
2237 ls-tree
) _git_ls_tree
;;
2239 mergetool
) _git_mergetool
;;
2240 merge-base
) _git_merge_base
;;
2242 name-rev
) _git_name_rev
;;
2243 notes
) _git_notes
;;
2246 rebase
) _git_rebase
;;
2247 remote
) _git_remote
;;
2248 replace
) _git_replace
;;
2249 reset) _git_reset
;;
2250 revert
) _git_revert
;;
2252 send-email
) _git_send_email
;;
2253 shortlog
) _git_shortlog
;;
2255 show-branch
) _git_show_branch
;;
2256 stash
) _git_stash
;;
2258 submodule
) _git_submodule
;;
2261 whatchanged
) _git_log
;;
2268 __git_has_doubledash
&& return
2270 local cur
="${COMP_WORDS[COMP_CWORD]}"
2271 local g
="$(__gitdir)"
2273 if [ -f "$g/MERGE_HEAD" ]; then
2279 $__git_log_common_options
2280 $__git_log_gitk_options
2286 __git_complete_revlist
2289 complete
-o bashdefault
-o default
-o nospace
-F _git git
2>/dev
/null \
2290 || complete
-o default
-o nospace
-F _git git
2291 complete
-o bashdefault
-o default
-o nospace
-F _gitk gitk
2>/dev
/null \
2292 || complete
-o default
-o nospace
-F _gitk gitk
2294 # The following are necessary only for Cygwin, and only are needed
2295 # when the user has tab-completed the executable name and consequently
2296 # included the '.exe' suffix.
2298 if [ Cygwin
= "$(uname -o 2>/dev/null)" ]; then
2299 complete
-o bashdefault
-o default
-o nospace
-F _git git.exe
2>/dev
/null \
2300 || complete
-o default
-o nospace
-F _git git.exe