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
629 \
!*) : shell
command alias ;;
631 *=*) : setting env
;;
640 # __git_find_on_cmdline requires 1 argument
641 __git_find_on_cmdline
()
643 local word subcommand c
=1
645 while [ $c -lt $COMP_CWORD ]; do
646 word
="${COMP_WORDS[c]}"
647 for subcommand
in $1; do
648 if [ "$subcommand" = "$word" ]; then
657 __git_has_doubledash
()
660 while [ $c -lt $COMP_CWORD ]; do
661 if [ "--" = "${COMP_WORDS[c]}" ]; then
669 __git_whitespacelist
="nowarn warn error error-all fix"
673 local cur
="${COMP_WORDS[COMP_CWORD]}" dir
="$(__gitdir)"
674 if [ -d "$dir"/rebase-apply
]; then
675 __gitcomp
"--skip --continue --resolved --abort"
680 __gitcomp
"$__git_whitespacelist" "" "${cur##--whitespace=}"
685 --3way --committer-date-is-author-date --ignore-date
686 --ignore-whitespace --ignore-space-change
687 --interactive --keep --no-utf8 --signoff --utf8
688 --whitespace= --scissors
697 local cur
="${COMP_WORDS[COMP_CWORD]}"
700 __gitcomp
"$__git_whitespacelist" "" "${cur##--whitespace=}"
705 --stat --numstat --summary --check --index
706 --cached --index-info --reverse --reject --unidiff-zero
707 --apply --no-add --exclude=
708 --ignore-whitespace --ignore-space-change
709 --whitespace= --inaccurate-eof --verbose
718 __git_has_doubledash
&& return
720 local cur
="${COMP_WORDS[COMP_CWORD]}"
724 --interactive --refresh --patch --update --dry-run
725 --ignore-errors --intent-to-add
734 local cur
="${COMP_WORDS[COMP_CWORD]}"
737 __gitcomp
"$(git archive --list)" "" "${cur##--format=}"
741 __gitcomp
"$(__git_remotes)" "" "${cur##--remote=}"
746 --format= --list --verbose
747 --prefix= --remote= --exec=
757 __git_has_doubledash
&& return
759 local subcommands
="start bad good skip reset visualize replay log run"
760 local subcommand
="$(__git_find_on_cmdline "$subcommands")"
761 if [ -z "$subcommand" ]; then
762 __gitcomp
"$subcommands"
766 case "$subcommand" in
768 __gitcomp
"$(__git_refs)"
778 local i c
=1 only_local_ref
="n" has_r
="n"
780 while [ $c -lt $COMP_CWORD ]; do
783 -d|
-m) only_local_ref
="y" ;;
789 case "${COMP_WORDS[COMP_CWORD]}" in
792 --color --no-color --verbose --abbrev= --no-abbrev
793 --track --no-track --contains --merged --no-merged
797 if [ $only_local_ref = "y" -a $has_r = "n" ]; then
798 __gitcomp
"$(__git_heads)"
800 __gitcomp
"$(__git_refs)"
808 local cmd
="${COMP_WORDS[2]}"
809 case "$COMP_CWORD" in
811 __gitcomp
"create list-heads verify unbundle"
819 __git_complete_revlist
828 __git_has_doubledash
&& return
830 local cur
="${COMP_WORDS[COMP_CWORD]}"
833 __gitcomp
"diff3 merge" "" "${cur##--conflict=}"
837 --quiet --ours --theirs --track --no-track --merge
842 __gitcomp
"$(__git_refs)"
849 __gitcomp
"$(__git_refs)"
854 local cur
="${COMP_WORDS[COMP_CWORD]}"
857 __gitcomp
"--edit --no-commit"
860 __gitcomp
"$(__git_refs)"
867 __git_has_doubledash
&& return
869 local cur
="${COMP_WORDS[COMP_CWORD]}"
872 __gitcomp
"--dry-run --quiet"
881 local cur
="${COMP_WORDS[COMP_CWORD]}"
906 __git_has_doubledash
&& return
908 local cur
="${COMP_WORDS[COMP_CWORD]}"
911 __gitcomp
"default strip verbatim whitespace
912 " "" "${cur##--cleanup=}"
916 __gitcomp
"$(__git_refs)" "" "${cur##--reuse-message=}"
920 __gitcomp
"$(__git_refs)" "" "${cur##--reedit-message=}"
924 __gitcomp
"all no normal" "" "${cur##--untracked-files=}"
929 --all --author= --signoff --verify --no-verify
930 --edit --amend --include --only --interactive
931 --dry-run --reuse-message= --reedit-message=
932 --reset-author --file= --message= --template=
933 --cleanup= --untracked-files --untracked-files=
943 local cur
="${COMP_WORDS[COMP_CWORD]}"
947 --all --tags --contains --abbrev= --candidates=
948 --exact-match --debug --long --match --always
952 __gitcomp
"$(__git_refs)"
955 __git_diff_common_options
="--stat --numstat --shortstat --summary
956 --patch-with-stat --name-only --name-status --color
957 --no-color --color-words --no-renames --check
958 --full-index --binary --abbrev --diff-filter=
960 --text --ignore-space-at-eol --ignore-space-change
961 --ignore-all-space --exit-code --quiet --ext-diff
963 --no-prefix --src-prefix= --dst-prefix=
964 --inter-hunk-context=
967 --dirstat --dirstat= --dirstat-by-file
968 --dirstat-by-file= --cumulative
973 __git_has_doubledash
&& return
975 local cur
="${COMP_WORDS[COMP_CWORD]}"
978 __gitcomp
"--cached --staged --pickaxe-all --pickaxe-regex
979 --base --ours --theirs
980 $__git_diff_common_options
988 __git_mergetools_common
="diffuse ecmerge emerge kdiff3 meld opendiff
989 tkdiff vimdiff gvimdiff xxdiff araxis p4merge
994 __git_has_doubledash
&& return
996 local cur
="${COMP_WORDS[COMP_CWORD]}"
999 __gitcomp
"$__git_mergetools_common kompare" "" "${cur##--tool=}"
1003 __gitcomp
"--cached --staged --pickaxe-all --pickaxe-regex
1004 --base --ours --theirs
1005 --no-renames --diff-filter= --find-copies-harder
1006 --relative --ignore-submodules
1014 __git_fetch_options
="
1015 --quiet --verbose --append --upload-pack --force --keep --depth=
1016 --tags --no-tags --all --prune --dry-run
1021 local cur
="${COMP_WORDS[COMP_CWORD]}"
1024 __gitcomp
"$__git_fetch_options"
1028 __git_complete_remote_or_refspec
1031 _git_format_patch
()
1033 local cur
="${COMP_WORDS[COMP_CWORD]}"
1038 " "" "${cur##--thread=}"
1043 --stdout --attach --no-attach --thread --thread=
1045 --numbered --start-number
1049 --in-reply-to= --cc=
1050 --full-index --binary
1053 --no-prefix --src-prefix= --dst-prefix=
1054 --inline --suffix= --ignore-if-in-upstream
1060 __git_complete_revlist
1065 local cur
="${COMP_WORDS[COMP_CWORD]}"
1069 --tags --root --unreachable --cache --no-reflogs --full
1070 --strict --verbose --lost-found
1080 local cur
="${COMP_WORDS[COMP_CWORD]}"
1083 __gitcomp
"--prune --aggressive"
1092 __git_has_doubledash
&& return
1094 local cur
="${COMP_WORDS[COMP_CWORD]}"
1099 --text --ignore-case --word-regexp --invert-match
1101 --extended-regexp --basic-regexp --fixed-strings
1102 --files-with-matches --name-only
1103 --files-without-match
1106 --and --or --not --all-match
1112 __gitcomp
"$(__git_refs)"
1117 local cur
="${COMP_WORDS[COMP_CWORD]}"
1120 __gitcomp
"--all --info --man --web"
1124 __git_compute_all_commands
1125 __gitcomp
"$__git_all_commands
1126 attributes cli core-tutorial cvs-migration
1127 diffcore gitk glossary hooks ignore modules
1128 repository-layout tutorial tutorial-2
1135 local cur
="${COMP_WORDS[COMP_CWORD]}"
1139 false true umask group all world everybody
1140 " "" "${cur##--shared=}"
1144 __gitcomp
"--quiet --bare --template= --shared --shared="
1153 __git_has_doubledash
&& return
1155 local cur
="${COMP_WORDS[COMP_CWORD]}"
1158 __gitcomp
"--cached --deleted --modified --others --ignored
1159 --stage --directory --no-empty-directory --unmerged
1160 --killed --exclude= --exclude-from=
1161 --exclude-per-directory= --exclude-standard
1162 --error-unmatch --with-tree= --full-name
1163 --abbrev --ignored --exclude-per-directory
1173 __gitcomp
"$(__git_remotes)"
1181 # Options that go well for log, shortlog and gitk
1182 __git_log_common_options
="
1184 --branches --tags --remotes
1185 --first-parent --merges --no-merges
1187 --max-age= --since= --after=
1188 --min-age= --until= --before=
1190 # Options that go well for log and gitk (not shortlog)
1191 __git_log_gitk_options
="
1192 --dense --sparse --full-history
1193 --simplify-merges --simplify-by-decoration
1196 # Options that go well for log and shortlog (not gitk)
1197 __git_log_shortlog_options
="
1198 --author= --committer= --grep=
1202 __git_log_pretty_formats
="oneline short medium full fuller email raw format:"
1203 __git_log_date_formats
="relative iso8601 rfc2822 short local default raw"
1207 __git_has_doubledash
&& return
1209 local cur
="${COMP_WORDS[COMP_CWORD]}"
1210 local g
="$(git rev-parse --git-dir 2>/dev/null)"
1212 if [ -f "$g/MERGE_HEAD" ]; then
1217 __gitcomp
"$__git_log_pretty_formats
1218 " "" "${cur##--pretty=}"
1222 __gitcomp
"$__git_log_pretty_formats
1223 " "" "${cur##--format=}"
1227 __gitcomp
"$__git_log_date_formats" "" "${cur##--date=}"
1231 __gitcomp
"long short" "" "${cur##--decorate=}"
1236 $__git_log_common_options
1237 $__git_log_shortlog_options
1238 $__git_log_gitk_options
1239 --root --topo-order --date-order --reverse
1240 --follow --full-diff
1241 --abbrev-commit --abbrev=
1242 --relative-date --date=
1243 --pretty= --format= --oneline
1246 --decorate --decorate=
1248 --parents --children
1250 $__git_diff_common_options
1251 --pickaxe-all --pickaxe-regex
1256 __git_complete_revlist
1259 __git_merge_options
="
1260 --no-commit --no-stat --log --no-log --squash --strategy
1261 --commit --stat --no-squash --ff --no-ff --ff-only
1266 __git_complete_strategy
&& return
1268 local cur
="${COMP_WORDS[COMP_CWORD]}"
1271 __gitcomp
"$__git_merge_options"
1274 __gitcomp
"$(__git_refs)"
1279 local cur
="${COMP_WORDS[COMP_CWORD]}"
1282 __gitcomp
"$__git_mergetools_common tortoisemerge" "" "${cur##--tool=}"
1295 __gitcomp
"$(__git_refs)"
1300 local cur
="${COMP_WORDS[COMP_CWORD]}"
1303 __gitcomp
"--dry-run"
1312 __gitcomp
"--tags --all --stdin"
1317 local subcommands
="edit show"
1318 if [ -z "$(__git_find_on_cmdline "$subcommands")" ]; then
1319 __gitcomp
"$subcommands"
1323 case "${COMP_WORDS[COMP_CWORD-1]}" in
1328 __gitcomp
"$(__git_refs)"
1335 __git_complete_strategy
&& return
1337 local cur
="${COMP_WORDS[COMP_CWORD]}"
1341 --rebase --no-rebase
1342 $__git_merge_options
1343 $__git_fetch_options
1348 __git_complete_remote_or_refspec
1353 local cur
="${COMP_WORDS[COMP_CWORD]}"
1354 case "${COMP_WORDS[COMP_CWORD-1]}" in
1356 __gitcomp
"$(__git_remotes)"
1361 __gitcomp
"$(__git_remotes)" "" "${cur##--repo=}"
1366 --all --mirror --tags --dry-run --force --verbose
1367 --receive-pack= --repo=
1372 __git_complete_remote_or_refspec
1377 local cur
="${COMP_WORDS[COMP_CWORD]}" dir
="$(__gitdir)"
1378 if [ -d "$dir"/rebase-apply
] ||
[ -d "$dir"/rebase-merge
]; then
1379 __gitcomp
"--continue --skip --abort"
1382 __git_complete_strategy
&& return
1385 __gitcomp
"$__git_whitespacelist" "" "${cur##--whitespace=}"
1390 --onto --merge --strategy --interactive
1391 --preserve-merges --stat --no-stat
1392 --committer-date-is-author-date --ignore-date
1393 --ignore-whitespace --whitespace=
1399 __gitcomp
"$(__git_refs)"
1402 __git_send_email_confirm_options
="always never auto cc compose"
1403 __git_send_email_suppresscc_options
="author self cc bodycc sob cccmd body all"
1407 local cur
="${COMP_WORDS[COMP_CWORD]}"
1411 $__git_send_email_confirm_options
1412 " "" "${cur##--confirm=}"
1417 $__git_send_email_suppresscc_options
1418 " "" "${cur##--suppress-cc=}"
1422 --smtp-encryption=*)
1423 __gitcomp
"ssl tls" "" "${cur##--smtp-encryption=}"
1427 __gitcomp
"--annotate --bcc --cc --cc-cmd --chain-reply-to
1428 --compose --confirm= --dry-run --envelope-sender
1430 --in-reply-to --no-chain-reply-to --no-signed-off-by-cc
1431 --no-suppress-from --no-thread --quiet
1432 --signed-off-by-cc --smtp-pass --smtp-server
1433 --smtp-server-port --smtp-encryption= --smtp-user
1434 --subject --suppress-cc= --suppress-from --thread --to
1435 --validate --no-validate"
1442 __git_config_get_set_variables
()
1444 local prevword word config_file
= c
=$COMP_CWORD
1445 while [ $c -gt 1 ]; do
1446 word
="${COMP_WORDS[c]}"
1448 --global|
--system|
--file=*)
1453 config_file
="$word $prevword"
1461 git
--git-dir="$(__gitdir)" config
$config_file --list 2>/dev
/null |
1474 local cur
="${COMP_WORDS[COMP_CWORD]}"
1475 local prv
="${COMP_WORDS[COMP_CWORD-1]}"
1478 __gitcomp
"$(__git_remotes)"
1482 __gitcomp
"$(__git_refs)"
1486 local remote
="${prv#remote.}"
1487 remote
="${remote%.fetch}"
1488 __gitcomp
"$(__git_refs_remotes "$remote")"
1492 local remote
="${prv#remote.}"
1493 remote
="${remote%.push}"
1494 __gitcomp
"$(git --git-dir="$
(__gitdir
)" \
1495 for-each-ref --format='%(refname):%(refname)' \
1499 pull.twohead|pull.octopus
)
1500 __git_compute_merge_strategies
1501 __gitcomp
"$__git_merge_strategies"
1504 color.branch|color.
diff|color.interactive|\
1505 color.showbranch|color.status|color.ui
)
1506 __gitcomp
"always never auto"
1510 __gitcomp
"false true"
1515 normal black red green yellow blue magenta cyan white
1516 bold dim ul blink reverse
1521 __gitcomp
"man info web html"
1525 __gitcomp
"$__git_log_date_formats"
1528 sendemail.aliasesfiletype
)
1529 __gitcomp
"mutt mailrc pine elm gnus"
1533 __gitcomp
"$__git_send_email_confirm_options"
1536 sendemail.suppresscc
)
1537 __gitcomp
"$__git_send_email_suppresscc_options"
1540 --get|
--get-all|
--unset|
--unset-all)
1541 __gitcomp
"$(__git_config_get_set_variables)"
1552 --global --system --file=
1553 --list --replace-all
1554 --get --get-all --get-regexp
1555 --add --unset --unset-all
1556 --remove-section --rename-section
1561 local pfx
="${cur%.*}."
1563 __gitcomp
"remote merge mergeoptions rebase" "$pfx" "$cur"
1567 local pfx
="${cur%.*}."
1569 __gitcomp
"$(__git_heads)" "$pfx" "$cur" "."
1573 local pfx
="${cur%.*}."
1576 argprompt cmd confirm needsfile noconsole norescan
1577 prompt revprompt revunmerged title
1582 local pfx
="${cur%.*}."
1584 __gitcomp
"cmd path" "$pfx" "$cur"
1588 local pfx
="${cur%.*}."
1590 __gitcomp
"cmd path" "$pfx" "$cur"
1594 local pfx
="${cur%.*}."
1596 __gitcomp
"cmd path trustExitCode" "$pfx" "$cur"
1600 local pfx
="${cur%.*}."
1602 __git_compute_all_commands
1603 __gitcomp
"$__git_all_commands" "$pfx" "$cur"
1607 local pfx
="${cur%.*}."
1610 url proxy fetch push mirror skipDefaultUpdate
1611 receivepack uploadpack tagopt pushurl
1616 local pfx
="${cur%.*}."
1618 __gitcomp
"$(__git_remotes)" "$pfx" "$cur" "."
1622 local pfx
="${cur%.*}."
1624 __gitcomp
"insteadOf pushInsteadOf" "$pfx" "$cur"
1631 apply.ignorewhitespace
1633 branch.autosetupmerge
1634 branch.autosetuprebase
1637 color.branch.current
1648 color.diff.whitespace
1653 color.interactive.header
1654 color.interactive.help
1655 color.interactive.prompt
1660 color.status.changed
1662 color.status.nobranch
1663 color.status.untracked
1664 color.status.updated
1671 core.deltaBaseCacheLimit
1675 core.fsyncobjectfiles
1677 core.ignoreCygwinFSTricks
1679 core.logAllRefUpdates
1680 core.loosecompression
1682 core.packedGitWindowSize
1684 core.preferSymlinkRefs
1687 core.repositoryFormatVersion
1689 core.sharedRepository
1692 core.warnAmbiguousRefs
1695 diff.autorefreshindex
1701 diff.suppressBlankEmpty
1713 format.subjectprefix
1722 gc.reflogexpireunreachable
1726 gitcvs.commitmsgannotation
1727 gitcvs.dbTableNamePrefix
1738 gui.copyblamethreshold
1742 gui.matchtrackingbranch
1743 gui.newbranchtemplate
1744 gui.pruneduringfetch
1745 gui.spellingdictionary
1761 i18n.logOutputEncoding
1766 imap.preformattedHTML
1775 interactive.singlekey
1788 mergetool.keepBackup
1791 pack.deltaCacheLimit
1804 receive.denyCurrentBranch
1806 receive.denyNonFastForwards
1809 repack.usedeltabaseoffset
1812 sendemail.aliasesfile
1813 sendemail.aliasesfiletype
1817 sendemail.chainreplyto
1819 sendemail.envelopesender
1821 sendemail.signedoffbycc
1822 sendemail.smtpencryption
1824 sendemail.smtpserver
1825 sendemail.smtpserverport
1827 sendemail.suppresscc
1828 sendemail.suppressfrom
1833 status.relativePaths
1834 status.showUntrackedFiles
1836 transfer.unpackLimit
1848 local subcommands
="add rename rm show prune update set-head"
1849 local subcommand
="$(__git_find_on_cmdline "$subcommands")"
1850 if [ -z "$subcommand" ]; then
1851 __gitcomp
"$subcommands"
1855 case "$subcommand" in
1856 rename|
rm|show|prune
)
1857 __gitcomp
"$(__git_remotes)"
1860 local i c
='' IFS
=$
'\n'
1861 for i
in $
(git
--git-dir="$(__gitdir)" config
--get-regexp "remotes\..*" 2>/dev
/null
); do
1875 __gitcomp
"$(__git_refs)"
1880 __git_has_doubledash
&& return
1882 local cur
="${COMP_WORDS[COMP_CWORD]}"
1885 __gitcomp
"--merge --mixed --hard --soft --patch"
1889 __gitcomp
"$(__git_refs)"
1894 local cur
="${COMP_WORDS[COMP_CWORD]}"
1897 __gitcomp
"--edit --mainline --no-edit --no-commit --signoff"
1901 __gitcomp
"$(__git_refs)"
1906 __git_has_doubledash
&& return
1908 local cur
="${COMP_WORDS[COMP_CWORD]}"
1911 __gitcomp
"--cached --dry-run --ignore-unmatch --quiet"
1920 __git_has_doubledash
&& return
1922 local cur
="${COMP_WORDS[COMP_CWORD]}"
1926 $__git_log_common_options
1927 $__git_log_shortlog_options
1928 --numbered --summary
1933 __git_complete_revlist
1938 __git_has_doubledash
&& return
1940 local cur
="${COMP_WORDS[COMP_CWORD]}"
1943 __gitcomp
"$__git_log_pretty_formats
1944 " "" "${cur##--pretty=}"
1948 __gitcomp
"$__git_log_pretty_formats
1949 " "" "${cur##--format=}"
1953 __gitcomp
"--pretty= --format= --abbrev-commit --oneline
1954 $__git_diff_common_options
1964 local cur
="${COMP_WORDS[COMP_CWORD]}"
1968 --all --remotes --topo-order --current --more=
1969 --list --independent --merge-base --no-name
1971 --sha1-name --sparse --topics --reflog
1976 __git_complete_revlist
1981 local cur
="${COMP_WORDS[COMP_CWORD]}"
1982 local save_opts
='--keep-index --no-keep-index --quiet --patch'
1983 local subcommands
='save list show apply clear drop pop create branch'
1984 local subcommand
="$(__git_find_on_cmdline "$subcommands")"
1985 if [ -z "$subcommand" ]; then
1988 __gitcomp
"$save_opts"
1991 if [ -z "$(__git_find_on_cmdline "$save_opts")" ]; then
1992 __gitcomp
"$subcommands"
1999 case "$subcommand,$cur" in
2001 __gitcomp
"$save_opts"
2004 __gitcomp
"--index --quiet"
2006 show
,--*|drop
,--*|branch
,--*)
2009 show
,*|apply
,*|drop
,*|pop
,*|branch
,*)
2010 __gitcomp
"$(git --git-dir="$
(__gitdir
)" stash list \
2011 | sed -n -e 's/:.*//p')"
2022 __git_has_doubledash
&& return
2024 local subcommands
="add status init update summary foreach sync"
2025 if [ -z "$(__git_find_on_cmdline "$subcommands")" ]; then
2026 local cur
="${COMP_WORDS[COMP_CWORD]}"
2029 __gitcomp
"--quiet --cached"
2032 __gitcomp
"$subcommands"
2042 init fetch clone rebase dcommit log find-rev
2043 set-tree commit-diff info create-ignore propget
2044 proplist show-ignore show-externals branch tag blame
2045 migrate mkdirs reset gc
2047 local subcommand
="$(__git_find_on_cmdline "$subcommands")"
2048 if [ -z "$subcommand" ]; then
2049 __gitcomp
"$subcommands"
2051 local remote_opts
="--username= --config-dir= --no-auth-cache"
2053 --follow-parent --authors-file= --repack=
2054 --no-metadata --use-svm-props --use-svnsync-props
2055 --log-window-size= --no-checkout --quiet
2056 --repack-flags --use-log-author --localtime
2057 --ignore-paths= $remote_opts
2060 --template= --shared= --trunk= --tags=
2061 --branches= --stdlayout --minimize-url
2062 --no-metadata --use-svm-props --use-svnsync-props
2063 --rewrite-root= --prefix= --use-log-author
2064 --add-author-from $remote_opts
2067 --edit --rmdir --find-copies-harder --copy-similarity=
2070 local cur
="${COMP_WORDS[COMP_CWORD]}"
2071 case "$subcommand,$cur" in
2073 __gitcomp
"--revision= --fetch-all $fc_opts"
2076 __gitcomp
"--revision= $fc_opts $init_opts"
2079 __gitcomp
"$init_opts"
2083 --merge --strategy= --verbose --dry-run
2084 --fetch-all --no-rebase --commit-url
2085 --revision $cmt_opts $fc_opts
2089 __gitcomp
"--stdin $cmt_opts $fc_opts"
2091 create-ignore
,--*|propget
,--*|proplist
,--*|show-ignore
,--*|\
2092 show-externals
,--*|mkdirs
,--*)
2093 __gitcomp
"--revision="
2097 --limit= --revision= --verbose --incremental
2098 --oneline --show-commit --non-recursive
2099 --authors-file= --color
2104 --merge --verbose --strategy= --local
2105 --fetch-all --dry-run $fc_opts
2109 __gitcomp
"--message= --file= --revision= $cmt_opts"
2115 __gitcomp
"--dry-run --message --tag"
2118 __gitcomp
"--dry-run --message"
2121 __gitcomp
"--git-format"
2125 --config-dir= --ignore-paths= --minimize
2126 --no-auth-cache --username=
2130 __gitcomp
"--revision= --parent"
2142 while [ $c -lt $COMP_CWORD ]; do
2143 i
="${COMP_WORDS[c]}"
2146 __gitcomp
"$(__git_tags)"
2156 case "${COMP_WORDS[COMP_CWORD-1]}" in
2162 __gitcomp
"$(__git_tags)"
2168 __gitcomp
"$(__git_refs)"
2175 local i c
=1 command __git_dir
2177 while [ $c -lt $COMP_CWORD ]; do
2178 i
="${COMP_WORDS[c]}"
2180 --git-dir=*) __git_dir
="${i#--git-dir=}" ;;
2181 --bare) __git_dir
="." ;;
2182 --version|
-p|
--paginate) ;;
2183 --help) command="help"; break ;;
2184 *) command="$i"; break ;;
2189 if [ -z "$command" ]; then
2190 case "${COMP_WORDS[COMP_CWORD]}" in
2203 *) __git_compute_porcelain_commands
2204 __gitcomp
"$__git_porcelain_commands $(__git_aliases)" ;;
2209 local expansion
=$
(__git_aliased_command
"$command")
2210 [ "$expansion" ] && command="$expansion"
2215 apply
) _git_apply
;;
2216 archive
) _git_archive
;;
2217 bisect
) _git_bisect
;;
2218 bundle
) _git_bundle
;;
2219 branch
) _git_branch
;;
2220 checkout
) _git_checkout
;;
2221 cherry
) _git_cherry
;;
2222 cherry-pick
) _git_cherry_pick
;;
2223 clean
) _git_clean
;;
2224 clone
) _git_clone
;;
2225 commit
) _git_commit
;;
2226 config
) _git_config
;;
2227 describe
) _git_describe
;;
2229 difftool
) _git_difftool
;;
2230 fetch
) _git_fetch
;;
2231 format-patch
) _git_format_patch
;;
2238 ls-files
) _git_ls_files
;;
2239 ls-remote
) _git_ls_remote
;;
2240 ls-tree
) _git_ls_tree
;;
2242 mergetool
) _git_mergetool
;;
2243 merge-base
) _git_merge_base
;;
2245 name-rev
) _git_name_rev
;;
2246 notes
) _git_notes
;;
2249 rebase
) _git_rebase
;;
2250 remote
) _git_remote
;;
2251 replace
) _git_replace
;;
2252 reset) _git_reset
;;
2253 revert
) _git_revert
;;
2255 send-email
) _git_send_email
;;
2256 shortlog
) _git_shortlog
;;
2258 show-branch
) _git_show_branch
;;
2259 stash
) _git_stash
;;
2261 submodule
) _git_submodule
;;
2264 whatchanged
) _git_log
;;
2271 __git_has_doubledash
&& return
2273 local cur
="${COMP_WORDS[COMP_CWORD]}"
2274 local g
="$(__gitdir)"
2276 if [ -f "$g/MERGE_HEAD" ]; then
2282 $__git_log_common_options
2283 $__git_log_gitk_options
2289 __git_complete_revlist
2292 complete
-o bashdefault
-o default
-o nospace
-F _git git
2>/dev
/null \
2293 || complete
-o default
-o nospace
-F _git git
2294 complete
-o bashdefault
-o default
-o nospace
-F _gitk gitk
2>/dev
/null \
2295 || complete
-o default
-o nospace
-F _gitk gitk
2297 # The following are necessary only for Cygwin, and only are needed
2298 # when the user has tab-completed the executable name and consequently
2299 # included the '.exe' suffix.
2301 if [ Cygwin
= "$(uname -o 2>/dev/null)" ]; then
2302 complete
-o bashdefault
-o default
-o nospace
-F _git git.exe
2>/dev
/null \
2303 || complete
-o default
-o nospace
-F _git git.exe