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 repo-config
) : deprecated
;;
573 rev-list
) : plumbing
;;
574 rev-parse
) : plumbing
;;
575 runstatus
) : plumbing
;;
576 sh-setup
) : internal
;;
578 show-ref
) : plumbing
;;
579 send-pack
) : plumbing
;;
580 show-index
) : plumbing
;;
582 stripspace
) : plumbing
;;
583 symbolic-ref
) : plumbing
;;
584 tar-tree
) : deprecated
;;
585 unpack-file
) : plumbing
;;
586 unpack-objects
) : plumbing
;;
587 update-index
) : plumbing
;;
588 update-ref
) : plumbing
;;
589 update-server-info
) : daemon
;;
590 upload-archive
) : plumbing
;;
591 upload-pack
) : plumbing
;;
592 write-tree
) : plumbing
;;
594 verify-pack
) : infrequent
;;
595 verify-tag
) : plumbing
;;
601 __git_porcelain_commands
=
602 __git_compute_porcelain_commands
()
604 __git_compute_all_commands
605 : ${__git_porcelain_commands:=$(__git_list_porcelain_commands)}
611 for i
in $
(git
--git-dir="$(__gitdir)" config
--get-regexp "alias\..*" 2>/dev
/null
); do
621 # __git_aliased_command requires 1 argument
622 __git_aliased_command
()
624 local word cmdline
=$
(git
--git-dir="$(__gitdir)" \
625 config
--get "alias.$1")
626 for word
in $cmdline; do
627 if [ "${word##-*}" ]; then
634 # __git_find_on_cmdline requires 1 argument
635 __git_find_on_cmdline
()
637 local word subcommand c
=1
639 while [ $c -lt $COMP_CWORD ]; do
640 word
="${COMP_WORDS[c]}"
641 for subcommand
in $1; do
642 if [ "$subcommand" = "$word" ]; then
651 __git_has_doubledash
()
654 while [ $c -lt $COMP_CWORD ]; do
655 if [ "--" = "${COMP_WORDS[c]}" ]; then
663 __git_whitespacelist
="nowarn warn error error-all fix"
667 local cur
="${COMP_WORDS[COMP_CWORD]}" dir
="$(__gitdir)"
668 if [ -d "$dir"/rebase-apply
]; then
669 __gitcomp
"--skip --resolved --abort"
674 __gitcomp
"$__git_whitespacelist" "" "${cur##--whitespace=}"
679 --3way --committer-date-is-author-date --ignore-date
680 --ignore-whitespace --ignore-space-change
681 --interactive --keep --no-utf8 --signoff --utf8
682 --whitespace= --scissors
691 local cur
="${COMP_WORDS[COMP_CWORD]}"
694 __gitcomp
"$__git_whitespacelist" "" "${cur##--whitespace=}"
699 --stat --numstat --summary --check --index
700 --cached --index-info --reverse --reject --unidiff-zero
701 --apply --no-add --exclude=
702 --ignore-whitespace --ignore-space-change
703 --whitespace= --inaccurate-eof --verbose
712 __git_has_doubledash
&& return
714 local cur
="${COMP_WORDS[COMP_CWORD]}"
718 --interactive --refresh --patch --update --dry-run
719 --ignore-errors --intent-to-add
728 local cur
="${COMP_WORDS[COMP_CWORD]}"
731 __gitcomp
"$(git archive --list)" "" "${cur##--format=}"
735 __gitcomp
"$(__git_remotes)" "" "${cur##--remote=}"
740 --format= --list --verbose
741 --prefix= --remote= --exec=
751 __git_has_doubledash
&& return
753 local subcommands
="start bad good skip reset visualize replay log run"
754 local subcommand
="$(__git_find_on_cmdline "$subcommands")"
755 if [ -z "$subcommand" ]; then
756 __gitcomp
"$subcommands"
760 case "$subcommand" in
762 __gitcomp
"$(__git_refs)"
772 local i c
=1 only_local_ref
="n" has_r
="n"
774 while [ $c -lt $COMP_CWORD ]; do
777 -d|
-m) only_local_ref
="y" ;;
783 case "${COMP_WORDS[COMP_CWORD]}" in
786 --color --no-color --verbose --abbrev= --no-abbrev
787 --track --no-track --contains --merged --no-merged
791 if [ $only_local_ref = "y" -a $has_r = "n" ]; then
792 __gitcomp
"$(__git_heads)"
794 __gitcomp
"$(__git_refs)"
802 local cmd
="${COMP_WORDS[2]}"
803 case "$COMP_CWORD" in
805 __gitcomp
"create list-heads verify unbundle"
813 __git_complete_revlist
822 __git_has_doubledash
&& return
824 local cur
="${COMP_WORDS[COMP_CWORD]}"
827 __gitcomp
"diff3 merge" "" "${cur##--conflict=}"
831 --quiet --ours --theirs --track --no-track --merge
836 __gitcomp
"$(__git_refs)"
843 __gitcomp
"$(__git_refs)"
848 local cur
="${COMP_WORDS[COMP_CWORD]}"
851 __gitcomp
"--edit --no-commit"
854 __gitcomp
"$(__git_refs)"
861 __git_has_doubledash
&& return
863 local cur
="${COMP_WORDS[COMP_CWORD]}"
866 __gitcomp
"--dry-run --quiet"
875 local cur
="${COMP_WORDS[COMP_CWORD]}"
900 __git_has_doubledash
&& return
902 local cur
="${COMP_WORDS[COMP_CWORD]}"
905 __gitcomp
"default strip verbatim whitespace
906 " "" "${cur##--cleanup=}"
910 __gitcomp
"$(__git_refs)" "" "${cur##--reuse-message=}"
914 __gitcomp
"$(__git_refs)" "" "${cur##--reedit-message=}"
918 __gitcomp
"all no normal" "" "${cur##--untracked-files=}"
923 --all --author= --signoff --verify --no-verify
924 --edit --amend --include --only --interactive
925 --dry-run --reuse-message= --reedit-message=
926 --reset-author --file= --message= --template=
927 --cleanup= --untracked-files --untracked-files=
937 local cur
="${COMP_WORDS[COMP_CWORD]}"
941 --all --tags --contains --abbrev= --candidates=
942 --exact-match --debug --long --match --always
946 __gitcomp
"$(__git_refs)"
949 __git_diff_common_options
="--stat --numstat --shortstat --summary
950 --patch-with-stat --name-only --name-status --color
951 --no-color --color-words --no-renames --check
952 --full-index --binary --abbrev --diff-filter=
954 --text --ignore-space-at-eol --ignore-space-change
955 --ignore-all-space --exit-code --quiet --ext-diff
957 --no-prefix --src-prefix= --dst-prefix=
958 --inter-hunk-context=
961 --dirstat --dirstat= --dirstat-by-file
962 --dirstat-by-file= --cumulative
967 __git_has_doubledash
&& return
969 local cur
="${COMP_WORDS[COMP_CWORD]}"
972 __gitcomp
"--cached --staged --pickaxe-all --pickaxe-regex
973 --base --ours --theirs
974 $__git_diff_common_options
982 __git_mergetools_common
="diffuse ecmerge emerge kdiff3 meld opendiff
983 tkdiff vimdiff gvimdiff xxdiff araxis p4merge
988 __git_has_doubledash
&& return
990 local cur
="${COMP_WORDS[COMP_CWORD]}"
993 __gitcomp
"$__git_mergetools_common kompare" "" "${cur##--tool=}"
997 __gitcomp
"--cached --staged --pickaxe-all --pickaxe-regex
998 --base --ours --theirs
999 --no-renames --diff-filter= --find-copies-harder
1000 --relative --ignore-submodules
1008 __git_fetch_options
="
1009 --quiet --verbose --append --upload-pack --force --keep --depth=
1010 --tags --no-tags --all --prune --dry-run
1015 local cur
="${COMP_WORDS[COMP_CWORD]}"
1018 __gitcomp
"$__git_fetch_options"
1022 __git_complete_remote_or_refspec
1025 _git_format_patch
()
1027 local cur
="${COMP_WORDS[COMP_CWORD]}"
1032 " "" "${cur##--thread=}"
1037 --stdout --attach --no-attach --thread --thread=
1039 --numbered --start-number
1043 --in-reply-to= --cc=
1044 --full-index --binary
1047 --no-prefix --src-prefix= --dst-prefix=
1048 --inline --suffix= --ignore-if-in-upstream
1054 __git_complete_revlist
1059 local cur
="${COMP_WORDS[COMP_CWORD]}"
1063 --tags --root --unreachable --cache --no-reflogs --full
1064 --strict --verbose --lost-found
1074 local cur
="${COMP_WORDS[COMP_CWORD]}"
1077 __gitcomp
"--prune --aggressive"
1086 __git_has_doubledash
&& return
1088 local cur
="${COMP_WORDS[COMP_CWORD]}"
1093 --text --ignore-case --word-regexp --invert-match
1095 --extended-regexp --basic-regexp --fixed-strings
1096 --files-with-matches --name-only
1097 --files-without-match
1100 --and --or --not --all-match
1106 __gitcomp
"$(__git_refs)"
1111 local cur
="${COMP_WORDS[COMP_CWORD]}"
1114 __gitcomp
"--all --info --man --web"
1118 __git_compute_all_commands
1119 __gitcomp
"$__git_all_commands
1120 attributes cli core-tutorial cvs-migration
1121 diffcore gitk glossary hooks ignore modules
1122 repository-layout tutorial tutorial-2
1129 local cur
="${COMP_WORDS[COMP_CWORD]}"
1133 false true umask group all world everybody
1134 " "" "${cur##--shared=}"
1138 __gitcomp
"--quiet --bare --template= --shared --shared="
1147 __git_has_doubledash
&& return
1149 local cur
="${COMP_WORDS[COMP_CWORD]}"
1152 __gitcomp
"--cached --deleted --modified --others --ignored
1153 --stage --directory --no-empty-directory --unmerged
1154 --killed --exclude= --exclude-from=
1155 --exclude-per-directory= --exclude-standard
1156 --error-unmatch --with-tree= --full-name
1157 --abbrev --ignored --exclude-per-directory
1167 __gitcomp
"$(__git_remotes)"
1175 # Options that go well for log, shortlog and gitk
1176 __git_log_common_options
="
1178 --branches --tags --remotes
1179 --first-parent --merges --no-merges
1181 --max-age= --since= --after=
1182 --min-age= --until= --before=
1184 # Options that go well for log and gitk (not shortlog)
1185 __git_log_gitk_options
="
1186 --dense --sparse --full-history
1187 --simplify-merges --simplify-by-decoration
1190 # Options that go well for log and shortlog (not gitk)
1191 __git_log_shortlog_options
="
1192 --author= --committer= --grep=
1196 __git_log_pretty_formats
="oneline short medium full fuller email raw format:"
1197 __git_log_date_formats
="relative iso8601 rfc2822 short local default raw"
1201 __git_has_doubledash
&& return
1203 local cur
="${COMP_WORDS[COMP_CWORD]}"
1204 local g
="$(git rev-parse --git-dir 2>/dev/null)"
1206 if [ -f "$g/MERGE_HEAD" ]; then
1211 __gitcomp
"$__git_log_pretty_formats
1212 " "" "${cur##--pretty=}"
1216 __gitcomp
"$__git_log_pretty_formats
1217 " "" "${cur##--format=}"
1221 __gitcomp
"$__git_log_date_formats" "" "${cur##--date=}"
1225 __gitcomp
"long short" "" "${cur##--decorate=}"
1230 $__git_log_common_options
1231 $__git_log_shortlog_options
1232 $__git_log_gitk_options
1233 --root --topo-order --date-order --reverse
1234 --follow --full-diff
1235 --abbrev-commit --abbrev=
1236 --relative-date --date=
1237 --pretty= --format= --oneline
1240 --decorate --decorate=
1242 --parents --children
1244 $__git_diff_common_options
1245 --pickaxe-all --pickaxe-regex
1250 __git_complete_revlist
1253 __git_merge_options
="
1254 --no-commit --no-stat --log --no-log --squash --strategy
1255 --commit --stat --no-squash --ff --no-ff --ff-only
1260 __git_complete_strategy
&& return
1262 local cur
="${COMP_WORDS[COMP_CWORD]}"
1265 __gitcomp
"$__git_merge_options"
1268 __gitcomp
"$(__git_refs)"
1273 local cur
="${COMP_WORDS[COMP_CWORD]}"
1276 __gitcomp
"$__git_mergetools_common tortoisemerge" "" "${cur##--tool=}"
1289 __gitcomp
"$(__git_refs)"
1294 local cur
="${COMP_WORDS[COMP_CWORD]}"
1297 __gitcomp
"--dry-run"
1306 __gitcomp
"--tags --all --stdin"
1311 local subcommands
="edit show"
1312 if [ -z "$(__git_find_on_cmdline "$subcommands")" ]; then
1313 __gitcomp
"$subcommands"
1317 case "${COMP_WORDS[COMP_CWORD-1]}" in
1322 __gitcomp
"$(__git_refs)"
1329 __git_complete_strategy
&& return
1331 local cur
="${COMP_WORDS[COMP_CWORD]}"
1335 --rebase --no-rebase
1336 $__git_merge_options
1337 $__git_fetch_options
1342 __git_complete_remote_or_refspec
1347 local cur
="${COMP_WORDS[COMP_CWORD]}"
1348 case "${COMP_WORDS[COMP_CWORD-1]}" in
1350 __gitcomp
"$(__git_remotes)"
1355 __gitcomp
"$(__git_remotes)" "" "${cur##--repo=}"
1360 --all --mirror --tags --dry-run --force --verbose
1361 --receive-pack= --repo=
1366 __git_complete_remote_or_refspec
1371 local cur
="${COMP_WORDS[COMP_CWORD]}" dir
="$(__gitdir)"
1372 if [ -d "$dir"/rebase-apply
] ||
[ -d "$dir"/rebase-merge
]; then
1373 __gitcomp
"--continue --skip --abort"
1376 __git_complete_strategy
&& return
1379 __gitcomp
"$__git_whitespacelist" "" "${cur##--whitespace=}"
1384 --onto --merge --strategy --interactive
1385 --preserve-merges --stat --no-stat
1386 --committer-date-is-author-date --ignore-date
1387 --ignore-whitespace --whitespace=
1392 __gitcomp
"$(__git_refs)"
1395 __git_send_email_confirm_options
="always never auto cc compose"
1396 __git_send_email_suppresscc_options
="author self cc bodycc sob cccmd body all"
1400 local cur
="${COMP_WORDS[COMP_CWORD]}"
1404 $__git_send_email_confirm_options
1405 " "" "${cur##--confirm=}"
1410 $__git_send_email_suppresscc_options
1411 " "" "${cur##--suppress-cc=}"
1415 --smtp-encryption=*)
1416 __gitcomp
"ssl tls" "" "${cur##--smtp-encryption=}"
1420 __gitcomp
"--annotate --bcc --cc --cc-cmd --chain-reply-to
1421 --compose --confirm= --dry-run --envelope-sender
1423 --in-reply-to --no-chain-reply-to --no-signed-off-by-cc
1424 --no-suppress-from --no-thread --quiet
1425 --signed-off-by-cc --smtp-pass --smtp-server
1426 --smtp-server-port --smtp-encryption= --smtp-user
1427 --subject --suppress-cc= --suppress-from --thread --to
1428 --validate --no-validate"
1435 __git_config_get_set_variables
()
1437 local prevword word config_file
= c
=$COMP_CWORD
1438 while [ $c -gt 1 ]; do
1439 word
="${COMP_WORDS[c]}"
1441 --global|
--system|
--file=*)
1446 config_file
="$word $prevword"
1454 git
--git-dir="$(__gitdir)" config
$config_file --list 2>/dev
/null |
1467 local cur
="${COMP_WORDS[COMP_CWORD]}"
1468 local prv
="${COMP_WORDS[COMP_CWORD-1]}"
1471 __gitcomp
"$(__git_remotes)"
1475 __gitcomp
"$(__git_refs)"
1479 local remote
="${prv#remote.}"
1480 remote
="${remote%.fetch}"
1481 __gitcomp
"$(__git_refs_remotes "$remote")"
1485 local remote
="${prv#remote.}"
1486 remote
="${remote%.push}"
1487 __gitcomp
"$(git --git-dir="$
(__gitdir
)" \
1488 for-each-ref --format='%(refname):%(refname)' \
1492 pull.twohead|pull.octopus
)
1493 __git_compute_merge_strategies
1494 __gitcomp
"$__git_merge_strategies"
1497 color.branch|color.
diff|color.interactive|\
1498 color.showbranch|color.status|color.ui
)
1499 __gitcomp
"always never auto"
1503 __gitcomp
"false true"
1508 normal black red green yellow blue magenta cyan white
1509 bold dim ul blink reverse
1514 __gitcomp
"man info web html"
1518 __gitcomp
"$__git_log_date_formats"
1521 sendemail.aliasesfiletype
)
1522 __gitcomp
"mutt mailrc pine elm gnus"
1526 __gitcomp
"$__git_send_email_confirm_options"
1529 sendemail.suppresscc
)
1530 __gitcomp
"$__git_send_email_suppresscc_options"
1533 --get|
--get-all|
--unset|
--unset-all)
1534 __gitcomp
"$(__git_config_get_set_variables)"
1545 --global --system --file=
1546 --list --replace-all
1547 --get --get-all --get-regexp
1548 --add --unset --unset-all
1549 --remove-section --rename-section
1554 local pfx
="${cur%.*}."
1556 __gitcomp
"remote merge mergeoptions rebase" "$pfx" "$cur"
1560 local pfx
="${cur%.*}."
1562 __gitcomp
"$(__git_heads)" "$pfx" "$cur" "."
1566 local pfx
="${cur%.*}."
1569 argprompt cmd confirm needsfile noconsole norescan
1570 prompt revprompt revunmerged title
1575 local pfx
="${cur%.*}."
1577 __gitcomp
"cmd path" "$pfx" "$cur"
1581 local pfx
="${cur%.*}."
1583 __gitcomp
"cmd path" "$pfx" "$cur"
1587 local pfx
="${cur%.*}."
1589 __gitcomp
"cmd path trustExitCode" "$pfx" "$cur"
1593 local pfx
="${cur%.*}."
1595 __git_compute_all_commands
1596 __gitcomp
"$__git_all_commands" "$pfx" "$cur"
1600 local pfx
="${cur%.*}."
1603 url proxy fetch push mirror skipDefaultUpdate
1604 receivepack uploadpack tagopt pushurl
1609 local pfx
="${cur%.*}."
1611 __gitcomp
"$(__git_remotes)" "$pfx" "$cur" "."
1615 local pfx
="${cur%.*}."
1617 __gitcomp
"insteadOf pushInsteadOf" "$pfx" "$cur"
1624 apply.ignorewhitespace
1626 branch.autosetupmerge
1627 branch.autosetuprebase
1630 color.branch.current
1641 color.diff.whitespace
1646 color.interactive.header
1647 color.interactive.help
1648 color.interactive.prompt
1653 color.status.changed
1655 color.status.nobranch
1656 color.status.untracked
1657 color.status.updated
1664 core.deltaBaseCacheLimit
1668 core.fsyncobjectfiles
1670 core.ignoreCygwinFSTricks
1672 core.logAllRefUpdates
1673 core.loosecompression
1675 core.packedGitWindowSize
1677 core.preferSymlinkRefs
1680 core.repositoryFormatVersion
1682 core.sharedRepository
1685 core.warnAmbiguousRefs
1688 diff.autorefreshindex
1694 diff.suppressBlankEmpty
1706 format.subjectprefix
1715 gc.reflogexpireunreachable
1719 gitcvs.commitmsgannotation
1720 gitcvs.dbTableNamePrefix
1731 gui.copyblamethreshold
1735 gui.matchtrackingbranch
1736 gui.newbranchtemplate
1737 gui.pruneduringfetch
1738 gui.spellingdictionary
1754 i18n.logOutputEncoding
1759 imap.preformattedHTML
1768 interactive.singlekey
1781 mergetool.keepBackup
1784 pack.deltaCacheLimit
1797 receive.denyCurrentBranch
1799 receive.denyNonFastForwards
1802 repack.usedeltabaseoffset
1805 sendemail.aliasesfile
1806 sendemail.aliasesfiletype
1810 sendemail.chainreplyto
1812 sendemail.envelopesender
1814 sendemail.signedoffbycc
1815 sendemail.smtpencryption
1817 sendemail.smtpserver
1818 sendemail.smtpserverport
1820 sendemail.suppresscc
1821 sendemail.suppressfrom
1826 status.relativePaths
1827 status.showUntrackedFiles
1829 transfer.unpackLimit
1841 local subcommands
="add rename rm show prune update set-head"
1842 local subcommand
="$(__git_find_on_cmdline "$subcommands")"
1843 if [ -z "$subcommand" ]; then
1844 __gitcomp
"$subcommands"
1848 case "$subcommand" in
1849 rename|
rm|show|prune
)
1850 __gitcomp
"$(__git_remotes)"
1853 local i c
='' IFS
=$
'\n'
1854 for i
in $
(git
--git-dir="$(__gitdir)" config
--get-regexp "remotes\..*" 2>/dev
/null
); do
1868 __gitcomp
"$(__git_refs)"
1873 __git_has_doubledash
&& return
1875 local cur
="${COMP_WORDS[COMP_CWORD]}"
1878 __gitcomp
"--merge --mixed --hard --soft --patch"
1882 __gitcomp
"$(__git_refs)"
1887 local cur
="${COMP_WORDS[COMP_CWORD]}"
1890 __gitcomp
"--edit --mainline --no-edit --no-commit --signoff"
1894 __gitcomp
"$(__git_refs)"
1899 __git_has_doubledash
&& return
1901 local cur
="${COMP_WORDS[COMP_CWORD]}"
1904 __gitcomp
"--cached --dry-run --ignore-unmatch --quiet"
1913 __git_has_doubledash
&& return
1915 local cur
="${COMP_WORDS[COMP_CWORD]}"
1919 $__git_log_common_options
1920 $__git_log_shortlog_options
1921 --numbered --summary
1926 __git_complete_revlist
1931 __git_has_doubledash
&& return
1933 local cur
="${COMP_WORDS[COMP_CWORD]}"
1936 __gitcomp
"$__git_log_pretty_formats
1937 " "" "${cur##--pretty=}"
1941 __gitcomp
"$__git_log_pretty_formats
1942 " "" "${cur##--format=}"
1946 __gitcomp
"--pretty= --format= --abbrev-commit --oneline
1947 $__git_diff_common_options
1957 local cur
="${COMP_WORDS[COMP_CWORD]}"
1961 --all --remotes --topo-order --current --more=
1962 --list --independent --merge-base --no-name
1964 --sha1-name --sparse --topics --reflog
1969 __git_complete_revlist
1974 local cur
="${COMP_WORDS[COMP_CWORD]}"
1975 local save_opts
='--keep-index --no-keep-index --quiet --patch'
1976 local subcommands
='save list show apply clear drop pop create branch'
1977 local subcommand
="$(__git_find_on_cmdline "$subcommands")"
1978 if [ -z "$subcommand" ]; then
1981 __gitcomp
"$save_opts"
1984 if [ -z "$(__git_find_on_cmdline "$save_opts")" ]; then
1985 __gitcomp
"$subcommands"
1992 case "$subcommand,$cur" in
1994 __gitcomp
"$save_opts"
1997 __gitcomp
"--index --quiet"
1999 show
,--*|drop
,--*|branch
,--*)
2002 show
,*|apply
,*|drop
,*|pop
,*|branch
,*)
2003 __gitcomp
"$(git --git-dir="$
(__gitdir
)" stash list \
2004 | sed -n -e 's/:.*//p')"
2015 __git_has_doubledash
&& return
2017 local subcommands
="add status init update summary foreach sync"
2018 if [ -z "$(__git_find_on_cmdline "$subcommands")" ]; then
2019 local cur
="${COMP_WORDS[COMP_CWORD]}"
2022 __gitcomp
"--quiet --cached"
2025 __gitcomp
"$subcommands"
2035 init fetch clone rebase dcommit log find-rev
2036 set-tree commit-diff info create-ignore propget
2037 proplist show-ignore show-externals branch tag blame
2038 migrate mkdirs reset gc
2040 local subcommand
="$(__git_find_on_cmdline "$subcommands")"
2041 if [ -z "$subcommand" ]; then
2042 __gitcomp
"$subcommands"
2044 local remote_opts
="--username= --config-dir= --no-auth-cache"
2046 --follow-parent --authors-file= --repack=
2047 --no-metadata --use-svm-props --use-svnsync-props
2048 --log-window-size= --no-checkout --quiet
2049 --repack-flags --use-log-author --localtime
2050 --ignore-paths= $remote_opts
2053 --template= --shared= --trunk= --tags=
2054 --branches= --stdlayout --minimize-url
2055 --no-metadata --use-svm-props --use-svnsync-props
2056 --rewrite-root= --prefix= --use-log-author
2057 --add-author-from $remote_opts
2060 --edit --rmdir --find-copies-harder --copy-similarity=
2063 local cur
="${COMP_WORDS[COMP_CWORD]}"
2064 case "$subcommand,$cur" in
2066 __gitcomp
"--revision= --fetch-all $fc_opts"
2069 __gitcomp
"--revision= $fc_opts $init_opts"
2072 __gitcomp
"$init_opts"
2076 --merge --strategy= --verbose --dry-run
2077 --fetch-all --no-rebase --commit-url
2078 --revision $cmt_opts $fc_opts
2082 __gitcomp
"--stdin $cmt_opts $fc_opts"
2084 create-ignore
,--*|propget
,--*|proplist
,--*|show-ignore
,--*|\
2085 show-externals
,--*|mkdirs
,--*)
2086 __gitcomp
"--revision="
2090 --limit= --revision= --verbose --incremental
2091 --oneline --show-commit --non-recursive
2092 --authors-file= --color
2097 --merge --verbose --strategy= --local
2098 --fetch-all --dry-run $fc_opts
2102 __gitcomp
"--message= --file= --revision= $cmt_opts"
2108 __gitcomp
"--dry-run --message --tag"
2111 __gitcomp
"--dry-run --message"
2114 __gitcomp
"--git-format"
2118 --config-dir= --ignore-paths= --minimize
2119 --no-auth-cache --username=
2123 __gitcomp
"--revision= --parent"
2135 while [ $c -lt $COMP_CWORD ]; do
2136 i
="${COMP_WORDS[c]}"
2139 __gitcomp
"$(__git_tags)"
2149 case "${COMP_WORDS[COMP_CWORD-1]}" in
2155 __gitcomp
"$(__git_tags)"
2161 __gitcomp
"$(__git_refs)"
2168 local i c
=1 command __git_dir
2170 while [ $c -lt $COMP_CWORD ]; do
2171 i
="${COMP_WORDS[c]}"
2173 --git-dir=*) __git_dir
="${i#--git-dir=}" ;;
2174 --bare) __git_dir
="." ;;
2175 --version|
-p|
--paginate) ;;
2176 --help) command="help"; break ;;
2177 *) command="$i"; break ;;
2182 if [ -z "$command" ]; then
2183 case "${COMP_WORDS[COMP_CWORD]}" in
2196 *) __git_compute_porcelain_commands
2197 __gitcomp
"$__git_porcelain_commands $(__git_aliases)" ;;
2202 local expansion
=$
(__git_aliased_command
"$command")
2203 [ "$expansion" ] && command="$expansion"
2208 apply
) _git_apply
;;
2209 archive
) _git_archive
;;
2210 bisect
) _git_bisect
;;
2211 bundle
) _git_bundle
;;
2212 branch
) _git_branch
;;
2213 checkout
) _git_checkout
;;
2214 cherry
) _git_cherry
;;
2215 cherry-pick
) _git_cherry_pick
;;
2216 clean
) _git_clean
;;
2217 clone
) _git_clone
;;
2218 commit
) _git_commit
;;
2219 config
) _git_config
;;
2220 describe
) _git_describe
;;
2222 difftool
) _git_difftool
;;
2223 fetch
) _git_fetch
;;
2224 format-patch
) _git_format_patch
;;
2231 ls-files
) _git_ls_files
;;
2232 ls-remote
) _git_ls_remote
;;
2233 ls-tree
) _git_ls_tree
;;
2235 mergetool
) _git_mergetool
;;
2236 merge-base
) _git_merge_base
;;
2238 name-rev
) _git_name_rev
;;
2239 notes
) _git_notes
;;
2242 rebase
) _git_rebase
;;
2243 remote
) _git_remote
;;
2244 replace
) _git_replace
;;
2245 reset) _git_reset
;;
2246 revert
) _git_revert
;;
2248 send-email
) _git_send_email
;;
2249 shortlog
) _git_shortlog
;;
2251 show-branch
) _git_show_branch
;;
2252 stash
) _git_stash
;;
2254 submodule
) _git_submodule
;;
2257 whatchanged
) _git_log
;;
2264 __git_has_doubledash
&& return
2266 local cur
="${COMP_WORDS[COMP_CWORD]}"
2267 local g
="$(__gitdir)"
2269 if [ -f "$g/MERGE_HEAD" ]; then
2275 $__git_log_common_options
2276 $__git_log_gitk_options
2282 __git_complete_revlist
2285 complete
-o bashdefault
-o default
-o nospace
-F _git git
2>/dev
/null \
2286 || complete
-o default
-o nospace
-F _git git
2287 complete
-o bashdefault
-o default
-o nospace
-F _gitk gitk
2>/dev
/null \
2288 || complete
-o default
-o nospace
-F _gitk gitk
2290 # The following are necessary only for Cygwin, and only are needed
2291 # when the user has tab-completed the executable name and consequently
2292 # included the '.exe' suffix.
2294 if [ Cygwin
= "$(uname -o 2>/dev/null)" ]; then
2295 complete
-o bashdefault
-o default
-o nospace
-F _git git.exe
2>/dev
/null \
2296 || complete
-o default
-o nospace
-F _git git.exe