1 # bash completion support for core Git.
3 # Copyright (C) 2006,2007 Shawn O. Pearce <spearce@spearce.org>
4 # Conceptually based on gitcompletion (http://gitweb.hawaga.org.uk/).
5 # Distributed under the GNU General Public License, version 2.0.
7 # The contained completion routines provide support for completing:
9 # *) local and remote branch names
10 # *) local and remote tag names
11 # *) .git/remotes file names
12 # *) git 'subcommands'
13 # *) tree paths within 'ref:path/to/file' expressions
14 # *) common --long-options
16 # To use these routines:
18 # 1) Copy this file to somewhere (e.g. ~/.git-completion.sh).
19 # 2) Added the following line to your .bashrc:
20 # source ~/.git-completion.sh
22 # 3) Consider changing your PS1 to also show the current branch:
23 # PS1='[\u@\h \W$(__git_ps1 " (%s)")]\$ '
25 # The argument to __git_ps1 will be displayed only if you
26 # are currently in a git repository. The %s token will be
27 # the name of the current branch.
29 # In addition, if you set GIT_PS1_SHOWDIRTYSTATE to a nonempty
30 # value, unstaged (*) and staged (+) changes will be shown next
31 # to the branch name. You can configure this per-repository
32 # with the bash.showDirtyState variable, which defaults to true
33 # once GIT_PS1_SHOWDIRTYSTATE is enabled.
35 # You can also see if currently something is stashed, by setting
36 # GIT_PS1_SHOWSTASHSTATE to a nonempty value. If something is stashed,
37 # then a '$' will be shown next to the branch name.
39 # If you would like to see if there're untracked files, then you can
40 # set GIT_PS1_SHOWUNTRACKEDFILES to a nonempty value. If there're
41 # untracked files, then a '%' will be shown next to the branch name.
45 # *) Read Documentation/SubmittingPatches
46 # *) Send all patches to the current maintainer:
48 # "Shawn O. Pearce" <spearce@spearce.org>
50 # *) Always CC the Git mailing list:
55 case "$COMP_WORDBREAKS" in
57 *) COMP_WORDBREAKS="$COMP_WORDBREAKS:"
60 # __gitdir accepts 0 or 1 arguments (i.e., location)
61 # returns location of .git repo
64 if [ -z "${1-}" ]; then
65 if [ -n "${__git_dir-}" ]; then
67 elif [ -d .git ]; then
70 git rev-parse --git-dir 2>/dev/null
72 elif [ -d "$1/.git" ]; then
79 # __git_ps1 accepts 0 or 1 arguments (i.e., format string)
80 # returns text to add to bash PS1 prompt (includes branch name)
87 if [ -f "$g/rebase-merge/interactive" ]; then
89 b="$(cat "$g/rebase-merge/head-name")"
90 elif [ -d "$g/rebase-merge" ]; then
92 b="$(cat "$g/rebase-merge/head-name")"
94 if [ -d "$g/rebase-apply" ]; then
95 if [ -f "$g/rebase-apply/rebasing" ]; then
97 elif [ -f "$g/rebase-apply/applying" ]; then
102 elif [ -f "$g/MERGE_HEAD" ]; then
104 elif [ -f "$g/BISECT_LOG" ]; then
108 b="$(git symbolic-ref HEAD 2>/dev/null)" || {
111 case "${GIT_PS1_DESCRIBE_STYLE-}" in
113 git describe --contains HEAD ;;
115 git describe --contains --all HEAD ;;
119 git describe --exact-match HEAD ;;
120 esac 2>/dev/null)" ||
122 b="$(cut -c1-7 "$g/HEAD" 2>/dev/null)..." ||
134 if [ "true" = "$(git rev-parse --is-inside-git-dir 2>/dev/null)" ]; then
135 if [ "true" = "$(git rev-parse --is-bare-repository 2>/dev/null)" ]; then
140 elif [ "true" = "$(git rev-parse --is-inside-work-tree 2>/dev/null)" ]; then
141 if [ -n "${GIT_PS1_SHOWDIRTYSTATE-}" ]; then
142 if [ "$(git config --bool bash.showDirtyState)" != "false" ]; then
143 git diff --no-ext-diff --quiet --exit-code || w="*"
144 if git rev-parse --quiet --verify HEAD >/dev/null; then
145 git diff-index --cached --quiet HEAD -- || i="+"
151 if [ -n "${GIT_PS1_SHOWSTASHSTATE-}" ]; then
152 git rev-parse --verify refs/stash >/dev/null 2>&1 && s="$"
155 if [ -n "${GIT_PS1_SHOWUNTRACKEDFILES-}" ]; then
156 if [ -n "$(git ls-files --others --exclude-standard)" ]; then
163 printf "${1:- (%s)}" "$c${b##refs/heads/}${f:+$f}$r"
167 # __gitcomp_1 requires 2 arguments
170 local c IFS=' '$'\t'$'\n'
173 --*=*) printf %s$'\n' "$c$2" ;;
174 *.) printf %s$'\n' "$c$2" ;;
175 *) printf %s$'\n' "$c$2 " ;;
180 # __gitcomp accepts 1, 2, 3, or 4 arguments
181 # generates completion reply with compgen
184 local cur="${COMP_WORDS[COMP_CWORD]}"
185 if [ $# -gt 2 ]; then
194 COMPREPLY=($(compgen -P "${2-}" \
195 -W "$(__gitcomp_1 "${1-}" "${4-}")" \
201 # __git_heads accepts 0 or 1 arguments (to pass to __gitdir)
204 local cmd i is_hash=y dir="$(__gitdir "${1-}")"
205 if [ -d "$dir" ]; then
206 git --git-dir="$dir" for-each-ref --format='%(refname:short)' \
210 for i in $(git ls-remote "${1-}" 2>/dev/null); do
211 case "$is_hash,$i" in
214 n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;
215 n,*) is_hash=y; echo "$i" ;;
220 # __git_tags accepts 0 or 1 arguments (to pass to __gitdir)
223 local cmd i is_hash=y dir="$(__gitdir "${1-}")"
224 if [ -d "$dir" ]; then
225 git --git-dir="$dir" for-each-ref --format='%(refname:short)' \
229 for i in $(git ls-remote "${1-}" 2>/dev/null); do
230 case "$is_hash,$i" in
233 n,refs/tags/*) is_hash=y; echo "${i#refs/tags/}" ;;
234 n,*) is_hash=y; echo "$i" ;;
239 # __git_refs accepts 0 or 1 arguments (to pass to __gitdir)
242 local i is_hash=y dir="$(__gitdir "${1-}")"
243 local cur="${COMP_WORDS[COMP_CWORD]}" format refs
244 if [ -d "$dir" ]; then
251 if [ -e "$dir/HEAD" ]; then echo HEAD; fi
252 format="refname:short"
253 refs="refs/tags refs/heads refs/remotes"
256 git --git-dir="$dir" for-each-ref --format="%($format)" \
260 for i in $(git ls-remote "$dir" 2>/dev/null); do
261 case "$is_hash,$i" in
264 n,refs/tags/*) is_hash=y; echo "${i#refs/tags/}" ;;
265 n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;
266 n,refs/remotes/*) is_hash=y; echo "${i#refs/remotes/}" ;;
267 n,*) is_hash=y; echo "$i" ;;
272 # __git_refs2 requires 1 argument (to pass to __git_refs)
276 for i in $(__git_refs "$1"); do
281 # __git_refs_remotes requires 1 argument (to pass to ls-remote)
282 __git_refs_remotes ()
284 local cmd i is_hash=y
285 for i in $(git ls-remote "$1" 2>/dev/null); do
286 case "$is_hash,$i" in
289 echo "$i:refs/remotes/$1/${i#refs/heads/}"
293 n,refs/tags/*) is_hash=y;;
301 local i ngoff IFS=$'\n' d="$(__gitdir)"
302 shopt -q nullglob || ngoff=1
304 for i in "$d/remotes"/*; do
305 echo ${i#$d/remotes/}
307 [ "$ngoff" ] && shopt -u nullglob
308 for i in $(git --git-dir="$d" config --get-regexp 'remote\..*\.url' 2>/dev/null); do
314 __git_list_merge_strategies ()
316 git merge -s help 2>&1 |
317 sed -n -e '/[Aa]vailable strategies are: /,/^$/{
326 __git_merge_strategies=
327 # 'git merge -s help' (and thus detection of the merge strategy
328 # list) fails, unfortunately, if run outside of any git working
329 # tree. __git_merge_strategies is set to the empty string in
330 # that case, and the detection will be repeated the next time it
332 __git_compute_merge_strategies ()
334 : ${__git_merge_strategies:=$(__git_list_merge_strategies)}
337 __git_complete_file ()
339 local pfx ls ref cur="${COMP_WORDS[COMP_CWORD]}"
356 case "$COMP_WORDBREAKS" in
358 *) pfx="$ref:$pfx" ;;
362 COMPREPLY=($(compgen -P "$pfx" \
363 -W "$(git --git-dir="$(__gitdir)" ls-tree "$ls" \
364 | sed '/^100... blob /{
380 __gitcomp "$(__git_refs)"
385 __git_complete_revlist ()
387 local pfx cur="${COMP_WORDS[COMP_CWORD]}"
392 __gitcomp "$(__git_refs)" "$pfx" "$cur"
397 __gitcomp "$(__git_refs)" "$pfx" "$cur"
400 __gitcomp "$(__git_refs)"
405 __git_complete_remote_or_refspec ()
407 local cmd="${COMP_WORDS[1]}"
408 local cur="${COMP_WORDS[COMP_CWORD]}"
409 local i c=2 remote="" pfx="" lhs=1 no_complete_refspec=0
410 while [ $c -lt $COMP_CWORD ]; do
413 --mirror) [ "$cmd" = "push" ] && no_complete_refspec=1 ;;
416 push) no_complete_refspec=1 ;;
425 *) remote="$i"; break ;;
429 if [ -z "$remote" ]; then
430 __gitcomp "$(__git_remotes)"
433 if [ $no_complete_refspec = 1 ]; then
437 [ "$remote" = "." ] && remote=
440 case "$COMP_WORDBREAKS" in
442 *) pfx="${cur%%:*}:" ;;
454 if [ $lhs = 1 ]; then
455 __gitcomp "$(__git_refs2 "$remote")" "$pfx" "$cur"
457 __gitcomp "$(__git_refs)" "$pfx" "$cur"
461 if [ $lhs = 1 ]; then
462 __gitcomp "$(__git_refs "$remote")" "$pfx" "$cur"
464 __gitcomp "$(__git_refs)" "$pfx" "$cur"
468 if [ $lhs = 1 ]; then
469 __gitcomp "$(__git_refs)" "$pfx" "$cur"
471 __gitcomp "$(__git_refs "$remote")" "$pfx" "$cur"
477 __git_complete_strategy ()
479 __git_compute_merge_strategies
480 case "${COMP_WORDS[COMP_CWORD-1]}" in
482 __gitcomp "$__git_merge_strategies"
485 local cur="${COMP_WORDS[COMP_CWORD]}"
488 __gitcomp "$__git_merge_strategies" "" "${cur##--strategy=}"
495 __git_list_all_commands ()
498 for i in $(git help -a|egrep '^ [a-zA-Z0-9]')
501 *--*) : helper pattern;;
508 __git_compute_all_commands ()
510 : ${__git_all_commands:=$(__git_list_all_commands)}
513 __git_list_porcelain_commands ()
516 __git_compute_all_commands
517 for i in "help" $__git_all_commands
520 *--*) : helper pattern;;
521 applymbox) : ask gittus;;
522 applypatch) : ask gittus;;
523 archimport) : import;;
524 cat-file) : plumbing;;
525 check-attr) : plumbing;;
526 check-ref-format) : plumbing;;
527 checkout-index) : plumbing;;
528 commit-tree) : plumbing;;
529 count-objects) : infrequent;;
530 cvsexportcommit) : export;;
531 cvsimport) : import;;
532 cvsserver) : daemon;;
534 diff-files) : plumbing;;
535 diff-index) : plumbing;;
536 diff-tree) : plumbing;;
537 fast-import) : import;;
538 fast-export) : export;;
539 fsck-objects) : plumbing;;
540 fetch-pack) : plumbing;;
541 fmt-merge-msg) : plumbing;;
542 for-each-ref) : plumbing;;
543 hash-object) : plumbing;;
544 http-*) : transport;;
545 index-pack) : plumbing;;
546 init-db) : deprecated;;
547 local-fetch) : plumbing;;
548 lost-found) : infrequent;;
549 ls-files) : plumbing;;
550 ls-remote) : plumbing;;
551 ls-tree) : plumbing;;
552 mailinfo) : plumbing;;
553 mailsplit) : plumbing;;
554 merge-*) : plumbing;;
557 pack-objects) : plumbing;;
558 pack-redundant) : plumbing;;
559 pack-refs) : plumbing;;
560 parse-remote) : plumbing;;
561 patch-id) : plumbing;;
562 peek-remote) : plumbing;;
564 prune-packed) : plumbing;;
565 quiltimport) : import;;
566 read-tree) : plumbing;;
567 receive-pack) : plumbing;;
569 remote-*) : transport;;
570 repo-config) : deprecated;;
572 rev-list) : plumbing;;
573 rev-parse) : plumbing;;
574 runstatus) : plumbing;;
575 sh-setup) : internal;;
577 show-ref) : plumbing;;
578 send-pack) : plumbing;;
579 show-index) : plumbing;;
581 stripspace) : plumbing;;
582 symbolic-ref) : plumbing;;
583 tar-tree) : deprecated;;
584 unpack-file) : plumbing;;
585 unpack-objects) : plumbing;;
586 update-index) : plumbing;;
587 update-ref) : plumbing;;
588 update-server-info) : daemon;;
589 upload-archive) : plumbing;;
590 upload-pack) : plumbing;;
591 write-tree) : plumbing;;
593 verify-pack) : infrequent;;
594 verify-tag) : plumbing;;
600 __git_porcelain_commands=
601 __git_compute_porcelain_commands ()
603 __git_compute_all_commands
604 : ${__git_porcelain_commands:=$(__git_list_porcelain_commands)}
610 for i in $(git --git-dir="$(__gitdir)" config --get-regexp "alias\..*" 2>/dev/null); do
620 # __git_aliased_command requires 1 argument
621 __git_aliased_command ()
623 local word cmdline=$(git --git-dir="$(__gitdir)" \
624 config --get "alias.$1")
625 for word in $cmdline; do
626 if [ "${word##-*}" ]; then
633 # __git_find_on_cmdline requires 1 argument
634 __git_find_on_cmdline ()
636 local word subcommand c=1
638 while [ $c -lt $COMP_CWORD ]; do
639 word="${COMP_WORDS[c]}"
640 for subcommand in $1; do
641 if [ "$subcommand" = "$word" ]; then
650 __git_has_doubledash ()
653 while [ $c -lt $COMP_CWORD ]; do
654 if [ "--" = "${COMP_WORDS[c]}" ]; then
662 __git_whitespacelist="nowarn warn error error-all fix"
666 local cur="${COMP_WORDS[COMP_CWORD]}" dir="$(__gitdir)"
667 if [ -d "$dir"/rebase-apply ]; then
668 __gitcomp "--skip --continue --resolved --abort"
673 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
678 --3way --committer-date-is-author-date --ignore-date
679 --ignore-whitespace --ignore-space-change
680 --interactive --keep --no-utf8 --signoff --utf8
681 --whitespace= --scissors
690 local cur="${COMP_WORDS[COMP_CWORD]}"
693 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
698 --stat --numstat --summary --check --index
699 --cached --index-info --reverse --reject --unidiff-zero
700 --apply --no-add --exclude=
701 --ignore-whitespace --ignore-space-change
702 --whitespace= --inaccurate-eof --verbose
711 __git_has_doubledash && return
713 local cur="${COMP_WORDS[COMP_CWORD]}"
717 --interactive --refresh --patch --update --dry-run
718 --ignore-errors --intent-to-add
727 local cur="${COMP_WORDS[COMP_CWORD]}"
730 __gitcomp "$(git archive --list)" "" "${cur##--format=}"
734 __gitcomp "$(__git_remotes)" "" "${cur##--remote=}"
739 --format= --list --verbose
740 --prefix= --remote= --exec=
750 __git_has_doubledash && return
752 local subcommands="start bad good skip reset visualize replay log run"
753 local subcommand="$(__git_find_on_cmdline "$subcommands")"
754 if [ -z "$subcommand" ]; then
755 __gitcomp "$subcommands"
759 case "$subcommand" in
761 __gitcomp "$(__git_refs)"
771 local i c=1 only_local_ref="n" has_r="n"
773 while [ $c -lt $COMP_CWORD ]; do
776 -d|-m) only_local_ref="y" ;;
782 case "${COMP_WORDS[COMP_CWORD]}" in
785 --color --no-color --verbose --abbrev= --no-abbrev
786 --track --no-track --contains --merged --no-merged
790 if [ $only_local_ref = "y" -a $has_r = "n" ]; then
791 __gitcomp "$(__git_heads)"
793 __gitcomp "$(__git_refs)"
801 local cmd="${COMP_WORDS[2]}"
802 case "$COMP_CWORD" in
804 __gitcomp "create list-heads verify unbundle"
812 __git_complete_revlist
821 __git_has_doubledash && return
823 local cur="${COMP_WORDS[COMP_CWORD]}"
826 __gitcomp "diff3 merge" "" "${cur##--conflict=}"
830 --quiet --ours --theirs --track --no-track --merge
835 __gitcomp "$(__git_refs)"
842 __gitcomp "$(__git_refs)"
847 local cur="${COMP_WORDS[COMP_CWORD]}"
850 __gitcomp "--edit --no-commit"
853 __gitcomp "$(__git_refs)"
860 __git_has_doubledash && return
862 local cur="${COMP_WORDS[COMP_CWORD]}"
865 __gitcomp "--dry-run --quiet"
874 local cur="${COMP_WORDS[COMP_CWORD]}"
899 __git_has_doubledash && return
901 local cur="${COMP_WORDS[COMP_CWORD]}"
904 __gitcomp "default strip verbatim whitespace
905 " "" "${cur##--cleanup=}"
909 __gitcomp "$(__git_refs)" "" "${cur##--reuse-message=}"
913 __gitcomp "$(__git_refs)" "" "${cur##--reedit-message=}"
917 __gitcomp "all no normal" "" "${cur##--untracked-files=}"
922 --all --author= --signoff --verify --no-verify
923 --edit --amend --include --only --interactive
924 --dry-run --reuse-message= --reedit-message=
925 --reset-author --file= --message= --template=
926 --cleanup= --untracked-files --untracked-files=
936 local cur="${COMP_WORDS[COMP_CWORD]}"
940 --all --tags --contains --abbrev= --candidates=
941 --exact-match --debug --long --match --always
945 __gitcomp "$(__git_refs)"
948 __git_diff_common_options="--stat --numstat --shortstat --summary
949 --patch-with-stat --name-only --name-status --color
950 --no-color --color-words --no-renames --check
951 --full-index --binary --abbrev --diff-filter=
953 --text --ignore-space-at-eol --ignore-space-change
954 --ignore-all-space --exit-code --quiet --ext-diff
956 --no-prefix --src-prefix= --dst-prefix=
957 --inter-hunk-context=
960 --dirstat --dirstat= --dirstat-by-file
961 --dirstat-by-file= --cumulative
966 __git_has_doubledash && return
968 local cur="${COMP_WORDS[COMP_CWORD]}"
971 __gitcomp "--cached --staged --pickaxe-all --pickaxe-regex
972 --base --ours --theirs
973 $__git_diff_common_options
981 __git_mergetools_common="diffuse ecmerge emerge kdiff3 meld opendiff
982 tkdiff vimdiff gvimdiff xxdiff araxis p4merge
987 __git_has_doubledash && return
989 local cur="${COMP_WORDS[COMP_CWORD]}"
992 __gitcomp "$__git_mergetools_common kompare" "" "${cur##--tool=}"
996 __gitcomp "--cached --staged --pickaxe-all --pickaxe-regex
997 --base --ours --theirs
998 --no-renames --diff-filter= --find-copies-harder
999 --relative --ignore-submodules
1007 __git_fetch_options="
1008 --quiet --verbose --append --upload-pack --force --keep --depth=
1009 --tags --no-tags --all --prune --dry-run
1014 local cur="${COMP_WORDS[COMP_CWORD]}"
1017 __gitcomp "$__git_fetch_options"
1021 __git_complete_remote_or_refspec
1024 _git_format_patch ()
1026 local cur="${COMP_WORDS[COMP_CWORD]}"
1031 " "" "${cur##--thread=}"
1036 --stdout --attach --no-attach --thread --thread=
1038 --numbered --start-number
1042 --in-reply-to= --cc=
1043 --full-index --binary
1046 --no-prefix --src-prefix= --dst-prefix=
1047 --inline --suffix= --ignore-if-in-upstream
1053 __git_complete_revlist
1058 local cur="${COMP_WORDS[COMP_CWORD]}"
1062 --tags --root --unreachable --cache --no-reflogs --full
1063 --strict --verbose --lost-found
1073 local cur="${COMP_WORDS[COMP_CWORD]}"
1076 __gitcomp "--prune --aggressive"
1085 __git_has_doubledash && return
1087 local cur="${COMP_WORDS[COMP_CWORD]}"
1092 --text --ignore-case --word-regexp --invert-match
1094 --extended-regexp --basic-regexp --fixed-strings
1095 --files-with-matches --name-only
1096 --files-without-match
1099 --and --or --not --all-match
1105 __gitcomp "$(__git_refs)"
1110 local cur="${COMP_WORDS[COMP_CWORD]}"
1113 __gitcomp "--all --info --man --web"
1117 __git_compute_all_commands
1118 __gitcomp "$__git_all_commands
1119 attributes cli core-tutorial cvs-migration
1120 diffcore gitk glossary hooks ignore modules
1121 repository-layout tutorial tutorial-2
1128 local cur="${COMP_WORDS[COMP_CWORD]}"
1132 false true umask group all world everybody
1133 " "" "${cur##--shared=}"
1137 __gitcomp "--quiet --bare --template= --shared --shared="
1146 __git_has_doubledash && return
1148 local cur="${COMP_WORDS[COMP_CWORD]}"
1151 __gitcomp "--cached --deleted --modified --others --ignored
1152 --stage --directory --no-empty-directory --unmerged
1153 --killed --exclude= --exclude-from=
1154 --exclude-per-directory= --exclude-standard
1155 --error-unmatch --with-tree= --full-name
1156 --abbrev --ignored --exclude-per-directory
1166 __gitcomp "$(__git_remotes)"
1174 # Options that go well for log, shortlog and gitk
1175 __git_log_common_options="
1177 --branches --tags --remotes
1178 --first-parent --merges --no-merges
1180 --max-age= --since= --after=
1181 --min-age= --until= --before=
1183 # Options that go well for log and gitk (not shortlog)
1184 __git_log_gitk_options="
1185 --dense --sparse --full-history
1186 --simplify-merges --simplify-by-decoration
1189 # Options that go well for log and shortlog (not gitk)
1190 __git_log_shortlog_options="
1191 --author= --committer= --grep=
1195 __git_log_pretty_formats="oneline short medium full fuller email raw format:"
1196 __git_log_date_formats="relative iso8601 rfc2822 short local default raw"
1200 __git_has_doubledash && return
1202 local cur="${COMP_WORDS[COMP_CWORD]}"
1203 local g="$(git rev-parse --git-dir 2>/dev/null)"
1205 if [ -f "$g/MERGE_HEAD" ]; then
1210 __gitcomp "$__git_log_pretty_formats
1211 " "" "${cur##--pretty=}"
1215 __gitcomp "$__git_log_pretty_formats
1216 " "" "${cur##--format=}"
1220 __gitcomp "$__git_log_date_formats" "" "${cur##--date=}"
1224 __gitcomp "long short" "" "${cur##--decorate=}"
1229 $__git_log_common_options
1230 $__git_log_shortlog_options
1231 $__git_log_gitk_options
1232 --root --topo-order --date-order --reverse
1233 --follow --full-diff
1234 --abbrev-commit --abbrev=
1235 --relative-date --date=
1236 --pretty= --format= --oneline
1239 --decorate --decorate=
1241 --parents --children
1243 $__git_diff_common_options
1244 --pickaxe-all --pickaxe-regex
1249 __git_complete_revlist
1252 __git_merge_options="
1253 --no-commit --no-stat --log --no-log --squash --strategy
1254 --commit --stat --no-squash --ff --no-ff --ff-only
1259 __git_complete_strategy && return
1261 local cur="${COMP_WORDS[COMP_CWORD]}"
1264 __gitcomp "$__git_merge_options"
1267 __gitcomp "$(__git_refs)"
1272 local cur="${COMP_WORDS[COMP_CWORD]}"
1275 __gitcomp "$__git_mergetools_common tortoisemerge" "" "${cur##--tool=}"
1288 __gitcomp "$(__git_refs)"
1293 local cur="${COMP_WORDS[COMP_CWORD]}"
1296 __gitcomp "--dry-run"
1305 __gitcomp "--tags --all --stdin"
1310 local subcommands="edit show"
1311 if [ -z "$(__git_find_on_cmdline "$subcommands")" ]; then
1312 __gitcomp "$subcommands"
1316 case "${COMP_WORDS[COMP_CWORD-1]}" in
1321 __gitcomp "$(__git_refs)"
1328 __git_complete_strategy && return
1330 local cur="${COMP_WORDS[COMP_CWORD]}"
1334 --rebase --no-rebase
1335 $__git_merge_options
1336 $__git_fetch_options
1341 __git_complete_remote_or_refspec
1346 local cur="${COMP_WORDS[COMP_CWORD]}"
1347 case "${COMP_WORDS[COMP_CWORD-1]}" in
1349 __gitcomp "$(__git_remotes)"
1354 __gitcomp "$(__git_remotes)" "" "${cur##--repo=}"
1359 --all --mirror --tags --dry-run --force --verbose
1360 --receive-pack= --repo=
1365 __git_complete_remote_or_refspec
1370 local cur="${COMP_WORDS[COMP_CWORD]}" dir="$(__gitdir)"
1371 if [ -d "$dir"/rebase-apply ] || [ -d "$dir"/rebase-merge ]; then
1372 __gitcomp "--continue --skip --abort"
1375 __git_complete_strategy && return
1378 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
1383 --onto --merge --strategy --interactive
1384 --preserve-merges --stat --no-stat
1385 --committer-date-is-author-date --ignore-date
1386 --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