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) You may want to make sure the git executable is available
25 # in your PATH before this script is sourced, as some caching
26 # is performed while the script loads. If git isn't found
27 # at source time then all lookups will be done on demand,
28 # which may be slightly slower.
30 # 4) Consider changing your PS1 to also show the current branch:
31 # PS1='[\u@\h \W$(__git_ps1 " (%s)")]\$ '
33 # The argument to __git_ps1 will be displayed only if you
34 # are currently in a git repository. The %s token will be
35 # the name of the current branch.
37 # In addition, if you set GIT_PS1_SHOWDIRTYSTATE to a nonempty
38 # value, unstaged (*) and staged (+) changes will be shown next
39 # to the branch name. You can configure this per-repository
40 # with the bash.showDirtyState variable, which defaults to true
41 # once GIT_PS1_SHOWDIRTYSTATE is enabled.
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 [ -d "$g/rebase-apply" ]; then
88 if [ -f "$g/rebase-apply/rebasing" ]; then
90 elif [ -f "$g/rebase-apply/applying" ]; then
95 b="$(git symbolic-ref HEAD 2>/dev/null)"
96 elif [ -f "$g/rebase-merge/interactive" ]; then
98 b="$(cat "$g/rebase-merge/head-name")"
99 elif [ -d "$g/rebase-merge" ]; then
101 b="$(cat "$g/rebase-merge/head-name")"
103 if [ -f "$g/MERGE_HEAD" ]; then
106 if [ -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)..." ||
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 --ignore-submodules \
144 --quiet --exit-code || w="*"
145 if git rev-parse --quiet --verify HEAD >/dev/null; then
146 git diff-index --cached --quiet \
147 --ignore-submodules HEAD -- || i="+"
156 if [ -n "${1-}" ]; then
157 printf "$1" "$c${b##refs/heads/}$w$i$r"
159 printf " (%s)" "$c${b##refs/heads/}$w$i$r"
165 # __gitcomp_1 requires 2 arguments
168 local c IFS=' '$'\t'$'\n'
171 --*=*) printf %s$'\n' "$c$2" ;;
172 *.) printf %s$'\n' "$c$2" ;;
173 *) printf %s$'\n' "$c$2 " ;;
178 # __gitcomp accepts 1, 2, 3, or 4 arguments
179 # generates completion reply with compgen
182 local cur="${COMP_WORDS[COMP_CWORD]}"
183 if [ $# -gt 2 ]; then
192 COMPREPLY=($(compgen -P "${2-}" \
193 -W "$(__gitcomp_1 "${1-}" "${4-}")" \
199 # __git_heads accepts 0 or 1 arguments (to pass to __gitdir)
202 local cmd i is_hash=y dir="$(__gitdir "${1-}")"
203 if [ -d "$dir" ]; then
204 git --git-dir="$dir" for-each-ref --format='%(refname:short)' \
208 for i in $(git ls-remote "${1-}" 2>/dev/null); do
209 case "$is_hash,$i" in
212 n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;
213 n,*) is_hash=y; echo "$i" ;;
218 # __git_tags accepts 0 or 1 arguments (to pass to __gitdir)
221 local cmd i is_hash=y dir="$(__gitdir "${1-}")"
222 if [ -d "$dir" ]; then
223 git --git-dir="$dir" for-each-ref --format='%(refname:short)' \
227 for i in $(git ls-remote "${1-}" 2>/dev/null); do
228 case "$is_hash,$i" in
231 n,refs/tags/*) is_hash=y; echo "${i#refs/tags/}" ;;
232 n,*) is_hash=y; echo "$i" ;;
237 # __git_refs accepts 0 or 1 arguments (to pass to __gitdir)
240 local i is_hash=y dir="$(__gitdir "${1-}")"
241 local cur="${COMP_WORDS[COMP_CWORD]}" format refs
242 if [ -d "$dir" ]; then
249 if [ -e "$dir/HEAD" ]; then echo HEAD; fi
250 format="refname:short"
251 refs="refs/tags refs/heads refs/remotes"
254 git --git-dir="$dir" for-each-ref --format="%($format)" \
258 for i in $(git ls-remote "$dir" 2>/dev/null); do
259 case "$is_hash,$i" in
262 n,refs/tags/*) is_hash=y; echo "${i#refs/tags/}" ;;
263 n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;
264 n,refs/remotes/*) is_hash=y; echo "${i#refs/remotes/}" ;;
265 n,*) is_hash=y; echo "$i" ;;
270 # __git_refs2 requires 1 argument (to pass to __git_refs)
274 for i in $(__git_refs "$1"); do
279 # __git_refs_remotes requires 1 argument (to pass to ls-remote)
280 __git_refs_remotes ()
282 local cmd i is_hash=y
283 for i in $(git ls-remote "$1" 2>/dev/null); do
284 case "$is_hash,$i" in
287 echo "$i:refs/remotes/$1/${i#refs/heads/}"
291 n,refs/tags/*) is_hash=y;;
299 local i ngoff IFS=$'\n' d="$(__gitdir)"
300 shopt -q nullglob || ngoff=1
302 for i in "$d/remotes"/*; do
303 echo ${i#$d/remotes/}
305 [ "$ngoff" ] && shopt -u nullglob
306 for i in $(git --git-dir="$d" config --list); do
316 __git_merge_strategies ()
318 if [ -n "${__git_merge_strategylist-}" ]; then
319 echo "$__git_merge_strategylist"
322 git merge -s help 2>&1 |
323 sed -n -e '/[Aa]vailable strategies are: /,/^$/{
331 __git_merge_strategylist=
332 __git_merge_strategylist=$(__git_merge_strategies 2>/dev/null)
334 __git_complete_file ()
336 local pfx ls ref cur="${COMP_WORDS[COMP_CWORD]}"
353 case "$COMP_WORDBREAKS" in
355 *) pfx="$ref:$pfx" ;;
359 COMPREPLY=($(compgen -P "$pfx" \
360 -W "$(git --git-dir="$(__gitdir)" ls-tree "$ls" \
361 | sed '/^100... blob /{
377 __gitcomp "$(__git_refs)"
382 __git_complete_revlist ()
384 local pfx cur="${COMP_WORDS[COMP_CWORD]}"
389 __gitcomp "$(__git_refs)" "$pfx" "$cur"
394 __gitcomp "$(__git_refs)" "$pfx" "$cur"
397 __gitcomp "$(__git_refs)"
402 __git_complete_remote_or_refspec ()
404 local cmd="${COMP_WORDS[1]}"
405 local cur="${COMP_WORDS[COMP_CWORD]}"
406 local i c=2 remote="" pfx="" lhs=1 no_complete_refspec=0
407 while [ $c -lt $COMP_CWORD ]; do
410 --all|--mirror) [ "$cmd" = "push" ] && no_complete_refspec=1 ;;
412 *) remote="$i"; break ;;
416 if [ -z "$remote" ]; then
417 __gitcomp "$(__git_remotes)"
420 if [ $no_complete_refspec = 1 ]; then
424 [ "$remote" = "." ] && remote=
427 case "$COMP_WORDBREAKS" in
429 *) pfx="${cur%%:*}:" ;;
441 if [ $lhs = 1 ]; then
442 __gitcomp "$(__git_refs2 "$remote")" "$pfx" "$cur"
444 __gitcomp "$(__git_refs)" "$pfx" "$cur"
448 if [ $lhs = 1 ]; then
449 __gitcomp "$(__git_refs "$remote")" "$pfx" "$cur"
451 __gitcomp "$(__git_refs)" "$pfx" "$cur"
455 if [ $lhs = 1 ]; then
456 __gitcomp "$(__git_refs)" "$pfx" "$cur"
458 __gitcomp "$(__git_refs "$remote")" "$pfx" "$cur"
464 __git_complete_strategy ()
466 case "${COMP_WORDS[COMP_CWORD-1]}" in
468 __gitcomp "$(__git_merge_strategies)"
471 local cur="${COMP_WORDS[COMP_CWORD]}"
474 __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
481 __git_all_commands ()
483 if [ -n "${__git_all_commandlist-}" ]; then
484 echo "$__git_all_commandlist"
488 for i in $(git help -a|egrep '^ ')
491 *--*) : helper pattern;;
496 __git_all_commandlist=
497 __git_all_commandlist="$(__git_all_commands 2>/dev/null)"
499 __git_porcelain_commands ()
501 if [ -n "${__git_porcelain_commandlist-}" ]; then
502 echo "$__git_porcelain_commandlist"
506 for i in "help" $(__git_all_commands)
509 *--*) : helper pattern;;
510 applymbox) : ask gittus;;
511 applypatch) : ask gittus;;
512 archimport) : import;;
513 cat-file) : plumbing;;
514 check-attr) : plumbing;;
515 check-ref-format) : plumbing;;
516 checkout-index) : plumbing;;
517 commit-tree) : plumbing;;
518 count-objects) : infrequent;;
519 cvsexportcommit) : export;;
520 cvsimport) : import;;
521 cvsserver) : daemon;;
523 diff-files) : plumbing;;
524 diff-index) : plumbing;;
525 diff-tree) : plumbing;;
526 fast-import) : import;;
527 fast-export) : export;;
528 fsck-objects) : plumbing;;
529 fetch-pack) : plumbing;;
530 fmt-merge-msg) : plumbing;;
531 for-each-ref) : plumbing;;
532 hash-object) : plumbing;;
533 http-*) : transport;;
534 index-pack) : plumbing;;
535 init-db) : deprecated;;
536 local-fetch) : plumbing;;
537 lost-found) : infrequent;;
538 ls-files) : plumbing;;
539 ls-remote) : plumbing;;
540 ls-tree) : plumbing;;
541 mailinfo) : plumbing;;
542 mailsplit) : plumbing;;
543 merge-*) : plumbing;;
546 pack-objects) : plumbing;;
547 pack-redundant) : plumbing;;
548 pack-refs) : plumbing;;
549 parse-remote) : plumbing;;
550 patch-id) : plumbing;;
551 peek-remote) : plumbing;;
553 prune-packed) : plumbing;;
554 quiltimport) : import;;
555 read-tree) : plumbing;;
556 receive-pack) : plumbing;;
558 repo-config) : deprecated;;
560 rev-list) : plumbing;;
561 rev-parse) : plumbing;;
562 runstatus) : plumbing;;
563 sh-setup) : internal;;
565 show-ref) : plumbing;;
566 send-pack) : plumbing;;
567 show-index) : plumbing;;
569 stripspace) : plumbing;;
570 symbolic-ref) : plumbing;;
571 tar-tree) : deprecated;;
572 unpack-file) : plumbing;;
573 unpack-objects) : plumbing;;
574 update-index) : plumbing;;
575 update-ref) : plumbing;;
576 update-server-info) : daemon;;
577 upload-archive) : plumbing;;
578 upload-pack) : plumbing;;
579 write-tree) : plumbing;;
581 verify-pack) : infrequent;;
582 verify-tag) : plumbing;;
587 __git_porcelain_commandlist=
588 __git_porcelain_commandlist="$(__git_porcelain_commands 2>/dev/null)"
593 for i in $(git --git-dir="$(__gitdir)" config --list); do
603 # __git_aliased_command requires 1 argument
604 __git_aliased_command ()
606 local word cmdline=$(git --git-dir="$(__gitdir)" \
607 config --get "alias.$1")
608 for word in $cmdline; do
609 if [ "${word##-*}" ]; then
616 # __git_find_subcommand requires 1 argument
617 __git_find_subcommand ()
619 local word subcommand c=1
621 while [ $c -lt $COMP_CWORD ]; do
622 word="${COMP_WORDS[c]}"
623 for subcommand in $1; do
624 if [ "$subcommand" = "$word" ]; then
633 __git_has_doubledash ()
636 while [ $c -lt $COMP_CWORD ]; do
637 if [ "--" = "${COMP_WORDS[c]}" ]; then
645 __git_whitespacelist="nowarn warn error error-all fix"
649 local cur="${COMP_WORDS[COMP_CWORD]}" dir="$(__gitdir)"
650 if [ -d "$dir"/rebase-apply ]; then
651 __gitcomp "--skip --resolved --abort"
656 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
661 --3way --committer-date-is-author-date --ignore-date
662 --interactive --keep --no-utf8 --signoff --utf8
672 local cur="${COMP_WORDS[COMP_CWORD]}"
675 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
680 --stat --numstat --summary --check --index
681 --cached --index-info --reverse --reject --unidiff-zero
682 --apply --no-add --exclude=
683 --whitespace= --inaccurate-eof --verbose
692 __git_has_doubledash && return
694 local cur="${COMP_WORDS[COMP_CWORD]}"
698 --interactive --refresh --patch --update --dry-run
699 --ignore-errors --intent-to-add
708 local cur="${COMP_WORDS[COMP_CWORD]}"
711 __gitcomp "$(git archive --list)" "" "${cur##--format=}"
715 __gitcomp "$(__git_remotes)" "" "${cur##--remote=}"
720 --format= --list --verbose
721 --prefix= --remote= --exec=
731 __git_has_doubledash && return
733 local subcommands="start bad good skip reset visualize replay log run"
734 local subcommand="$(__git_find_subcommand "$subcommands")"
735 if [ -z "$subcommand" ]; then
736 __gitcomp "$subcommands"
740 case "$subcommand" in
742 __gitcomp "$(__git_refs)"
752 local i c=1 only_local_ref="n" has_r="n"
754 while [ $c -lt $COMP_CWORD ]; do
757 -d|-m) only_local_ref="y" ;;
763 case "${COMP_WORDS[COMP_CWORD]}" in
766 --color --no-color --verbose --abbrev= --no-abbrev
767 --track --no-track --contains --merged --no-merged
771 if [ $only_local_ref = "y" -a $has_r = "n" ]; then
772 __gitcomp "$(__git_heads)"
774 __gitcomp "$(__git_refs)"
782 local cmd="${COMP_WORDS[2]}"
783 case "$COMP_CWORD" in
785 __gitcomp "create list-heads verify unbundle"
793 __git_complete_revlist
802 __git_has_doubledash && return
804 __gitcomp "$(__git_refs)"
809 __gitcomp "$(__git_refs)"
814 local cur="${COMP_WORDS[COMP_CWORD]}"
817 __gitcomp "--edit --no-commit"
820 __gitcomp "$(__git_refs)"
827 __git_has_doubledash && return
829 local cur="${COMP_WORDS[COMP_CWORD]}"
832 __gitcomp "--dry-run --quiet"
841 local cur="${COMP_WORDS[COMP_CWORD]}"
866 __git_has_doubledash && return
868 local cur="${COMP_WORDS[COMP_CWORD]}"
872 --all --author= --signoff --verify --no-verify
873 --edit --amend --include --only --interactive
882 local cur="${COMP_WORDS[COMP_CWORD]}"
886 --all --tags --contains --abbrev= --candidates=
887 --exact-match --debug --long --match --always
891 __gitcomp "$(__git_refs)"
894 __git_diff_common_options="--stat --numstat --shortstat --summary
895 --patch-with-stat --name-only --name-status --color
896 --no-color --color-words --no-renames --check
897 --full-index --binary --abbrev --diff-filter=
899 --text --ignore-space-at-eol --ignore-space-change
900 --ignore-all-space --exit-code --quiet --ext-diff
902 --no-prefix --src-prefix= --dst-prefix=
903 --inter-hunk-context=
910 __git_has_doubledash && return
912 local cur="${COMP_WORDS[COMP_CWORD]}"
915 __gitcomp "--cached --staged --pickaxe-all --pickaxe-regex
916 --base --ours --theirs
917 $__git_diff_common_options
925 __git_mergetools_common="diffuse ecmerge emerge kdiff3 meld opendiff
926 tkdiff vimdiff gvimdiff xxdiff
931 local cur="${COMP_WORDS[COMP_CWORD]}"
934 __gitcomp "$__git_mergetools_common kompare" "" "${cur##--tool=}"
945 __git_fetch_options="
946 --quiet --verbose --append --upload-pack --force --keep --depth=
952 local cur="${COMP_WORDS[COMP_CWORD]}"
955 __gitcomp "$__git_fetch_options"
959 __git_complete_remote_or_refspec
964 local cur="${COMP_WORDS[COMP_CWORD]}"
969 " "" "${cur##--thread=}"
974 --stdout --attach --no-attach --thread --thread=
976 --numbered --start-number
981 --full-index --binary
984 --no-prefix --src-prefix= --dst-prefix=
985 --inline --suffix= --ignore-if-in-upstream
991 __git_complete_revlist
996 local cur="${COMP_WORDS[COMP_CWORD]}"
1000 --tags --root --unreachable --cache --no-reflogs --full
1001 --strict --verbose --lost-found
1011 local cur="${COMP_WORDS[COMP_CWORD]}"
1014 __gitcomp "--prune --aggressive"
1023 __git_has_doubledash && return
1025 local cur="${COMP_WORDS[COMP_CWORD]}"
1030 --text --ignore-case --word-regexp --invert-match
1032 --extended-regexp --basic-regexp --fixed-strings
1033 --files-with-matches --name-only
1034 --files-without-match
1036 --and --or --not --all-match
1046 local cur="${COMP_WORDS[COMP_CWORD]}"
1049 __gitcomp "--all --info --man --web"
1053 __gitcomp "$(__git_all_commands)
1054 attributes cli core-tutorial cvs-migration
1055 diffcore gitk glossary hooks ignore modules
1056 repository-layout tutorial tutorial-2
1063 local cur="${COMP_WORDS[COMP_CWORD]}"
1067 false true umask group all world everybody
1068 " "" "${cur##--shared=}"
1072 __gitcomp "--quiet --bare --template= --shared --shared="
1081 __git_has_doubledash && return
1083 local cur="${COMP_WORDS[COMP_CWORD]}"
1086 __gitcomp "--cached --deleted --modified --others --ignored
1087 --stage --directory --no-empty-directory --unmerged
1088 --killed --exclude= --exclude-from=
1089 --exclude-per-directory= --exclude-standard
1090 --error-unmatch --with-tree= --full-name
1091 --abbrev --ignored --exclude-per-directory
1101 __gitcomp "$(__git_remotes)"
1109 # Options that go well for log, shortlog and gitk
1110 __git_log_common_options="
1112 --branches --tags --remotes
1113 --first-parent --no-merges
1115 --max-age= --since= --after=
1116 --min-age= --until= --before=
1118 # Options that go well for log and gitk (not shortlog)
1119 __git_log_gitk_options="
1120 --dense --sparse --full-history
1121 --simplify-merges --simplify-by-decoration
1124 # Options that go well for log and shortlog (not gitk)
1125 __git_log_shortlog_options="
1126 --author= --committer= --grep=
1130 __git_log_pretty_formats="oneline short medium full fuller email raw format:"
1131 __git_log_date_formats="relative iso8601 rfc2822 short local default raw"
1135 __git_has_doubledash && return
1137 local cur="${COMP_WORDS[COMP_CWORD]}"
1138 local g="$(git rev-parse --git-dir 2>/dev/null)"
1140 if [ -f "$g/MERGE_HEAD" ]; then
1145 __gitcomp "$__git_log_pretty_formats
1146 " "" "${cur##--pretty=}"
1150 __gitcomp "$__git_log_pretty_formats
1151 " "" "${cur##--format=}"
1155 __gitcomp "$__git_log_date_formats" "" "${cur##--date=}"
1160 $__git_log_common_options
1161 $__git_log_shortlog_options
1162 $__git_log_gitk_options
1163 --root --topo-order --date-order --reverse
1165 --abbrev-commit --abbrev=
1166 --relative-date --date=
1167 --pretty= --format= --oneline
1172 --parents --children
1174 $__git_diff_common_options
1175 --pickaxe-all --pickaxe-regex
1180 __git_complete_revlist
1183 __git_merge_options="
1184 --no-commit --no-stat --log --no-log --squash --strategy
1185 --commit --stat --no-squash --ff --no-ff
1190 __git_complete_strategy && return
1192 local cur="${COMP_WORDS[COMP_CWORD]}"
1195 __gitcomp "$__git_merge_options"
1198 __gitcomp "$(__git_refs)"
1203 local cur="${COMP_WORDS[COMP_CWORD]}"
1206 __gitcomp "$__git_mergetools_common tortoisemerge" "" "${cur##--tool=}"
1219 __gitcomp "$(__git_refs)"
1224 local cur="${COMP_WORDS[COMP_CWORD]}"
1227 __gitcomp "--dry-run"
1236 __gitcomp "--tags --all --stdin"
1241 __git_complete_strategy && return
1243 local cur="${COMP_WORDS[COMP_CWORD]}"
1247 --rebase --no-rebase
1248 $__git_merge_options
1249 $__git_fetch_options
1254 __git_complete_remote_or_refspec
1259 local cur="${COMP_WORDS[COMP_CWORD]}"
1260 case "${COMP_WORDS[COMP_CWORD-1]}" in
1262 __gitcomp "$(__git_remotes)"
1267 __gitcomp "$(__git_remotes)" "" "${cur##--repo=}"
1272 --all --mirror --tags --dry-run --force --verbose
1273 --receive-pack= --repo=
1278 __git_complete_remote_or_refspec
1283 local cur="${COMP_WORDS[COMP_CWORD]}" dir="$(__gitdir)"
1284 if [ -d "$dir"/rebase-apply ] || [ -d "$dir"/rebase-merge ]; then
1285 __gitcomp "--continue --skip --abort"
1288 __git_complete_strategy && return
1291 __gitcomp "--onto --merge --strategy --interactive"
1294 __gitcomp "$(__git_refs)"
1297 __git_send_email_confirm_options="always never auto cc compose"
1298 __git_send_email_suppresscc_options="author self cc ccbody sob cccmd body all"
1302 local cur="${COMP_WORDS[COMP_CWORD]}"
1306 $__git_send_email_confirm_options
1307 " "" "${cur##--confirm=}"
1312 $__git_send_email_suppresscc_options
1313 " "" "${cur##--suppress-cc=}"
1317 --smtp-encryption=*)
1318 __gitcomp "ssl tls" "" "${cur##--smtp-encryption=}"
1322 __gitcomp "--annotate --bcc --cc --cc-cmd --chain-reply-to
1323 --compose --confirm= --dry-run --envelope-sender
1325 --in-reply-to --no-chain-reply-to --no-signed-off-by-cc
1326 --no-suppress-from --no-thread --quiet
1327 --signed-off-by-cc --smtp-pass --smtp-server
1328 --smtp-server-port --smtp-encryption= --smtp-user
1329 --subject --suppress-cc= --suppress-from --thread --to
1330 --validate --no-validate"
1339 local cur="${COMP_WORDS[COMP_CWORD]}"
1340 local prv="${COMP_WORDS[COMP_CWORD-1]}"
1343 __gitcomp "$(__git_remotes)"
1347 __gitcomp "$(__git_refs)"
1351 local remote="${prv#remote.}"
1352 remote="${remote%.fetch}"
1353 __gitcomp "$(__git_refs_remotes "$remote")"
1357 local remote="${prv#remote.}"
1358 remote="${remote%.push}"
1359 __gitcomp "$(git --git-dir="$(__gitdir)" \
1360 for-each-ref --format='%(refname):%(refname)' \
1364 pull.twohead|pull.octopus)
1365 __gitcomp "$(__git_merge_strategies)"
1368 color.branch|color.diff|color.interactive|color.status|color.ui)
1369 __gitcomp "always never auto"
1373 __gitcomp "false true"
1378 normal black red green yellow blue magenta cyan white
1379 bold dim ul blink reverse
1384 __gitcomp "man info web html"
1388 __gitcomp "$__git_log_date_formats"
1391 sendemail.aliasesfiletype)
1392 __gitcomp "mutt mailrc pine elm gnus"
1396 __gitcomp "$__git_send_email_confirm_options"
1399 sendemail.suppresscc)
1400 __gitcomp "$__git_send_email_suppresscc_options"
1411 --global --system --file=
1412 --list --replace-all
1413 --get --get-all --get-regexp
1414 --add --unset --unset-all
1415 --remove-section --rename-section
1420 local pfx="${cur%.*}."
1422 __gitcomp "remote merge mergeoptions" "$pfx" "$cur"
1426 local pfx="${cur%.*}."
1428 __gitcomp "$(__git_heads)" "$pfx" "$cur" "."
1432 local pfx="${cur%.*}."
1435 argprompt cmd confirm needsfile noconsole norescan
1436 prompt revprompt revunmerged title
1441 local pfx="${cur%.*}."
1443 __gitcomp "cmd path" "$pfx" "$cur"
1447 local pfx="${cur%.*}."
1449 __gitcomp "cmd path" "$pfx" "$cur"
1453 local pfx="${cur%.*}."
1455 __gitcomp "cmd path trustExitCode" "$pfx" "$cur"
1459 local pfx="${cur%.*}."
1461 __gitcomp "$(__git_all_commands)" "$pfx" "$cur"
1465 local pfx="${cur%.*}."
1468 url proxy fetch push mirror skipDefaultUpdate
1469 receivepack uploadpack tagopt
1474 local pfx="${cur%.*}."
1476 __gitcomp "$(__git_remotes)" "$pfx" "$cur" "."
1480 local pfx="${cur%.*}."
1482 __gitcomp "insteadof" "$pfx" "$cur"
1489 branch.autosetupmerge
1490 branch.autosetuprebase
1493 color.branch.current
1504 color.diff.whitespace
1509 color.interactive.header
1510 color.interactive.help
1511 color.interactive.prompt
1515 color.status.changed
1517 color.status.nobranch
1518 color.status.untracked
1519 color.status.updated
1526 core.deltaBaseCacheLimit
1530 core.fsyncobjectfiles
1532 core.ignoreCygwinFSTricks
1534 core.logAllRefUpdates
1535 core.loosecompression
1537 core.packedGitWindowSize
1539 core.preferSymlinkRefs
1542 core.repositoryFormatVersion
1544 core.sharedRepository
1547 core.warnAmbiguousRefs
1550 diff.autorefreshindex
1556 diff.suppressBlankEmpty
1568 format.subjectprefix
1577 gc.reflogexpireunreachable
1581 gitcvs.commitmsgannotation
1582 gitcvs.dbTableNamePrefix
1593 gui.copyblamethreshold
1597 gui.matchtrackingbranch
1598 gui.newbranchtemplate
1599 gui.pruneduringfetch
1600 gui.spellingdictionary
1616 i18n.logOutputEncoding
1621 imap.preformattedHTML
1630 interactive.singlekey
1643 mergetool.keepBackup
1646 pack.deltaCacheLimit
1659 receive.denyCurrentBranch
1661 receive.denyNonFastForwards
1664 repack.usedeltabaseoffset
1667 sendemail.aliasesfile
1668 sendemail.aliasesfiletype
1672 sendemail.chainreplyto
1674 sendemail.envelopesender
1676 sendemail.signedoffbycc
1677 sendemail.smtpencryption
1679 sendemail.smtpserver
1680 sendemail.smtpserverport
1682 sendemail.suppresscc
1683 sendemail.suppressfrom
1688 status.relativePaths
1689 status.showUntrackedFiles
1691 transfer.unpackLimit
1703 local subcommands="add rename rm show prune update set-head"
1704 local subcommand="$(__git_find_subcommand "$subcommands")"
1705 if [ -z "$subcommand" ]; then
1706 __gitcomp "$subcommands"
1710 case "$subcommand" in
1711 rename|rm|show|prune)
1712 __gitcomp "$(__git_remotes)"
1715 local i c='' IFS=$'\n'
1716 for i in $(git --git-dir="$(__gitdir)" config --list); do
1734 __git_has_doubledash && return
1736 local cur="${COMP_WORDS[COMP_CWORD]}"
1739 __gitcomp "--merge --mixed --hard --soft"
1743 __gitcomp "$(__git_refs)"
1748 local cur="${COMP_WORDS[COMP_CWORD]}"
1751 __gitcomp "--edit --mainline --no-edit --no-commit --signoff"
1755 __gitcomp "$(__git_refs)"
1760 __git_has_doubledash && return
1762 local cur="${COMP_WORDS[COMP_CWORD]}"
1765 __gitcomp "--cached --dry-run --ignore-unmatch --quiet"
1774 __git_has_doubledash && return
1776 local cur="${COMP_WORDS[COMP_CWORD]}"
1780 $__git_log_common_options
1781 $__git_log_shortlog_options
1782 --numbered --summary
1787 __git_complete_revlist
1792 __git_has_doubledash && return
1794 local cur="${COMP_WORDS[COMP_CWORD]}"
1797 __gitcomp "$__git_log_pretty_formats
1798 " "" "${cur##--pretty=}"
1802 __gitcomp "$__git_log_pretty_formats
1803 " "" "${cur##--format=}"
1807 __gitcomp "--pretty= --format= --abbrev-commit --oneline
1808 $__git_diff_common_options
1818 local cur="${COMP_WORDS[COMP_CWORD]}"
1822 --all --remotes --topo-order --current --more=
1823 --list --independent --merge-base --no-name
1824 --sha1-name --sparse --topics --reflog
1829 __git_complete_revlist
1834 local subcommands='save list show apply clear drop pop create branch'
1835 local subcommand="$(__git_find_subcommand "$subcommands")"
1836 if [ -z "$subcommand" ]; then
1837 __gitcomp "$subcommands"
1839 local cur="${COMP_WORDS[COMP_CWORD]}"
1840 case "$subcommand,$cur" in
1842 __gitcomp "--keep-index"
1847 show,--*|drop,--*|pop,--*|branch,--*)
1850 show,*|apply,*|drop,*|pop,*|branch,*)
1851 __gitcomp "$(git --git-dir="$(__gitdir)" stash list \
1852 | sed -n -e 's/:.*//p')"
1863 __git_has_doubledash && return
1865 local subcommands="add status init update summary foreach sync"
1866 if [ -z "$(__git_find_subcommand "$subcommands")" ]; then
1867 local cur="${COMP_WORDS[COMP_CWORD]}"
1870 __gitcomp "--quiet --cached"
1873 __gitcomp "$subcommands"
1883 init fetch clone rebase dcommit log find-rev
1884 set-tree commit-diff info create-ignore propget
1885 proplist show-ignore show-externals branch tag blame
1888 local subcommand="$(__git_find_subcommand "$subcommands")"
1889 if [ -z "$subcommand" ]; then
1890 __gitcomp "$subcommands"
1892 local remote_opts="--username= --config-dir= --no-auth-cache"
1894 --follow-parent --authors-file= --repack=
1895 --no-metadata --use-svm-props --use-svnsync-props
1896 --log-window-size= --no-checkout --quiet
1897 --repack-flags --use-log-author --localtime
1898 --ignore-paths= $remote_opts
1901 --template= --shared= --trunk= --tags=
1902 --branches= --stdlayout --minimize-url
1903 --no-metadata --use-svm-props --use-svnsync-props
1904 --rewrite-root= --prefix= --use-log-author
1905 --add-author-from $remote_opts
1908 --edit --rmdir --find-copies-harder --copy-similarity=
1911 local cur="${COMP_WORDS[COMP_CWORD]}"
1912 case "$subcommand,$cur" in
1914 __gitcomp "--revision= --fetch-all $fc_opts"
1917 __gitcomp "--revision= $fc_opts $init_opts"
1920 __gitcomp "$init_opts"
1924 --merge --strategy= --verbose --dry-run
1925 --fetch-all --no-rebase --commit-url
1926 --revision $cmt_opts $fc_opts
1930 __gitcomp "--stdin $cmt_opts $fc_opts"
1932 create-ignore,--*|propget,--*|proplist,--*|show-ignore,--*|\
1934 __gitcomp "--revision="
1938 --limit= --revision= --verbose --incremental
1939 --oneline --show-commit --non-recursive
1940 --authors-file= --color
1945 --merge --verbose --strategy= --local
1946 --fetch-all --dry-run $fc_opts
1950 __gitcomp "--message= --file= --revision= $cmt_opts"
1956 __gitcomp "--dry-run --message --tag"
1959 __gitcomp "--dry-run --message"
1962 __gitcomp "--git-format"
1966 --config-dir= --ignore-paths= --minimize
1967 --no-auth-cache --username=
1980 while [ $c -lt $COMP_CWORD ]; do
1981 i="${COMP_WORDS[c]}"
1984 __gitcomp "$(__git_tags)"
1994 case "${COMP_WORDS[COMP_CWORD-1]}" in
2000 __gitcomp "$(__git_tags)"
2006 __gitcomp "$(__git_refs)"
2013 local i c=1 command __git_dir
2015 while [ $c -lt $COMP_CWORD ]; do
2016 i="${COMP_WORDS[c]}"
2018 --git-dir=*) __git_dir="${i#--git-dir=}" ;;
2019 --bare) __git_dir="." ;;
2020 --version|-p|--paginate) ;;
2021 --help) command="help"; break ;;
2022 *) command="$i"; break ;;
2027 if [ -z "$command" ]; then
2028 case "${COMP_WORDS[COMP_CWORD]}" in
2041 *) __gitcomp "$(__git_porcelain_commands) $(__git_aliases)" ;;
2046 local expansion=$(__git_aliased_command "$command")
2047 [ "$expansion" ] && command="$expansion"
2052 apply) _git_apply ;;
2053 archive) _git_archive ;;
2054 bisect) _git_bisect ;;
2055 bundle) _git_bundle ;;
2056 branch) _git_branch ;;
2057 checkout) _git_checkout ;;
2058 cherry) _git_cherry ;;
2059 cherry-pick) _git_cherry_pick ;;
2060 clean) _git_clean ;;
2061 clone) _git_clone ;;
2062 commit) _git_commit ;;
2063 config) _git_config ;;
2064 describe) _git_describe ;;
2066 difftool) _git_difftool ;;
2067 fetch) _git_fetch ;;
2068 format-patch) _git_format_patch ;;
2075 ls-files) _git_ls_files ;;
2076 ls-remote) _git_ls_remote ;;
2077 ls-tree) _git_ls_tree ;;
2079 mergetool) _git_mergetool;;
2080 merge-base) _git_merge_base ;;
2082 name-rev) _git_name_rev ;;
2085 rebase) _git_rebase ;;
2086 remote) _git_remote ;;
2087 reset) _git_reset ;;
2088 revert) _git_revert ;;
2090 send-email) _git_send_email ;;
2091 shortlog) _git_shortlog ;;
2093 show-branch) _git_show_branch ;;
2094 stash) _git_stash ;;
2096 submodule) _git_submodule ;;
2099 whatchanged) _git_log ;;
2106 __git_has_doubledash && return
2108 local cur="${COMP_WORDS[COMP_CWORD]}"
2109 local g="$(__gitdir)"
2111 if [ -f "$g/MERGE_HEAD" ]; then
2117 $__git_log_common_options
2118 $__git_log_gitk_options
2124 __git_complete_revlist
2127 complete -o bashdefault -o default -o nospace -F _git git 2>/dev/null \
2128 || complete -o default -o nospace -F _git git
2129 complete -o bashdefault -o default -o nospace -F _gitk gitk 2>/dev/null \
2130 || complete -o default -o nospace -F _gitk gitk
2132 # The following are necessary only for Cygwin, and only are needed
2133 # when the user has tab-completed the executable name and consequently
2134 # included the '.exe' suffix.
2136 if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
2137 complete -o bashdefault -o default -o nospace -F _git git.exe 2>/dev/null \
2138 || complete -o default -o nospace -F _git git.exe