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.
43 # You can also see if currently something is stashed, by setting
44 # GIT_PS1_SHOWSTASHSTATE to a nonempty value. If something is stashed,
45 # then a '$' will be shown next to the branch name.
47 # If you would like to see if there're untracked files, then you can
48 # set GIT_PS1_SHOWUNTRACKEDFILES to a nonempty value. If there're
49 # untracked files, then a '%' will be shown next to the branch name.
53 # *) Read Documentation/SubmittingPatches
54 # *) Send all patches to the current maintainer:
56 # "Shawn O. Pearce" <spearce@spearce.org>
58 # *) Always CC the Git mailing list:
63 case "$COMP_WORDBREAKS" in
65 *) COMP_WORDBREAKS="$COMP_WORDBREAKS:"
68 # __gitdir accepts 0 or 1 arguments (i.e., location)
69 # returns location of .git repo
72 if [ -z "${1-}" ]; then
73 if [ -n "${__git_dir-}" ]; then
75 elif [ -d .git ]; then
78 git rev-parse --git-dir 2>/dev/null
80 elif [ -d "$1/.git" ]; then
87 # __git_ps1 accepts 0 or 1 arguments (i.e., format string)
88 # returns text to add to bash PS1 prompt (includes branch name)
95 if [ -f "$g/rebase-merge/interactive" ]; then
97 b="$(cat "$g/rebase-merge/head-name")"
98 elif [ -d "$g/rebase-merge" ]; then
100 b="$(cat "$g/rebase-merge/head-name")"
102 if [ -d "$g/rebase-apply" ]; then
103 if [ -f "$g/rebase-apply/rebasing" ]; then
105 elif [ -f "$g/rebase-apply/applying" ]; then
110 elif [ -f "$g/MERGE_HEAD" ]; then
112 elif [ -f "$g/BISECT_LOG" ]; then
116 b="$(git symbolic-ref HEAD 2>/dev/null)" || {
119 case "${GIT_PS1_DESCRIBE_STYLE-}" in
121 git describe --contains HEAD ;;
123 git describe --contains --all HEAD ;;
127 git describe --exact-match HEAD ;;
128 esac 2>/dev/null)" ||
130 b="$(cut -c1-7 "$g/HEAD" 2>/dev/null)..." ||
142 if [ "true" = "$(git rev-parse --is-inside-git-dir 2>/dev/null)" ]; then
143 if [ "true" = "$(git rev-parse --is-bare-repository 2>/dev/null)" ]; then
148 elif [ "true" = "$(git rev-parse --is-inside-work-tree 2>/dev/null)" ]; then
149 if [ -n "${GIT_PS1_SHOWDIRTYSTATE-}" ]; then
150 if [ "$(git config --bool bash.showDirtyState)" != "false" ]; then
151 git diff --no-ext-diff --ignore-submodules \
152 --quiet --exit-code || w="*"
153 if git rev-parse --quiet --verify HEAD >/dev/null; then
154 git diff-index --cached --quiet \
155 --ignore-submodules HEAD -- || i="+"
161 if [ -n "${GIT_PS1_SHOWSTASHSTATE-}" ]; then
162 git rev-parse --verify refs/stash >/dev/null 2>&1 && s="$"
165 if [ -n "${GIT_PS1_SHOWUNTRACKEDFILES-}" ]; then
166 if [ -n "$(git ls-files --others --exclude-standard)" ]; then
172 if [ -n "${1-}" ]; then
173 printf "$1" "$c${b##refs/heads/}$w$i$s$u$r"
175 printf " (%s)" "$c${b##refs/heads/}$w$i$s$u$r"
180 # __gitcomp_1 requires 2 arguments
183 local c IFS=' '$'\t'$'\n'
186 --*=*) printf %s$'\n' "$c$2" ;;
187 *.) printf %s$'\n' "$c$2" ;;
188 *) printf %s$'\n' "$c$2 " ;;
193 # __gitcomp accepts 1, 2, 3, or 4 arguments
194 # generates completion reply with compgen
197 local cur="${COMP_WORDS[COMP_CWORD]}"
198 if [ $# -gt 2 ]; then
207 COMPREPLY=($(compgen -P "${2-}" \
208 -W "$(__gitcomp_1 "${1-}" "${4-}")" \
214 # __git_heads accepts 0 or 1 arguments (to pass to __gitdir)
217 local cmd i is_hash=y dir="$(__gitdir "${1-}")"
218 if [ -d "$dir" ]; then
219 git --git-dir="$dir" for-each-ref --format='%(refname:short)' \
223 for i in $(git ls-remote "${1-}" 2>/dev/null); do
224 case "$is_hash,$i" in
227 n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;
228 n,*) is_hash=y; echo "$i" ;;
233 # __git_tags accepts 0 or 1 arguments (to pass to __gitdir)
236 local cmd i is_hash=y dir="$(__gitdir "${1-}")"
237 if [ -d "$dir" ]; then
238 git --git-dir="$dir" for-each-ref --format='%(refname:short)' \
242 for i in $(git ls-remote "${1-}" 2>/dev/null); do
243 case "$is_hash,$i" in
246 n,refs/tags/*) is_hash=y; echo "${i#refs/tags/}" ;;
247 n,*) is_hash=y; echo "$i" ;;
252 # __git_refs accepts 0 or 1 arguments (to pass to __gitdir)
255 local i is_hash=y dir="$(__gitdir "${1-}")"
256 local cur="${COMP_WORDS[COMP_CWORD]}" format refs
257 if [ -d "$dir" ]; then
264 if [ -e "$dir/HEAD" ]; then echo HEAD; fi
265 format="refname:short"
266 refs="refs/tags refs/heads refs/remotes"
269 git --git-dir="$dir" for-each-ref --format="%($format)" \
273 for i in $(git ls-remote "$dir" 2>/dev/null); do
274 case "$is_hash,$i" in
277 n,refs/tags/*) is_hash=y; echo "${i#refs/tags/}" ;;
278 n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;
279 n,refs/remotes/*) is_hash=y; echo "${i#refs/remotes/}" ;;
280 n,*) is_hash=y; echo "$i" ;;
285 # __git_refs2 requires 1 argument (to pass to __git_refs)
289 for i in $(__git_refs "$1"); do
294 # __git_refs_remotes requires 1 argument (to pass to ls-remote)
295 __git_refs_remotes ()
297 local cmd i is_hash=y
298 for i in $(git ls-remote "$1" 2>/dev/null); do
299 case "$is_hash,$i" in
302 echo "$i:refs/remotes/$1/${i#refs/heads/}"
306 n,refs/tags/*) is_hash=y;;
314 local i ngoff IFS=$'\n' d="$(__gitdir)"
315 shopt -q nullglob || ngoff=1
317 for i in "$d/remotes"/*; do
318 echo ${i#$d/remotes/}
320 [ "$ngoff" ] && shopt -u nullglob
321 for i in $(git --git-dir="$d" config --get-regexp 'remote\..*\.url' 2>/dev/null); do
327 __git_merge_strategies ()
329 if [ -n "${__git_merge_strategylist-}" ]; then
330 echo "$__git_merge_strategylist"
333 git merge -s help 2>&1 |
334 sed -n -e '/[Aa]vailable strategies are: /,/^$/{
342 __git_merge_strategylist=
343 __git_merge_strategylist=$(__git_merge_strategies 2>/dev/null)
345 __git_complete_file ()
347 local pfx ls ref cur="${COMP_WORDS[COMP_CWORD]}"
364 case "$COMP_WORDBREAKS" in
366 *) pfx="$ref:$pfx" ;;
370 COMPREPLY=($(compgen -P "$pfx" \
371 -W "$(git --git-dir="$(__gitdir)" ls-tree "$ls" \
372 | sed '/^100... blob /{
388 __gitcomp "$(__git_refs)"
393 __git_complete_revlist ()
395 local pfx cur="${COMP_WORDS[COMP_CWORD]}"
400 __gitcomp "$(__git_refs)" "$pfx" "$cur"
405 __gitcomp "$(__git_refs)" "$pfx" "$cur"
408 __gitcomp "$(__git_refs)"
413 __git_complete_remote_or_refspec ()
415 local cmd="${COMP_WORDS[1]}"
416 local cur="${COMP_WORDS[COMP_CWORD]}"
417 local i c=2 remote="" pfx="" lhs=1 no_complete_refspec=0
418 while [ $c -lt $COMP_CWORD ]; do
421 --all|--mirror) [ "$cmd" = "push" ] && no_complete_refspec=1 ;;
423 *) remote="$i"; break ;;
427 if [ -z "$remote" ]; then
428 __gitcomp "$(__git_remotes)"
431 if [ $no_complete_refspec = 1 ]; then
435 [ "$remote" = "." ] && remote=
438 case "$COMP_WORDBREAKS" in
440 *) pfx="${cur%%:*}:" ;;
452 if [ $lhs = 1 ]; then
453 __gitcomp "$(__git_refs2 "$remote")" "$pfx" "$cur"
455 __gitcomp "$(__git_refs)" "$pfx" "$cur"
459 if [ $lhs = 1 ]; then
460 __gitcomp "$(__git_refs "$remote")" "$pfx" "$cur"
462 __gitcomp "$(__git_refs)" "$pfx" "$cur"
466 if [ $lhs = 1 ]; then
467 __gitcomp "$(__git_refs)" "$pfx" "$cur"
469 __gitcomp "$(__git_refs "$remote")" "$pfx" "$cur"
475 __git_complete_strategy ()
477 case "${COMP_WORDS[COMP_CWORD-1]}" in
479 __gitcomp "$(__git_merge_strategies)"
482 local cur="${COMP_WORDS[COMP_CWORD]}"
485 __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
492 __git_all_commands ()
494 if [ -n "${__git_all_commandlist-}" ]; then
495 echo "$__git_all_commandlist"
499 for i in $(git help -a|egrep '^ [a-zA-Z0-9]')
502 *--*) : helper pattern;;
507 __git_all_commandlist=
508 __git_all_commandlist="$(__git_all_commands 2>/dev/null)"
510 __git_porcelain_commands ()
512 if [ -n "${__git_porcelain_commandlist-}" ]; then
513 echo "$__git_porcelain_commandlist"
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 repo-config) : deprecated;;
571 rev-list) : plumbing;;
572 rev-parse) : plumbing;;
573 runstatus) : plumbing;;
574 sh-setup) : internal;;
576 show-ref) : plumbing;;
577 send-pack) : plumbing;;
578 show-index) : plumbing;;
580 stripspace) : plumbing;;
581 symbolic-ref) : plumbing;;
582 tar-tree) : deprecated;;
583 unpack-file) : plumbing;;
584 unpack-objects) : plumbing;;
585 update-index) : plumbing;;
586 update-ref) : plumbing;;
587 update-server-info) : daemon;;
588 upload-archive) : plumbing;;
589 upload-pack) : plumbing;;
590 write-tree) : plumbing;;
592 verify-pack) : infrequent;;
593 verify-tag) : plumbing;;
598 __git_porcelain_commandlist=
599 __git_porcelain_commandlist="$(__git_porcelain_commands 2>/dev/null)"
604 for i in $(git --git-dir="$(__gitdir)" config --get-regexp "alias\..*" 2>/dev/null); do
614 # __git_aliased_command requires 1 argument
615 __git_aliased_command ()
617 local word cmdline=$(git --git-dir="$(__gitdir)" \
618 config --get "alias.$1")
619 for word in $cmdline; do
620 if [ "${word##-*}" ]; then
627 # __git_find_on_cmdline requires 1 argument
628 __git_find_on_cmdline ()
630 local word subcommand c=1
632 while [ $c -lt $COMP_CWORD ]; do
633 word="${COMP_WORDS[c]}"
634 for subcommand in $1; do
635 if [ "$subcommand" = "$word" ]; then
644 __git_has_doubledash ()
647 while [ $c -lt $COMP_CWORD ]; do
648 if [ "--" = "${COMP_WORDS[c]}" ]; then
656 __git_whitespacelist="nowarn warn error error-all fix"
660 local cur="${COMP_WORDS[COMP_CWORD]}" dir="$(__gitdir)"
661 if [ -d "$dir"/rebase-apply ]; then
662 __gitcomp "--skip --resolved --abort"
667 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
672 --3way --committer-date-is-author-date --ignore-date
673 --ignore-whitespace --ignore-space-change
674 --interactive --keep --no-utf8 --signoff --utf8
675 --whitespace= --scissors
684 local cur="${COMP_WORDS[COMP_CWORD]}"
687 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
692 --stat --numstat --summary --check --index
693 --cached --index-info --reverse --reject --unidiff-zero
694 --apply --no-add --exclude=
695 --ignore-whitespace --ignore-space-change
696 --whitespace= --inaccurate-eof --verbose
705 __git_has_doubledash && return
707 local cur="${COMP_WORDS[COMP_CWORD]}"
711 --interactive --refresh --patch --update --dry-run
712 --ignore-errors --intent-to-add
721 local cur="${COMP_WORDS[COMP_CWORD]}"
724 __gitcomp "$(git archive --list)" "" "${cur##--format=}"
728 __gitcomp "$(__git_remotes)" "" "${cur##--remote=}"
733 --format= --list --verbose
734 --prefix= --remote= --exec=
744 __git_has_doubledash && return
746 local subcommands="start bad good skip reset visualize replay log run"
747 local subcommand="$(__git_find_on_cmdline "$subcommands")"
748 if [ -z "$subcommand" ]; then
749 __gitcomp "$subcommands"
753 case "$subcommand" in
755 __gitcomp "$(__git_refs)"
765 local i c=1 only_local_ref="n" has_r="n"
767 while [ $c -lt $COMP_CWORD ]; do
770 -d|-m) only_local_ref="y" ;;
776 case "${COMP_WORDS[COMP_CWORD]}" in
779 --color --no-color --verbose --abbrev= --no-abbrev
780 --track --no-track --contains --merged --no-merged
784 if [ $only_local_ref = "y" -a $has_r = "n" ]; then
785 __gitcomp "$(__git_heads)"
787 __gitcomp "$(__git_refs)"
795 local cmd="${COMP_WORDS[2]}"
796 case "$COMP_CWORD" in
798 __gitcomp "create list-heads verify unbundle"
806 __git_complete_revlist
815 __git_has_doubledash && return
817 local cur="${COMP_WORDS[COMP_CWORD]}"
820 __gitcomp "diff3 merge" "" "${cur##--conflict=}"
824 --quiet --ours --theirs --track --no-track --merge
829 __gitcomp "$(__git_refs)"
836 __gitcomp "$(__git_refs)"
841 local cur="${COMP_WORDS[COMP_CWORD]}"
844 __gitcomp "--edit --no-commit"
847 __gitcomp "$(__git_refs)"
854 __git_has_doubledash && return
856 local cur="${COMP_WORDS[COMP_CWORD]}"
859 __gitcomp "--dry-run --quiet"
868 local cur="${COMP_WORDS[COMP_CWORD]}"
893 __git_has_doubledash && return
895 local cur="${COMP_WORDS[COMP_CWORD]}"
899 --all --author= --signoff --verify --no-verify
900 --edit --amend --include --only --interactive
910 local cur="${COMP_WORDS[COMP_CWORD]}"
914 --all --tags --contains --abbrev= --candidates=
915 --exact-match --debug --long --match --always
919 __gitcomp "$(__git_refs)"
922 __git_diff_common_options="--stat --numstat --shortstat --summary
923 --patch-with-stat --name-only --name-status --color
924 --no-color --color-words --no-renames --check
925 --full-index --binary --abbrev --diff-filter=
927 --text --ignore-space-at-eol --ignore-space-change
928 --ignore-all-space --exit-code --quiet --ext-diff
930 --no-prefix --src-prefix= --dst-prefix=
931 --inter-hunk-context=
934 --dirstat --dirstat= --dirstat-by-file
935 --dirstat-by-file= --cumulative
940 __git_has_doubledash && return
942 local cur="${COMP_WORDS[COMP_CWORD]}"
945 __gitcomp "--cached --staged --pickaxe-all --pickaxe-regex
946 --base --ours --theirs
947 $__git_diff_common_options
955 __git_mergetools_common="diffuse ecmerge emerge kdiff3 meld opendiff
956 tkdiff vimdiff gvimdiff xxdiff araxis
961 local cur="${COMP_WORDS[COMP_CWORD]}"
964 __gitcomp "$__git_mergetools_common kompare" "" "${cur##--tool=}"
975 __git_fetch_options="
976 --quiet --verbose --append --upload-pack --force --keep --depth=
982 local cur="${COMP_WORDS[COMP_CWORD]}"
985 __gitcomp "$__git_fetch_options"
989 __git_complete_remote_or_refspec
994 local cur="${COMP_WORDS[COMP_CWORD]}"
999 " "" "${cur##--thread=}"
1004 --stdout --attach --no-attach --thread --thread=
1006 --numbered --start-number
1010 --in-reply-to= --cc=
1011 --full-index --binary
1014 --no-prefix --src-prefix= --dst-prefix=
1015 --inline --suffix= --ignore-if-in-upstream
1021 __git_complete_revlist
1026 local cur="${COMP_WORDS[COMP_CWORD]}"
1030 --tags --root --unreachable --cache --no-reflogs --full
1031 --strict --verbose --lost-found
1041 local cur="${COMP_WORDS[COMP_CWORD]}"
1044 __gitcomp "--prune --aggressive"
1053 __git_has_doubledash && return
1055 local cur="${COMP_WORDS[COMP_CWORD]}"
1060 --text --ignore-case --word-regexp --invert-match
1062 --extended-regexp --basic-regexp --fixed-strings
1063 --files-with-matches --name-only
1064 --files-without-match
1067 --and --or --not --all-match
1073 __gitcomp "$(__git_refs)"
1078 local cur="${COMP_WORDS[COMP_CWORD]}"
1081 __gitcomp "--all --info --man --web"
1085 __gitcomp "$(__git_all_commands)
1086 attributes cli core-tutorial cvs-migration
1087 diffcore gitk glossary hooks ignore modules
1088 repository-layout tutorial tutorial-2
1095 local cur="${COMP_WORDS[COMP_CWORD]}"
1099 false true umask group all world everybody
1100 " "" "${cur##--shared=}"
1104 __gitcomp "--quiet --bare --template= --shared --shared="
1113 __git_has_doubledash && return
1115 local cur="${COMP_WORDS[COMP_CWORD]}"
1118 __gitcomp "--cached --deleted --modified --others --ignored
1119 --stage --directory --no-empty-directory --unmerged
1120 --killed --exclude= --exclude-from=
1121 --exclude-per-directory= --exclude-standard
1122 --error-unmatch --with-tree= --full-name
1123 --abbrev --ignored --exclude-per-directory
1133 __gitcomp "$(__git_remotes)"
1141 # Options that go well for log, shortlog and gitk
1142 __git_log_common_options="
1144 --branches --tags --remotes
1145 --first-parent --merges --no-merges
1147 --max-age= --since= --after=
1148 --min-age= --until= --before=
1150 # Options that go well for log and gitk (not shortlog)
1151 __git_log_gitk_options="
1152 --dense --sparse --full-history
1153 --simplify-merges --simplify-by-decoration
1156 # Options that go well for log and shortlog (not gitk)
1157 __git_log_shortlog_options="
1158 --author= --committer= --grep=
1162 __git_log_pretty_formats="oneline short medium full fuller email raw format:"
1163 __git_log_date_formats="relative iso8601 rfc2822 short local default raw"
1167 __git_has_doubledash && return
1169 local cur="${COMP_WORDS[COMP_CWORD]}"
1170 local g="$(git rev-parse --git-dir 2>/dev/null)"
1172 if [ -f "$g/MERGE_HEAD" ]; then
1177 __gitcomp "$__git_log_pretty_formats
1178 " "" "${cur##--pretty=}"
1182 __gitcomp "$__git_log_pretty_formats
1183 " "" "${cur##--format=}"
1187 __gitcomp "$__git_log_date_formats" "" "${cur##--date=}"
1191 __gitcomp "long short" "" "${cur##--decorate=}"
1196 $__git_log_common_options
1197 $__git_log_shortlog_options
1198 $__git_log_gitk_options
1199 --root --topo-order --date-order --reverse
1200 --follow --full-diff
1201 --abbrev-commit --abbrev=
1202 --relative-date --date=
1203 --pretty= --format= --oneline
1206 --decorate --decorate=
1208 --parents --children
1210 $__git_diff_common_options
1211 --pickaxe-all --pickaxe-regex
1216 __git_complete_revlist
1219 __git_merge_options="
1220 --no-commit --no-stat --log --no-log --squash --strategy
1221 --commit --stat --no-squash --ff --no-ff
1226 __git_complete_strategy && return
1228 local cur="${COMP_WORDS[COMP_CWORD]}"
1231 __gitcomp "$__git_merge_options"
1234 __gitcomp "$(__git_refs)"
1239 local cur="${COMP_WORDS[COMP_CWORD]}"
1242 __gitcomp "$__git_mergetools_common tortoisemerge" "" "${cur##--tool=}"
1255 __gitcomp "$(__git_refs)"
1260 local cur="${COMP_WORDS[COMP_CWORD]}"
1263 __gitcomp "--dry-run"
1272 __gitcomp "--tags --all --stdin"
1277 __git_complete_strategy && return
1279 local cur="${COMP_WORDS[COMP_CWORD]}"
1283 --rebase --no-rebase
1284 $__git_merge_options
1285 $__git_fetch_options
1290 __git_complete_remote_or_refspec
1295 local cur="${COMP_WORDS[COMP_CWORD]}"
1296 case "${COMP_WORDS[COMP_CWORD-1]}" in
1298 __gitcomp "$(__git_remotes)"
1303 __gitcomp "$(__git_remotes)" "" "${cur##--repo=}"
1308 --all --mirror --tags --dry-run --force --verbose
1309 --receive-pack= --repo=
1314 __git_complete_remote_or_refspec
1319 local cur="${COMP_WORDS[COMP_CWORD]}" dir="$(__gitdir)"
1320 if [ -d "$dir"/rebase-apply ] || [ -d "$dir"/rebase-merge ]; then
1321 __gitcomp "--continue --skip --abort"
1324 __git_complete_strategy && return
1327 __gitcomp "--onto --merge --strategy --interactive"
1330 __gitcomp "$(__git_refs)"
1333 __git_send_email_confirm_options="always never auto cc compose"
1334 __git_send_email_suppresscc_options="author self cc bodycc sob cccmd body all"
1338 local cur="${COMP_WORDS[COMP_CWORD]}"
1342 $__git_send_email_confirm_options
1343 " "" "${cur##--confirm=}"
1348 $__git_send_email_suppresscc_options
1349 " "" "${cur##--suppress-cc=}"
1353 --smtp-encryption=*)
1354 __gitcomp "ssl tls" "" "${cur##--smtp-encryption=}"
1358 __gitcomp "--annotate --bcc --cc --cc-cmd --chain-reply-to
1359 --compose --confirm= --dry-run --envelope-sender
1361 --in-reply-to --no-chain-reply-to --no-signed-off-by-cc
1362 --no-suppress-from --no-thread --quiet
1363 --signed-off-by-cc --smtp-pass --smtp-server
1364 --smtp-server-port --smtp-encryption= --smtp-user
1365 --subject --suppress-cc= --suppress-from --thread --to
1366 --validate --no-validate"
1373 __git_config_get_set_variables ()
1375 local prevword word config_file= c=$COMP_CWORD
1376 while [ $c -gt 1 ]; do
1377 word="${COMP_WORDS[c]}"
1379 --global|--system|--file=*)
1384 config_file="$word $prevword"
1392 git --git-dir="$(__gitdir)" config $config_file --list 2>/dev/null |
1405 local cur="${COMP_WORDS[COMP_CWORD]}"
1406 local prv="${COMP_WORDS[COMP_CWORD-1]}"
1409 __gitcomp "$(__git_remotes)"
1413 __gitcomp "$(__git_refs)"
1417 local remote="${prv#remote.}"
1418 remote="${remote%.fetch}"
1419 __gitcomp "$(__git_refs_remotes "$remote")"
1423 local remote="${prv#remote.}"
1424 remote="${remote%.push}"
1425 __gitcomp "$(git --git-dir="$(__gitdir)" \
1426 for-each-ref --format='%(refname):%(refname)' \
1430 pull.twohead|pull.octopus)
1431 __gitcomp "$(__git_merge_strategies)"
1434 color.branch|color.diff|color.interactive|\
1435 color.showbranch|color.status|color.ui)
1436 __gitcomp "always never auto"
1440 __gitcomp "false true"
1445 normal black red green yellow blue magenta cyan white
1446 bold dim ul blink reverse
1451 __gitcomp "man info web html"
1455 __gitcomp "$__git_log_date_formats"
1458 sendemail.aliasesfiletype)
1459 __gitcomp "mutt mailrc pine elm gnus"
1463 __gitcomp "$__git_send_email_confirm_options"
1466 sendemail.suppresscc)
1467 __gitcomp "$__git_send_email_suppresscc_options"
1470 --get|--get-all|--unset|--unset-all)
1471 __gitcomp "$(__git_config_get_set_variables)"
1482 --global --system --file=
1483 --list --replace-all
1484 --get --get-all --get-regexp
1485 --add --unset --unset-all
1486 --remove-section --rename-section
1491 local pfx="${cur%.*}."
1493 __gitcomp "remote merge mergeoptions rebase" "$pfx" "$cur"
1497 local pfx="${cur%.*}."
1499 __gitcomp "$(__git_heads)" "$pfx" "$cur" "."
1503 local pfx="${cur%.*}."
1506 argprompt cmd confirm needsfile noconsole norescan
1507 prompt revprompt revunmerged title
1512 local pfx="${cur%.*}."
1514 __gitcomp "cmd path" "$pfx" "$cur"
1518 local pfx="${cur%.*}."
1520 __gitcomp "cmd path" "$pfx" "$cur"
1524 local pfx="${cur%.*}."
1526 __gitcomp "cmd path trustExitCode" "$pfx" "$cur"
1530 local pfx="${cur%.*}."
1532 __gitcomp "$(__git_all_commands)" "$pfx" "$cur"
1536 local pfx="${cur%.*}."
1539 url proxy fetch push mirror skipDefaultUpdate
1540 receivepack uploadpack tagopt pushurl
1545 local pfx="${cur%.*}."
1547 __gitcomp "$(__git_remotes)" "$pfx" "$cur" "."
1551 local pfx="${cur%.*}."
1553 __gitcomp "insteadOf pushInsteadOf" "$pfx" "$cur"
1560 apply.ignorewhitespace
1562 branch.autosetupmerge
1563 branch.autosetuprebase
1566 color.branch.current
1577 color.diff.whitespace
1582 color.interactive.header
1583 color.interactive.help
1584 color.interactive.prompt
1589 color.status.changed
1591 color.status.nobranch
1592 color.status.untracked
1593 color.status.updated
1600 core.deltaBaseCacheLimit
1604 core.fsyncobjectfiles
1606 core.ignoreCygwinFSTricks
1608 core.logAllRefUpdates
1609 core.loosecompression
1611 core.packedGitWindowSize
1613 core.preferSymlinkRefs
1616 core.repositoryFormatVersion
1618 core.sharedRepository
1621 core.warnAmbiguousRefs
1624 diff.autorefreshindex
1630 diff.suppressBlankEmpty
1642 format.subjectprefix
1651 gc.reflogexpireunreachable
1655 gitcvs.commitmsgannotation
1656 gitcvs.dbTableNamePrefix
1667 gui.copyblamethreshold
1671 gui.matchtrackingbranch
1672 gui.newbranchtemplate
1673 gui.pruneduringfetch
1674 gui.spellingdictionary
1690 i18n.logOutputEncoding
1695 imap.preformattedHTML
1704 interactive.singlekey
1717 mergetool.keepBackup
1720 pack.deltaCacheLimit
1733 receive.denyCurrentBranch
1735 receive.denyNonFastForwards
1738 repack.usedeltabaseoffset
1741 sendemail.aliasesfile
1742 sendemail.aliasesfiletype
1746 sendemail.chainreplyto
1748 sendemail.envelopesender
1750 sendemail.signedoffbycc
1751 sendemail.smtpencryption
1753 sendemail.smtpserver
1754 sendemail.smtpserverport
1756 sendemail.suppresscc
1757 sendemail.suppressfrom
1762 status.relativePaths
1763 status.showUntrackedFiles
1765 transfer.unpackLimit
1777 local subcommands="add rename rm show prune update set-head"
1778 local subcommand="$(__git_find_on_cmdline "$subcommands")"
1779 if [ -z "$subcommand" ]; then
1780 __gitcomp "$subcommands"
1784 case "$subcommand" in
1785 rename|rm|show|prune)
1786 __gitcomp "$(__git_remotes)"
1789 local i c='' IFS=$'\n'
1790 for i in $(git --git-dir="$(__gitdir)" config --get-regexp "remotes\..*" 2>/dev/null); do
1804 __gitcomp "$(__git_refs)"
1809 __git_has_doubledash && return
1811 local cur="${COMP_WORDS[COMP_CWORD]}"
1814 __gitcomp "--merge --mixed --hard --soft --patch"
1818 __gitcomp "$(__git_refs)"
1823 local cur="${COMP_WORDS[COMP_CWORD]}"
1826 __gitcomp "--edit --mainline --no-edit --no-commit --signoff"
1830 __gitcomp "$(__git_refs)"
1835 __git_has_doubledash && return
1837 local cur="${COMP_WORDS[COMP_CWORD]}"
1840 __gitcomp "--cached --dry-run --ignore-unmatch --quiet"
1849 __git_has_doubledash && return
1851 local cur="${COMP_WORDS[COMP_CWORD]}"
1855 $__git_log_common_options
1856 $__git_log_shortlog_options
1857 --numbered --summary
1862 __git_complete_revlist
1867 __git_has_doubledash && return
1869 local cur="${COMP_WORDS[COMP_CWORD]}"
1872 __gitcomp "$__git_log_pretty_formats
1873 " "" "${cur##--pretty=}"
1877 __gitcomp "$__git_log_pretty_formats
1878 " "" "${cur##--format=}"
1882 __gitcomp "--pretty= --format= --abbrev-commit --oneline
1883 $__git_diff_common_options
1893 local cur="${COMP_WORDS[COMP_CWORD]}"
1897 --all --remotes --topo-order --current --more=
1898 --list --independent --merge-base --no-name
1900 --sha1-name --sparse --topics --reflog
1905 __git_complete_revlist
1910 local cur="${COMP_WORDS[COMP_CWORD]}"
1911 local save_opts='--keep-index --no-keep-index --quiet --patch'
1912 local subcommands='save list show apply clear drop pop create branch'
1913 local subcommand="$(__git_find_on_cmdline "$subcommands")"
1914 if [ -z "$subcommand" ]; then
1917 __gitcomp "$save_opts"
1920 if [ -z "$(__git_find_on_cmdline "$save_opts")" ]; then
1921 __gitcomp "$subcommands"
1928 case "$subcommand,$cur" in
1930 __gitcomp "$save_opts"
1933 __gitcomp "--index --quiet"
1935 show,--*|drop,--*|branch,--*)
1938 show,*|apply,*|drop,*|pop,*|branch,*)
1939 __gitcomp "$(git --git-dir="$(__gitdir)" stash list \
1940 | sed -n -e 's/:.*//p')"
1951 __git_has_doubledash && return
1953 local subcommands="add status init update summary foreach sync"
1954 if [ -z "$(__git_find_on_cmdline "$subcommands")" ]; then
1955 local cur="${COMP_WORDS[COMP_CWORD]}"
1958 __gitcomp "--quiet --cached"
1961 __gitcomp "$subcommands"
1971 init fetch clone rebase dcommit log find-rev
1972 set-tree commit-diff info create-ignore propget
1973 proplist show-ignore show-externals branch tag blame
1976 local subcommand="$(__git_find_on_cmdline "$subcommands")"
1977 if [ -z "$subcommand" ]; then
1978 __gitcomp "$subcommands"
1980 local remote_opts="--username= --config-dir= --no-auth-cache"
1982 --follow-parent --authors-file= --repack=
1983 --no-metadata --use-svm-props --use-svnsync-props
1984 --log-window-size= --no-checkout --quiet
1985 --repack-flags --use-log-author --localtime
1986 --ignore-paths= $remote_opts
1989 --template= --shared= --trunk= --tags=
1990 --branches= --stdlayout --minimize-url
1991 --no-metadata --use-svm-props --use-svnsync-props
1992 --rewrite-root= --prefix= --use-log-author
1993 --add-author-from $remote_opts
1996 --edit --rmdir --find-copies-harder --copy-similarity=
1999 local cur="${COMP_WORDS[COMP_CWORD]}"
2000 case "$subcommand,$cur" in
2002 __gitcomp "--revision= --fetch-all $fc_opts"
2005 __gitcomp "--revision= $fc_opts $init_opts"
2008 __gitcomp "$init_opts"
2012 --merge --strategy= --verbose --dry-run
2013 --fetch-all --no-rebase --commit-url
2014 --revision $cmt_opts $fc_opts
2018 __gitcomp "--stdin $cmt_opts $fc_opts"
2020 create-ignore,--*|propget,--*|proplist,--*|show-ignore,--*|\
2022 __gitcomp "--revision="
2026 --limit= --revision= --verbose --incremental
2027 --oneline --show-commit --non-recursive
2028 --authors-file= --color
2033 --merge --verbose --strategy= --local
2034 --fetch-all --dry-run $fc_opts
2038 __gitcomp "--message= --file= --revision= $cmt_opts"
2044 __gitcomp "--dry-run --message --tag"
2047 __gitcomp "--dry-run --message"
2050 __gitcomp "--git-format"
2054 --config-dir= --ignore-paths= --minimize
2055 --no-auth-cache --username=
2068 while [ $c -lt $COMP_CWORD ]; do
2069 i="${COMP_WORDS[c]}"
2072 __gitcomp "$(__git_tags)"
2082 case "${COMP_WORDS[COMP_CWORD-1]}" in
2088 __gitcomp "$(__git_tags)"
2094 __gitcomp "$(__git_refs)"
2101 local i c=1 command __git_dir
2103 while [ $c -lt $COMP_CWORD ]; do
2104 i="${COMP_WORDS[c]}"
2106 --git-dir=*) __git_dir="${i#--git-dir=}" ;;
2107 --bare) __git_dir="." ;;
2108 --version|-p|--paginate) ;;
2109 --help) command="help"; break ;;
2110 *) command="$i"; break ;;
2115 if [ -z "$command" ]; then
2116 case "${COMP_WORDS[COMP_CWORD]}" in
2129 *) __gitcomp "$(__git_porcelain_commands) $(__git_aliases)" ;;
2134 local expansion=$(__git_aliased_command "$command")
2135 [ "$expansion" ] && command="$expansion"
2140 apply) _git_apply ;;
2141 archive) _git_archive ;;
2142 bisect) _git_bisect ;;
2143 bundle) _git_bundle ;;
2144 branch) _git_branch ;;
2145 checkout) _git_checkout ;;
2146 cherry) _git_cherry ;;
2147 cherry-pick) _git_cherry_pick ;;
2148 clean) _git_clean ;;
2149 clone) _git_clone ;;
2150 commit) _git_commit ;;
2151 config) _git_config ;;
2152 describe) _git_describe ;;
2154 difftool) _git_difftool ;;
2155 fetch) _git_fetch ;;
2156 format-patch) _git_format_patch ;;
2163 ls-files) _git_ls_files ;;
2164 ls-remote) _git_ls_remote ;;
2165 ls-tree) _git_ls_tree ;;
2167 mergetool) _git_mergetool;;
2168 merge-base) _git_merge_base ;;
2170 name-rev) _git_name_rev ;;
2173 rebase) _git_rebase ;;
2174 remote) _git_remote ;;
2175 replace) _git_replace ;;
2176 reset) _git_reset ;;
2177 revert) _git_revert ;;
2179 send-email) _git_send_email ;;
2180 shortlog) _git_shortlog ;;
2182 show-branch) _git_show_branch ;;
2183 stash) _git_stash ;;
2185 submodule) _git_submodule ;;
2188 whatchanged) _git_log ;;
2195 __git_has_doubledash && return
2197 local cur="${COMP_WORDS[COMP_CWORD]}"
2198 local g="$(__gitdir)"
2200 if [ -f "$g/MERGE_HEAD" ]; then
2206 $__git_log_common_options
2207 $__git_log_gitk_options
2213 __git_complete_revlist
2216 complete -o bashdefault -o default -o nospace -F _git git 2>/dev/null \
2217 || complete -o default -o nospace -F _git git
2218 complete -o bashdefault -o default -o nospace -F _gitk gitk 2>/dev/null \
2219 || complete -o default -o nospace -F _gitk gitk
2221 # The following are necessary only for Cygwin, and only are needed
2222 # when the user has tab-completed the executable name and consequently
2223 # included the '.exe' suffix.
2225 if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
2226 complete -o bashdefault -o default -o nospace -F _git git.exe 2>/dev/null \
2227 || complete -o default -o nospace -F _git git.exe