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 if [ -e "$dir/HEAD" ]; then echo HEAD
; fi
254 format
="refname:short"
255 refs
="refs/tags refs/heads refs/remotes"
258 git
--git-dir="$dir" for-each-ref
--format="%($format)" \
262 for i
in $
(git ls-remote
"$dir" 2>/dev
/null
); do
263 case "$is_hash,$i" in
266 n
,refs
/tags
/*) is_hash
=y
; echo "${i#refs/tags/}" ;;
267 n
,refs
/heads
/*) is_hash
=y
; echo "${i#refs/heads/}" ;;
268 n
,refs
/remotes
/*) is_hash
=y
; echo "${i#refs/remotes/}" ;;
269 n
,*) is_hash
=y
; echo "$i" ;;
274 # __git_refs2 requires 1 argument (to pass to __git_refs)
278 for i
in $
(__git_refs
"$1"); do
283 # __git_refs_remotes requires 1 argument (to pass to ls-remote)
284 __git_refs_remotes
()
286 local cmd i is_hash
=y
287 for i
in $
(git ls-remote
"$1" 2>/dev
/null
); do
288 case "$is_hash,$i" in
291 echo "$i:refs/remotes/$1/${i#refs/heads/}"
295 n
,refs
/tags
/*) is_hash
=y
;;
303 local i ngoff IFS
=$
'\n' d
="$(__gitdir)"
304 shopt -q nullglob || ngoff
=1
306 for i
in "$d/remotes"/*; do
307 echo ${i#$d/remotes/}
309 [ "$ngoff" ] && shopt -u nullglob
310 for i
in $
(git
--git-dir="$d" config
--get-regexp 'remote\..*\.url' 2>/dev
/null
); do
316 __git_list_merge_strategies
()
318 git merge
-s help 2>&1 |
319 sed -n -e '/[Aa]vailable strategies are: /,/^$/{
328 __git_merge_strategies
=
329 # 'git merge -s help' (and thus detection of the merge strategy
330 # list) fails, unfortunately, if run outside of any git working
331 # tree. __git_merge_strategies is set to the empty string in
332 # that case, and the detection will be repeated the next time it
334 __git_compute_merge_strategies
()
336 : ${__git_merge_strategies:=$(__git_list_merge_strategies)}
339 __git_complete_file
()
341 local pfx
ls ref cur
="${COMP_WORDS[COMP_CWORD]}"
358 case "$COMP_WORDBREAKS" in
360 *) pfx
="$ref:$pfx" ;;
364 COMPREPLY
=($
(compgen
-P "$pfx" \
365 -W "$(git --git-dir="$
(__gitdir
)" ls-tree "$ls" \
366 | sed '/^100... blob /{
382 __gitcomp
"$(__git_refs)"
387 __git_complete_revlist
()
389 local pfx cur
="${COMP_WORDS[COMP_CWORD]}"
394 __gitcomp
"$(__git_refs)" "$pfx" "$cur"
399 __gitcomp
"$(__git_refs)" "$pfx" "$cur"
402 __gitcomp
"$(__git_refs)"
407 __git_complete_remote_or_refspec
()
409 local cmd
="${COMP_WORDS[1]}"
410 local cur
="${COMP_WORDS[COMP_CWORD]}"
411 local i c
=2 remote
="" pfx
="" lhs
=1 no_complete_refspec
=0
412 while [ $c -lt $COMP_CWORD ]; do
415 --mirror) [ "$cmd" = "push" ] && no_complete_refspec
=1 ;;
418 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 __git_compute_merge_strategies
482 case "${COMP_WORDS[COMP_CWORD-1]}" in
484 __gitcomp
"$__git_merge_strategies"
487 local cur
="${COMP_WORDS[COMP_CWORD]}"
490 __gitcomp
"$__git_merge_strategies" "" "${cur##--strategy=}"
497 __git_list_all_commands
()
500 for i
in $
(git
help -a|
egrep '^ [a-zA-Z0-9]')
503 *--*) : helper pattern
;;
510 __git_compute_all_commands
()
512 : ${__git_all_commands:=$(__git_list_all_commands)}
515 __git_list_porcelain_commands
()
518 __git_compute_all_commands
519 for i
in "help" $__git_all_commands
522 *--*) : helper pattern
;;
523 applymbox
) : ask gittus
;;
524 applypatch
) : ask gittus
;;
525 archimport
) : import
;;
526 cat-file
) : plumbing
;;
527 check-attr
) : plumbing
;;
528 check-ref-format
) : plumbing
;;
529 checkout-index
) : plumbing
;;
530 commit-tree
) : plumbing
;;
531 count-objects
) : infrequent
;;
532 cvsexportcommit
) : export;;
533 cvsimport
) : import
;;
534 cvsserver
) : daemon
;;
536 diff-files
) : plumbing
;;
537 diff-index
) : plumbing
;;
538 diff-tree
) : plumbing
;;
539 fast-import
) : import
;;
540 fast-export
) : export;;
541 fsck-objects
) : plumbing
;;
542 fetch-pack
) : plumbing
;;
543 fmt-merge-msg
) : plumbing
;;
544 for-each-ref
) : plumbing
;;
545 hash-object
) : plumbing
;;
546 http-
*) : transport
;;
547 index-pack
) : plumbing
;;
548 init-db
) : deprecated
;;
549 local-fetch
) : plumbing
;;
550 lost-found
) : infrequent
;;
551 ls-files
) : plumbing
;;
552 ls-remote
) : plumbing
;;
553 ls-tree
) : plumbing
;;
554 mailinfo
) : plumbing
;;
555 mailsplit
) : plumbing
;;
556 merge-
*) : plumbing
;;
559 pack-objects
) : plumbing
;;
560 pack-redundant
) : plumbing
;;
561 pack-refs
) : plumbing
;;
562 parse-remote
) : plumbing
;;
563 patch-id
) : plumbing
;;
564 peek-remote
) : plumbing
;;
566 prune-packed
) : plumbing
;;
567 quiltimport
) : import
;;
568 read-tree
) : plumbing
;;
569 receive-pack
) : plumbing
;;
571 remote-
*) : transport
;;
572 repo-config
) : deprecated
;;
574 rev-list
) : plumbing
;;
575 rev-parse
) : plumbing
;;
576 runstatus
) : plumbing
;;
577 sh-setup
) : internal
;;
579 show-ref
) : plumbing
;;
580 send-pack
) : plumbing
;;
581 show-index
) : plumbing
;;
583 stripspace
) : plumbing
;;
584 symbolic-ref
) : plumbing
;;
585 tar-tree
) : deprecated
;;
586 unpack-file
) : plumbing
;;
587 unpack-objects
) : plumbing
;;
588 update-index
) : plumbing
;;
589 update-ref
) : plumbing
;;
590 update-server-info
) : daemon
;;
591 upload-archive
) : plumbing
;;
592 upload-pack
) : plumbing
;;
593 write-tree
) : plumbing
;;
595 verify-pack
) : infrequent
;;
596 verify-tag
) : plumbing
;;
602 __git_porcelain_commands
=
603 __git_compute_porcelain_commands
()
605 __git_compute_all_commands
606 : ${__git_porcelain_commands:=$(__git_list_porcelain_commands)}
612 for i
in $
(git
--git-dir="$(__gitdir)" config
--get-regexp "alias\..*" 2>/dev
/null
); do
622 # __git_aliased_command requires 1 argument
623 __git_aliased_command
()
625 local word cmdline
=$
(git
--git-dir="$(__gitdir)" \
626 config
--get "alias.$1")
627 for word
in $cmdline; do
633 \
!*) : shell
command alias ;;
635 *=*) : setting env
;;
644 # __git_find_on_cmdline requires 1 argument
645 __git_find_on_cmdline
()
647 local word subcommand c
=1
649 while [ $c -lt $COMP_CWORD ]; do
650 word
="${COMP_WORDS[c]}"
651 for subcommand
in $1; do
652 if [ "$subcommand" = "$word" ]; then
661 __git_has_doubledash
()
664 while [ $c -lt $COMP_CWORD ]; do
665 if [ "--" = "${COMP_WORDS[c]}" ]; then
673 __git_whitespacelist
="nowarn warn error error-all fix"
677 local cur
="${COMP_WORDS[COMP_CWORD]}" dir
="$(__gitdir)"
678 if [ -d "$dir"/rebase-apply
]; then
679 __gitcomp
"--skip --continue --resolved --abort"
684 __gitcomp
"$__git_whitespacelist" "" "${cur##--whitespace=}"
689 --3way --committer-date-is-author-date --ignore-date
690 --ignore-whitespace --ignore-space-change
691 --interactive --keep --no-utf8 --signoff --utf8
692 --whitespace= --scissors
701 local cur
="${COMP_WORDS[COMP_CWORD]}"
704 __gitcomp
"$__git_whitespacelist" "" "${cur##--whitespace=}"
709 --stat --numstat --summary --check --index
710 --cached --index-info --reverse --reject --unidiff-zero
711 --apply --no-add --exclude=
712 --ignore-whitespace --ignore-space-change
713 --whitespace= --inaccurate-eof --verbose
722 __git_has_doubledash
&& return
724 local cur
="${COMP_WORDS[COMP_CWORD]}"
728 --interactive --refresh --patch --update --dry-run
729 --ignore-errors --intent-to-add
738 local cur
="${COMP_WORDS[COMP_CWORD]}"
741 __gitcomp
"$(git archive --list)" "" "${cur##--format=}"
745 __gitcomp
"$(__git_remotes)" "" "${cur##--remote=}"
750 --format= --list --verbose
751 --prefix= --remote= --exec=
761 __git_has_doubledash
&& return
763 local subcommands
="start bad good skip reset visualize replay log run"
764 local subcommand
="$(__git_find_on_cmdline "$subcommands")"
765 if [ -z "$subcommand" ]; then
766 __gitcomp
"$subcommands"
770 case "$subcommand" in
772 __gitcomp
"$(__git_refs)"
782 local i c
=1 only_local_ref
="n" has_r
="n"
784 while [ $c -lt $COMP_CWORD ]; do
787 -d|
-m) only_local_ref
="y" ;;
793 case "${COMP_WORDS[COMP_CWORD]}" in
796 --color --no-color --verbose --abbrev= --no-abbrev
797 --track --no-track --contains --merged --no-merged
801 if [ $only_local_ref = "y" -a $has_r = "n" ]; then
802 __gitcomp
"$(__git_heads)"
804 __gitcomp
"$(__git_refs)"
812 local cmd
="${COMP_WORDS[2]}"
813 case "$COMP_CWORD" in
815 __gitcomp
"create list-heads verify unbundle"
823 __git_complete_revlist
832 __git_has_doubledash
&& return
834 local cur
="${COMP_WORDS[COMP_CWORD]}"
837 __gitcomp
"diff3 merge" "" "${cur##--conflict=}"
841 --quiet --ours --theirs --track --no-track --merge
846 __gitcomp
"$(__git_refs)"
853 __gitcomp
"$(__git_refs)"
858 local cur
="${COMP_WORDS[COMP_CWORD]}"
861 __gitcomp
"--edit --no-commit"
864 __gitcomp
"$(__git_refs)"
871 __git_has_doubledash
&& return
873 local cur
="${COMP_WORDS[COMP_CWORD]}"
876 __gitcomp
"--dry-run --quiet"
885 local cur
="${COMP_WORDS[COMP_CWORD]}"
910 __git_has_doubledash
&& return
912 local cur
="${COMP_WORDS[COMP_CWORD]}"
915 __gitcomp
"default strip verbatim whitespace
916 " "" "${cur##--cleanup=}"
920 __gitcomp
"$(__git_refs)" "" "${cur##--reuse-message=}"
924 __gitcomp
"$(__git_refs)" "" "${cur##--reedit-message=}"
928 __gitcomp
"all no normal" "" "${cur##--untracked-files=}"
933 --all --author= --signoff --verify --no-verify
934 --edit --amend --include --only --interactive
935 --dry-run --reuse-message= --reedit-message=
936 --reset-author --file= --message= --template=
937 --cleanup= --untracked-files --untracked-files=
947 local cur
="${COMP_WORDS[COMP_CWORD]}"
951 --all --tags --contains --abbrev= --candidates=
952 --exact-match --debug --long --match --always
956 __gitcomp
"$(__git_refs)"
959 __git_diff_common_options
="--stat --numstat --shortstat --summary
960 --patch-with-stat --name-only --name-status --color
961 --no-color --color-words --no-renames --check
962 --full-index --binary --abbrev --diff-filter=
964 --text --ignore-space-at-eol --ignore-space-change
965 --ignore-all-space --exit-code --quiet --ext-diff
967 --no-prefix --src-prefix= --dst-prefix=
968 --inter-hunk-context=
971 --dirstat --dirstat= --dirstat-by-file
972 --dirstat-by-file= --cumulative
977 __git_has_doubledash
&& return
979 local cur
="${COMP_WORDS[COMP_CWORD]}"
982 __gitcomp
"--cached --staged --pickaxe-all --pickaxe-regex
983 --base --ours --theirs
984 $__git_diff_common_options
992 __git_mergetools_common
="diffuse ecmerge emerge kdiff3 meld opendiff
993 tkdiff vimdiff gvimdiff xxdiff araxis p4merge
998 __git_has_doubledash
&& return
1000 local cur
="${COMP_WORDS[COMP_CWORD]}"
1003 __gitcomp
"$__git_mergetools_common kompare" "" "${cur##--tool=}"
1007 __gitcomp
"--cached --staged --pickaxe-all --pickaxe-regex
1008 --base --ours --theirs
1009 --no-renames --diff-filter= --find-copies-harder
1010 --relative --ignore-submodules
1018 __git_fetch_options
="
1019 --quiet --verbose --append --upload-pack --force --keep --depth=
1020 --tags --no-tags --all --prune --dry-run
1025 local cur
="${COMP_WORDS[COMP_CWORD]}"
1028 __gitcomp
"$__git_fetch_options"
1032 __git_complete_remote_or_refspec
1035 _git_format_patch
()
1037 local cur
="${COMP_WORDS[COMP_CWORD]}"
1042 " "" "${cur##--thread=}"
1047 --stdout --attach --no-attach --thread --thread=
1049 --numbered --start-number
1053 --in-reply-to= --cc=
1054 --full-index --binary
1057 --no-prefix --src-prefix= --dst-prefix=
1058 --inline --suffix= --ignore-if-in-upstream
1064 __git_complete_revlist
1069 local cur
="${COMP_WORDS[COMP_CWORD]}"
1073 --tags --root --unreachable --cache --no-reflogs --full
1074 --strict --verbose --lost-found
1084 local cur
="${COMP_WORDS[COMP_CWORD]}"
1087 __gitcomp
"--prune --aggressive"
1101 __git_has_doubledash
&& return
1103 local cur
="${COMP_WORDS[COMP_CWORD]}"
1108 --text --ignore-case --word-regexp --invert-match
1110 --extended-regexp --basic-regexp --fixed-strings
1111 --files-with-matches --name-only
1112 --files-without-match
1115 --and --or --not --all-match
1121 __gitcomp
"$(__git_refs)"
1126 local cur
="${COMP_WORDS[COMP_CWORD]}"
1129 __gitcomp
"--all --info --man --web"
1133 __git_compute_all_commands
1134 __gitcomp
"$__git_all_commands
1135 attributes cli core-tutorial cvs-migration
1136 diffcore gitk glossary hooks ignore modules
1137 repository-layout tutorial tutorial-2
1144 local cur
="${COMP_WORDS[COMP_CWORD]}"
1148 false true umask group all world everybody
1149 " "" "${cur##--shared=}"
1153 __gitcomp
"--quiet --bare --template= --shared --shared="
1162 __git_has_doubledash
&& return
1164 local cur
="${COMP_WORDS[COMP_CWORD]}"
1167 __gitcomp
"--cached --deleted --modified --others --ignored
1168 --stage --directory --no-empty-directory --unmerged
1169 --killed --exclude= --exclude-from=
1170 --exclude-per-directory= --exclude-standard
1171 --error-unmatch --with-tree= --full-name
1172 --abbrev --ignored --exclude-per-directory
1182 __gitcomp
"$(__git_remotes)"
1190 # Options that go well for log, shortlog and gitk
1191 __git_log_common_options
="
1193 --branches --tags --remotes
1194 --first-parent --merges --no-merges
1196 --max-age= --since= --after=
1197 --min-age= --until= --before=
1199 # Options that go well for log and gitk (not shortlog)
1200 __git_log_gitk_options
="
1201 --dense --sparse --full-history
1202 --simplify-merges --simplify-by-decoration
1205 # Options that go well for log and shortlog (not gitk)
1206 __git_log_shortlog_options
="
1207 --author= --committer= --grep=
1211 __git_log_pretty_formats
="oneline short medium full fuller email raw format:"
1212 __git_log_date_formats
="relative iso8601 rfc2822 short local default raw"
1216 __git_has_doubledash
&& return
1218 local cur
="${COMP_WORDS[COMP_CWORD]}"
1219 local g
="$(git rev-parse --git-dir 2>/dev/null)"
1221 if [ -f "$g/MERGE_HEAD" ]; then
1226 __gitcomp
"$__git_log_pretty_formats
1227 " "" "${cur##--pretty=}"
1231 __gitcomp
"$__git_log_pretty_formats
1232 " "" "${cur##--format=}"
1236 __gitcomp
"$__git_log_date_formats" "" "${cur##--date=}"
1240 __gitcomp
"long short" "" "${cur##--decorate=}"
1245 $__git_log_common_options
1246 $__git_log_shortlog_options
1247 $__git_log_gitk_options
1248 --root --topo-order --date-order --reverse
1249 --follow --full-diff
1250 --abbrev-commit --abbrev=
1251 --relative-date --date=
1252 --pretty= --format= --oneline
1255 --decorate --decorate=
1257 --parents --children
1259 $__git_diff_common_options
1260 --pickaxe-all --pickaxe-regex
1265 __git_complete_revlist
1268 __git_merge_options
="
1269 --no-commit --no-stat --log --no-log --squash --strategy
1270 --commit --stat --no-squash --ff --no-ff --ff-only
1275 __git_complete_strategy
&& return
1277 local cur
="${COMP_WORDS[COMP_CWORD]}"
1280 __gitcomp
"$__git_merge_options"
1283 __gitcomp
"$(__git_refs)"
1288 local cur
="${COMP_WORDS[COMP_CWORD]}"
1291 __gitcomp
"$__git_mergetools_common tortoisemerge" "" "${cur##--tool=}"
1304 __gitcomp
"$(__git_refs)"
1309 local cur
="${COMP_WORDS[COMP_CWORD]}"
1312 __gitcomp
"--dry-run"
1321 __gitcomp
"--tags --all --stdin"
1326 local subcommands
="edit show"
1327 if [ -z "$(__git_find_on_cmdline "$subcommands")" ]; then
1328 __gitcomp
"$subcommands"
1332 case "${COMP_WORDS[COMP_CWORD-1]}" in
1337 __gitcomp
"$(__git_refs)"
1344 __git_complete_strategy
&& return
1346 local cur
="${COMP_WORDS[COMP_CWORD]}"
1350 --rebase --no-rebase
1351 $__git_merge_options
1352 $__git_fetch_options
1357 __git_complete_remote_or_refspec
1362 local cur
="${COMP_WORDS[COMP_CWORD]}"
1363 case "${COMP_WORDS[COMP_CWORD-1]}" in
1365 __gitcomp
"$(__git_remotes)"
1370 __gitcomp
"$(__git_remotes)" "" "${cur##--repo=}"
1375 --all --mirror --tags --dry-run --force --verbose
1376 --receive-pack= --repo=
1381 __git_complete_remote_or_refspec
1386 local cur
="${COMP_WORDS[COMP_CWORD]}" dir
="$(__gitdir)"
1387 if [ -d "$dir"/rebase-apply
] ||
[ -d "$dir"/rebase-merge
]; then
1388 __gitcomp
"--continue --skip --abort"
1391 __git_complete_strategy
&& return
1394 __gitcomp
"$__git_whitespacelist" "" "${cur##--whitespace=}"
1399 --onto --merge --strategy --interactive
1400 --preserve-merges --stat --no-stat
1401 --committer-date-is-author-date --ignore-date
1402 --ignore-whitespace --whitespace=
1408 __gitcomp
"$(__git_refs)"
1411 __git_send_email_confirm_options
="always never auto cc compose"
1412 __git_send_email_suppresscc_options
="author self cc bodycc sob cccmd body all"
1416 local cur
="${COMP_WORDS[COMP_CWORD]}"
1420 $__git_send_email_confirm_options
1421 " "" "${cur##--confirm=}"
1426 $__git_send_email_suppresscc_options
1427 " "" "${cur##--suppress-cc=}"
1431 --smtp-encryption=*)
1432 __gitcomp
"ssl tls" "" "${cur##--smtp-encryption=}"
1436 __gitcomp
"--annotate --bcc --cc --cc-cmd --chain-reply-to
1437 --compose --confirm= --dry-run --envelope-sender
1439 --in-reply-to --no-chain-reply-to --no-signed-off-by-cc
1440 --no-suppress-from --no-thread --quiet
1441 --signed-off-by-cc --smtp-pass --smtp-server
1442 --smtp-server-port --smtp-encryption= --smtp-user
1443 --subject --suppress-cc= --suppress-from --thread --to
1444 --validate --no-validate"
1456 __git_config_get_set_variables
()
1458 local prevword word config_file
= c
=$COMP_CWORD
1459 while [ $c -gt 1 ]; do
1460 word
="${COMP_WORDS[c]}"
1462 --global|
--system|
--file=*)
1467 config_file
="$word $prevword"
1475 git
--git-dir="$(__gitdir)" config
$config_file --list 2>/dev
/null |
1488 local cur
="${COMP_WORDS[COMP_CWORD]}"
1489 local prv
="${COMP_WORDS[COMP_CWORD-1]}"
1492 __gitcomp
"$(__git_remotes)"
1496 __gitcomp
"$(__git_refs)"
1500 local remote
="${prv#remote.}"
1501 remote
="${remote%.fetch}"
1502 __gitcomp
"$(__git_refs_remotes "$remote")"
1506 local remote
="${prv#remote.}"
1507 remote
="${remote%.push}"
1508 __gitcomp
"$(git --git-dir="$
(__gitdir
)" \
1509 for-each-ref --format='%(refname):%(refname)' \
1513 pull.twohead|pull.octopus
)
1514 __git_compute_merge_strategies
1515 __gitcomp
"$__git_merge_strategies"
1518 color.branch|color.
diff|color.interactive|\
1519 color.showbranch|color.status|color.ui
)
1520 __gitcomp
"always never auto"
1524 __gitcomp
"false true"
1529 normal black red green yellow blue magenta cyan white
1530 bold dim ul blink reverse
1535 __gitcomp
"man info web html"
1539 __gitcomp
"$__git_log_date_formats"
1542 sendemail.aliasesfiletype
)
1543 __gitcomp
"mutt mailrc pine elm gnus"
1547 __gitcomp
"$__git_send_email_confirm_options"
1550 sendemail.suppresscc
)
1551 __gitcomp
"$__git_send_email_suppresscc_options"
1554 --get|
--get-all|
--unset|
--unset-all)
1555 __gitcomp
"$(__git_config_get_set_variables)"
1566 --global --system --file=
1567 --list --replace-all
1568 --get --get-all --get-regexp
1569 --add --unset --unset-all
1570 --remove-section --rename-section
1575 local pfx
="${cur%.*}."
1577 __gitcomp
"remote merge mergeoptions rebase" "$pfx" "$cur"
1581 local pfx
="${cur%.*}."
1583 __gitcomp
"$(__git_heads)" "$pfx" "$cur" "."
1587 local pfx
="${cur%.*}."
1590 argprompt cmd confirm needsfile noconsole norescan
1591 prompt revprompt revunmerged title
1596 local pfx
="${cur%.*}."
1598 __gitcomp
"cmd path" "$pfx" "$cur"
1602 local pfx
="${cur%.*}."
1604 __gitcomp
"cmd path" "$pfx" "$cur"
1608 local pfx
="${cur%.*}."
1610 __gitcomp
"cmd path trustExitCode" "$pfx" "$cur"
1614 local pfx
="${cur%.*}."
1616 __git_compute_all_commands
1617 __gitcomp
"$__git_all_commands" "$pfx" "$cur"
1621 local pfx
="${cur%.*}."
1624 url proxy fetch push mirror skipDefaultUpdate
1625 receivepack uploadpack tagopt pushurl
1630 local pfx
="${cur%.*}."
1632 __gitcomp
"$(__git_remotes)" "$pfx" "$cur" "."
1636 local pfx
="${cur%.*}."
1638 __gitcomp
"insteadOf pushInsteadOf" "$pfx" "$cur"
1645 apply.ignorewhitespace
1647 branch.autosetupmerge
1648 branch.autosetuprebase
1651 color.branch.current
1662 color.diff.whitespace
1667 color.interactive.header
1668 color.interactive.help
1669 color.interactive.prompt
1674 color.status.changed
1676 color.status.nobranch
1677 color.status.untracked
1678 color.status.updated
1685 core.deltaBaseCacheLimit
1689 core.fsyncobjectfiles
1691 core.ignoreCygwinFSTricks
1693 core.logAllRefUpdates
1694 core.loosecompression
1696 core.packedGitWindowSize
1698 core.preferSymlinkRefs
1701 core.repositoryFormatVersion
1703 core.sharedRepository
1706 core.warnAmbiguousRefs
1709 diff.autorefreshindex
1715 diff.suppressBlankEmpty
1727 format.subjectprefix
1736 gc.reflogexpireunreachable
1740 gitcvs.commitmsgannotation
1741 gitcvs.dbTableNamePrefix
1752 gui.copyblamethreshold
1756 gui.matchtrackingbranch
1757 gui.newbranchtemplate
1758 gui.pruneduringfetch
1759 gui.spellingdictionary
1775 i18n.logOutputEncoding
1780 imap.preformattedHTML
1789 interactive.singlekey
1802 mergetool.keepBackup
1805 pack.deltaCacheLimit
1818 receive.denyCurrentBranch
1820 receive.denyNonFastForwards
1823 repack.usedeltabaseoffset
1826 sendemail.aliasesfile
1827 sendemail.aliasesfiletype
1831 sendemail.chainreplyto
1833 sendemail.envelopesender
1835 sendemail.signedoffbycc
1836 sendemail.smtpencryption
1838 sendemail.smtpserver
1839 sendemail.smtpserverport
1841 sendemail.suppresscc
1842 sendemail.suppressfrom
1847 status.relativePaths
1848 status.showUntrackedFiles
1850 transfer.unpackLimit
1862 local subcommands
="add rename rm show prune update set-head"
1863 local subcommand
="$(__git_find_on_cmdline "$subcommands")"
1864 if [ -z "$subcommand" ]; then
1865 __gitcomp
"$subcommands"
1869 case "$subcommand" in
1870 rename|
rm|show|prune
)
1871 __gitcomp
"$(__git_remotes)"
1874 local i c
='' IFS
=$
'\n'
1875 for i
in $
(git
--git-dir="$(__gitdir)" config
--get-regexp "remotes\..*" 2>/dev
/null
); do
1889 __gitcomp
"$(__git_refs)"
1894 __git_has_doubledash
&& return
1896 local cur
="${COMP_WORDS[COMP_CWORD]}"
1899 __gitcomp
"--merge --mixed --hard --soft --patch"
1903 __gitcomp
"$(__git_refs)"
1908 local cur
="${COMP_WORDS[COMP_CWORD]}"
1911 __gitcomp
"--edit --mainline --no-edit --no-commit --signoff"
1915 __gitcomp
"$(__git_refs)"
1920 __git_has_doubledash
&& return
1922 local cur
="${COMP_WORDS[COMP_CWORD]}"
1925 __gitcomp
"--cached --dry-run --ignore-unmatch --quiet"
1934 __git_has_doubledash
&& return
1936 local cur
="${COMP_WORDS[COMP_CWORD]}"
1940 $__git_log_common_options
1941 $__git_log_shortlog_options
1942 --numbered --summary
1947 __git_complete_revlist
1952 __git_has_doubledash
&& return
1954 local cur
="${COMP_WORDS[COMP_CWORD]}"
1957 __gitcomp
"$__git_log_pretty_formats
1958 " "" "${cur##--pretty=}"
1962 __gitcomp
"$__git_log_pretty_formats
1963 " "" "${cur##--format=}"
1967 __gitcomp
"--pretty= --format= --abbrev-commit --oneline
1968 $__git_diff_common_options
1978 local cur
="${COMP_WORDS[COMP_CWORD]}"
1982 --all --remotes --topo-order --current --more=
1983 --list --independent --merge-base --no-name
1985 --sha1-name --sparse --topics --reflog
1990 __git_complete_revlist
1995 local cur
="${COMP_WORDS[COMP_CWORD]}"
1996 local save_opts
='--keep-index --no-keep-index --quiet --patch'
1997 local subcommands
='save list show apply clear drop pop create branch'
1998 local subcommand
="$(__git_find_on_cmdline "$subcommands")"
1999 if [ -z "$subcommand" ]; then
2002 __gitcomp
"$save_opts"
2005 if [ -z "$(__git_find_on_cmdline "$save_opts")" ]; then
2006 __gitcomp
"$subcommands"
2013 case "$subcommand,$cur" in
2015 __gitcomp
"$save_opts"
2018 __gitcomp
"--index --quiet"
2020 show
,--*|drop
,--*|branch
,--*)
2023 show
,*|apply
,*|drop
,*|pop
,*|branch
,*)
2024 __gitcomp
"$(git --git-dir="$
(__gitdir
)" stash list \
2025 | sed -n -e 's/:.*//p')"
2036 __git_has_doubledash
&& return
2038 local subcommands
="add status init update summary foreach sync"
2039 if [ -z "$(__git_find_on_cmdline "$subcommands")" ]; then
2040 local cur
="${COMP_WORDS[COMP_CWORD]}"
2043 __gitcomp
"--quiet --cached"
2046 __gitcomp
"$subcommands"
2056 init fetch clone rebase dcommit log find-rev
2057 set-tree commit-diff info create-ignore propget
2058 proplist show-ignore show-externals branch tag blame
2059 migrate mkdirs reset gc
2061 local subcommand
="$(__git_find_on_cmdline "$subcommands")"
2062 if [ -z "$subcommand" ]; then
2063 __gitcomp
"$subcommands"
2065 local remote_opts
="--username= --config-dir= --no-auth-cache"
2067 --follow-parent --authors-file= --repack=
2068 --no-metadata --use-svm-props --use-svnsync-props
2069 --log-window-size= --no-checkout --quiet
2070 --repack-flags --use-log-author --localtime
2071 --ignore-paths= $remote_opts
2074 --template= --shared= --trunk= --tags=
2075 --branches= --stdlayout --minimize-url
2076 --no-metadata --use-svm-props --use-svnsync-props
2077 --rewrite-root= --prefix= --use-log-author
2078 --add-author-from $remote_opts
2081 --edit --rmdir --find-copies-harder --copy-similarity=
2084 local cur
="${COMP_WORDS[COMP_CWORD]}"
2085 case "$subcommand,$cur" in
2087 __gitcomp
"--revision= --fetch-all $fc_opts"
2090 __gitcomp
"--revision= $fc_opts $init_opts"
2093 __gitcomp
"$init_opts"
2097 --merge --strategy= --verbose --dry-run
2098 --fetch-all --no-rebase --commit-url
2099 --revision $cmt_opts $fc_opts
2103 __gitcomp
"--stdin $cmt_opts $fc_opts"
2105 create-ignore
,--*|propget
,--*|proplist
,--*|show-ignore
,--*|\
2106 show-externals
,--*|mkdirs
,--*)
2107 __gitcomp
"--revision="
2111 --limit= --revision= --verbose --incremental
2112 --oneline --show-commit --non-recursive
2113 --authors-file= --color
2118 --merge --verbose --strategy= --local
2119 --fetch-all --dry-run $fc_opts
2123 __gitcomp
"--message= --file= --revision= $cmt_opts"
2129 __gitcomp
"--dry-run --message --tag"
2132 __gitcomp
"--dry-run --message"
2135 __gitcomp
"--git-format"
2139 --config-dir= --ignore-paths= --minimize
2140 --no-auth-cache --username=
2144 __gitcomp
"--revision= --parent"
2156 while [ $c -lt $COMP_CWORD ]; do
2157 i
="${COMP_WORDS[c]}"
2160 __gitcomp
"$(__git_tags)"
2170 case "${COMP_WORDS[COMP_CWORD-1]}" in
2176 __gitcomp
"$(__git_tags)"
2182 __gitcomp
"$(__git_refs)"
2194 local i c
=1 command __git_dir
2196 while [ $c -lt $COMP_CWORD ]; do
2197 i
="${COMP_WORDS[c]}"
2199 --git-dir=*) __git_dir
="${i#--git-dir=}" ;;
2200 --bare) __git_dir
="." ;;
2201 --version|
-p|
--paginate) ;;
2202 --help) command="help"; break ;;
2203 *) command="$i"; break ;;
2208 if [ -z "$command" ]; then
2209 case "${COMP_WORDS[COMP_CWORD]}" in
2222 *) __git_compute_porcelain_commands
2223 __gitcomp
"$__git_porcelain_commands $(__git_aliases)" ;;
2228 local completion_func
="_git_${command//-/_}"
2229 declare -F $completion_func >/dev
/null
&& $completion_func && return
2231 local expansion
=$
(__git_aliased_command
"$command")
2232 if [ -n "$expansion" ]; then
2233 completion_func
="_git_${expansion//-/_}"
2234 declare -F $completion_func >/dev
/null
&& $completion_func
2240 __git_has_doubledash
&& return
2242 local cur
="${COMP_WORDS[COMP_CWORD]}"
2243 local g
="$(__gitdir)"
2245 if [ -f "$g/MERGE_HEAD" ]; then
2251 $__git_log_common_options
2252 $__git_log_gitk_options
2258 __git_complete_revlist
2261 complete
-o bashdefault
-o default
-o nospace
-F _git git
2>/dev
/null \
2262 || complete
-o default
-o nospace
-F _git git
2263 complete
-o bashdefault
-o default
-o nospace
-F _gitk gitk
2>/dev
/null \
2264 || complete
-o default
-o nospace
-F _gitk gitk
2266 # The following are necessary only for Cygwin, and only are needed
2267 # when the user has tab-completed the executable name and consequently
2268 # included the '.exe' suffix.
2270 if [ Cygwin
= "$(uname -o 2>/dev/null)" ]; then
2271 complete
-o bashdefault
-o default
-o nospace
-F _git git.exe
2>/dev
/null \
2272 || complete
-o default
-o nospace
-F _git git.exe