3 # bash/zsh 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) Add the following line to your .bashrc/.zshrc:
22 # source ~/.git-completion.sh
23 # 3) Consider changing your PS1 to also show the current branch,
24 # see git-prompt.sh for details.
26 if [[ -n ${ZSH_VERSION-} ]]; then
27 autoload -U +X bashcompinit && bashcompinit
30 case "$COMP_WORDBREAKS" in
32 *) COMP_WORDBREAKS="$COMP_WORDBREAKS:"
35 # __gitdir accepts 0 or 1 arguments (i.e., location)
36 # returns location of .git repo
39 # Note: this function is duplicated in git-prompt.sh
40 # When updating it, make sure you update the other one to match.
41 if [ -z "${1-}" ]; then
42 if [ -n "${__git_dir-}" ]; then
44 elif [ -n "${GIT_DIR-}" ]; then
45 test -d "${GIT_DIR-}" || return 1
47 elif [ -d .git ]; then
50 git rev-parse --git-dir 2>/dev/null
52 elif [ -d "$1/.git" ]; then
72 # The following function is based on code from:
74 # bash_completion - programmable completion functions for bash 3.2+
76 # Copyright © 2006-2008, Ian Macdonald <ian@caliban.org>
77 # © 2009-2010, Bash Completion Maintainers
78 # <bash-completion-devel@lists.alioth.debian.org>
80 # This program is free software; you can redistribute it and/or modify
81 # it under the terms of the GNU General Public License as published by
82 # the Free Software Foundation; either version 2, or (at your option)
85 # This program is distributed in the hope that it will be useful,
86 # but WITHOUT ANY WARRANTY; without even the implied warranty of
87 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
88 # GNU General Public License for more details.
90 # You should have received a copy of the GNU General Public License
91 # along with this program; if not, write to the Free Software Foundation,
92 # Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
94 # The latest version of this software can be obtained here:
96 # http://bash-completion.alioth.debian.org/
100 # This function can be used to access a tokenized list of words
101 # on the command line:
103 # __git_reassemble_comp_words_by_ref '=:'
104 # if test "${words_[cword_-1]}" = -w
109 # The argument should be a collection of characters from the list of
110 # word completion separators (COMP_WORDBREAKS) to treat as ordinary
113 # This is roughly equivalent to going back in time and setting
114 # COMP_WORDBREAKS to exclude those characters. The intent is to
115 # make option types like --date=<type> and <rev>:<path> easy to
116 # recognize by treating each shell word as a single token.
118 # It is best not to set COMP_WORDBREAKS directly because the value is
119 # shared with other completion scripts. By the time the completion
120 # function gets called, COMP_WORDS has already been populated so local
121 # changes to COMP_WORDBREAKS have no effect.
123 # Output: words_, cword_, cur_.
125 __git_reassemble_comp_words_by_ref()
127 local exclude i j first
128 # Which word separators to exclude?
129 exclude="${1//[^$COMP_WORDBREAKS]}"
131 if [ -z "$exclude" ]; then
132 words_=("${COMP_WORDS[@]}")
135 # List of word completion separators has shrunk;
136 # re-assemble words to complete.
137 for ((i=0, j=0; i < ${#COMP_WORDS[@]}; i++, j++)); do
138 # Append each nonempty word consisting of just
139 # word separator characters to the current word.
143 [ -n "${COMP_WORDS[$i]}" ] &&
144 # word consists of excluded word separators
145 [ "${COMP_WORDS[$i]//[^$exclude]}" = "${COMP_WORDS[$i]}" ]
147 # Attach to the previous token,
148 # unless the previous token is the command name.
149 if [ $j -ge 2 ] && [ -n "$first" ]; then
153 words_[$j]=${words_[j]}${COMP_WORDS[i]}
154 if [ $i = $COMP_CWORD ]; then
157 if (($i < ${#COMP_WORDS[@]} - 1)); then
164 words_[$j]=${words_[j]}${COMP_WORDS[i]}
165 if [ $i = $COMP_CWORD ]; then
171 if ! type _get_comp_words_by_ref >/dev/null 2>&1; then
172 if [[ -z ${ZSH_VERSION:+set} ]]; then
173 _get_comp_words_by_ref ()
175 local exclude cur_ words_ cword_
176 if [ "$1" = "-n" ]; then
180 __git_reassemble_comp_words_by_ref "$exclude"
181 cur_=${words_[cword_]}
182 while [ $# -gt 0 ]; do
188 prev=${words_[$cword_-1]}
191 words=("${words_[@]}")
201 _get_comp_words_by_ref ()
203 while [ $# -gt 0 ]; do
206 cur=${COMP_WORDS[COMP_CWORD]}
209 prev=${COMP_WORDS[COMP_CWORD-1]}
212 words=("${COMP_WORDS[@]}")
218 # assume COMP_WORDBREAKS is already set sanely
228 # Generates completion reply with compgen, appending a space to possible
229 # completion words, if necessary.
230 # It accepts 1 to 4 arguments:
231 # 1: List of possible completion words.
232 # 2: A prefix to be added to each possible completion word (optional).
233 # 3: Generate possible completion matches for this word (optional).
234 # 4: A suffix to be appended to each possible completion word (optional).
237 local cur_="${3-$cur}"
245 COMPREPLY=($(compgen -P "${2-}" \
246 -W "$(__gitcomp_1 "${1-}" "${4-}")" \
252 # Generates completion reply with compgen from newline-separated possible
253 # completion words by appending a space to all of them.
254 # It accepts 1 to 4 arguments:
255 # 1: List of possible completion words, separated by a single newline.
256 # 2: A prefix to be added to each possible completion word (optional).
257 # 3: Generate possible completion matches for this word (optional).
258 # 4: A suffix to be appended to each possible completion word instead of
259 # the default space (optional). If specified but empty, nothing is
264 COMPREPLY=($(compgen -P "${2-}" -S "${4- }" -W "$1" -- "${3-$cur}"))
269 local dir="$(__gitdir)"
270 if [ -d "$dir" ]; then
271 git --git-dir="$dir" for-each-ref --format='%(refname:short)' \
279 local dir="$(__gitdir)"
280 if [ -d "$dir" ]; then
281 git --git-dir="$dir" for-each-ref --format='%(refname:short)' \
287 # __git_refs accepts 0, 1 (to pass to __gitdir), or 2 arguments
288 # presence of 2nd argument means use the guess heuristic employed
289 # by checkout for tracking branches
292 local i hash dir="$(__gitdir "${1-}")" track="${2-}"
294 if [ -d "$dir" ]; then
302 for i in HEAD FETCH_HEAD ORIG_HEAD MERGE_HEAD; do
303 if [ -e "$dir/$i" ]; then echo $i; fi
305 format="refname:short"
306 refs="refs/tags refs/heads refs/remotes"
309 git --git-dir="$dir" for-each-ref --format="%($format)" \
311 if [ -n "$track" ]; then
312 # employ the heuristic used by git checkout
313 # Try to find a remote branch that matches the completion word
314 # but only output if the branch name is unique
316 git --git-dir="$dir" for-each-ref --shell --format="ref=%(refname:short)" \
318 while read -r entry; do
321 if [[ "$ref" == "$cur"* ]]; then
330 git ls-remote "$dir" "$cur*" 2>/dev/null | \
331 while read -r hash i; do
339 git ls-remote "$dir" HEAD ORIG_HEAD 'refs/tags/*' 'refs/heads/*' 'refs/remotes/*' 2>/dev/null | \
340 while read -r hash i; do
343 refs/*) echo "${i#refs/*/}" ;;
351 # __git_refs2 requires 1 argument (to pass to __git_refs)
355 for i in $(__git_refs "$1"); do
360 # __git_refs_remotes requires 1 argument (to pass to ls-remote)
361 __git_refs_remotes ()
364 git ls-remote "$1" 'refs/heads/*' 2>/dev/null | \
365 while read -r hash i; do
366 echo "$i:refs/remotes/$1/${i#refs/heads/}"
372 local i IFS=$'\n' d="$(__gitdir)"
373 test -d "$d/remotes" && ls -1 "$d/remotes"
374 for i in $(git --git-dir="$d" config --get-regexp 'remote\..*\.url' 2>/dev/null); do
380 __git_list_merge_strategies ()
382 git merge -s help 2>&1 |
383 sed -n -e '/[Aa]vailable strategies are: /,/^$/{
392 __git_merge_strategies=
393 # 'git merge -s help' (and thus detection of the merge strategy
394 # list) fails, unfortunately, if run outside of any git working
395 # tree. __git_merge_strategies is set to the empty string in
396 # that case, and the detection will be repeated the next time it
398 __git_compute_merge_strategies ()
400 test -n "$__git_merge_strategies" ||
401 __git_merge_strategies=$(__git_list_merge_strategies)
404 __git_complete_revlist_file ()
406 local pfx ls ref cur_="$cur"
426 case "$COMP_WORDBREAKS" in
428 *) pfx="$ref:$pfx" ;;
431 __gitcomp_nl "$(git --git-dir="$(__gitdir)" ls-tree "$ls" \
432 | sed '/^100... blob /{
448 pfx="${cur_%...*}..."
450 __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
455 __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
458 __gitcomp_nl "$(__git_refs)"
464 __git_complete_file ()
466 __git_complete_revlist_file
469 __git_complete_revlist ()
471 __git_complete_revlist_file
474 __git_complete_remote_or_refspec ()
476 local cur_="$cur" cmd="${words[1]}"
477 local i c=2 remote="" pfx="" lhs=1 no_complete_refspec=0
478 if [ "$cmd" = "remote" ]; then
481 while [ $c -lt $cword ]; do
484 --mirror) [ "$cmd" = "push" ] && no_complete_refspec=1 ;;
487 push) no_complete_refspec=1 ;;
496 *) remote="$i"; break ;;
500 if [ -z "$remote" ]; then
501 __gitcomp_nl "$(__git_remotes)"
504 if [ $no_complete_refspec = 1 ]; then
508 [ "$remote" = "." ] && remote=
511 case "$COMP_WORDBREAKS" in
513 *) pfx="${cur_%%:*}:" ;;
525 if [ $lhs = 1 ]; then
526 __gitcomp_nl "$(__git_refs2 "$remote")" "$pfx" "$cur_"
528 __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
532 if [ $lhs = 1 ]; then
533 __gitcomp_nl "$(__git_refs "$remote")" "$pfx" "$cur_"
535 __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
539 if [ $lhs = 1 ]; then
540 __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
542 __gitcomp_nl "$(__git_refs "$remote")" "$pfx" "$cur_"
548 __git_complete_strategy ()
550 __git_compute_merge_strategies
553 __gitcomp "$__git_merge_strategies"
558 __gitcomp "$__git_merge_strategies" "" "${cur##--strategy=}"
565 __git_list_all_commands ()
568 for i in $(git help -a|egrep '^ [a-zA-Z0-9]')
571 *--*) : helper pattern;;
578 __git_compute_all_commands ()
580 test -n "$__git_all_commands" ||
581 __git_all_commands=$(__git_list_all_commands)
584 __git_list_porcelain_commands ()
587 __git_compute_all_commands
588 for i in "help" $__git_all_commands
591 *--*) : helper pattern;;
592 applymbox) : ask gittus;;
593 applypatch) : ask gittus;;
594 archimport) : import;;
595 cat-file) : plumbing;;
596 check-attr) : plumbing;;
597 check-ref-format) : plumbing;;
598 checkout-index) : plumbing;;
599 commit-tree) : plumbing;;
600 count-objects) : infrequent;;
601 credential-cache) : credentials helper;;
602 credential-store) : credentials helper;;
603 cvsexportcommit) : export;;
604 cvsimport) : import;;
605 cvsserver) : daemon;;
607 diff-files) : plumbing;;
608 diff-index) : plumbing;;
609 diff-tree) : plumbing;;
610 fast-import) : import;;
611 fast-export) : export;;
612 fsck-objects) : plumbing;;
613 fetch-pack) : plumbing;;
614 fmt-merge-msg) : plumbing;;
615 for-each-ref) : plumbing;;
616 hash-object) : plumbing;;
617 http-*) : transport;;
618 index-pack) : plumbing;;
619 init-db) : deprecated;;
620 local-fetch) : plumbing;;
621 lost-found) : infrequent;;
622 ls-files) : plumbing;;
623 ls-remote) : plumbing;;
624 ls-tree) : plumbing;;
625 mailinfo) : plumbing;;
626 mailsplit) : plumbing;;
627 merge-*) : plumbing;;
630 pack-objects) : plumbing;;
631 pack-redundant) : plumbing;;
632 pack-refs) : plumbing;;
633 parse-remote) : plumbing;;
634 patch-id) : plumbing;;
635 peek-remote) : plumbing;;
637 prune-packed) : plumbing;;
638 quiltimport) : import;;
639 read-tree) : plumbing;;
640 receive-pack) : plumbing;;
641 remote-*) : transport;;
642 repo-config) : deprecated;;
644 rev-list) : plumbing;;
645 rev-parse) : plumbing;;
646 runstatus) : plumbing;;
647 sh-setup) : internal;;
649 show-ref) : plumbing;;
650 send-pack) : plumbing;;
651 show-index) : plumbing;;
653 stripspace) : plumbing;;
654 symbolic-ref) : plumbing;;
655 tar-tree) : deprecated;;
656 unpack-file) : plumbing;;
657 unpack-objects) : plumbing;;
658 update-index) : plumbing;;
659 update-ref) : plumbing;;
660 update-server-info) : daemon;;
661 upload-archive) : plumbing;;
662 upload-pack) : plumbing;;
663 write-tree) : plumbing;;
665 verify-pack) : infrequent;;
666 verify-tag) : plumbing;;
672 __git_porcelain_commands=
673 __git_compute_porcelain_commands ()
675 __git_compute_all_commands
676 test -n "$__git_porcelain_commands" ||
677 __git_porcelain_commands=$(__git_list_porcelain_commands)
680 __git_pretty_aliases ()
683 for i in $(git --git-dir="$(__gitdir)" config --get-regexp "pretty\..*" 2>/dev/null); do
696 for i in $(git --git-dir="$(__gitdir)" config --get-regexp "alias\..*" 2>/dev/null); do
706 # __git_aliased_command requires 1 argument
707 __git_aliased_command ()
709 local word cmdline=$(git --git-dir="$(__gitdir)" \
710 config --get "alias.$1")
711 for word in $cmdline; do
717 \!*) : shell command alias ;;
719 *=*) : setting env ;;
728 # __git_find_on_cmdline requires 1 argument
729 __git_find_on_cmdline ()
731 local word subcommand c=1
732 while [ $c -lt $cword ]; do
734 for subcommand in $1; do
735 if [ "$subcommand" = "$word" ]; then
744 __git_has_doubledash ()
747 while [ $c -lt $cword ]; do
748 if [ "--" = "${words[c]}" ]; then
756 __git_whitespacelist="nowarn warn error error-all fix"
760 local dir="$(__gitdir)"
761 if [ -d "$dir"/rebase-apply ]; then
762 __gitcomp "--skip --continue --resolved --abort"
767 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
772 --3way --committer-date-is-author-date --ignore-date
773 --ignore-whitespace --ignore-space-change
774 --interactive --keep --no-utf8 --signoff --utf8
775 --whitespace= --scissors
786 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
791 --stat --numstat --summary --check --index
792 --cached --index-info --reverse --reject --unidiff-zero
793 --apply --no-add --exclude=
794 --ignore-whitespace --ignore-space-change
795 --whitespace= --inaccurate-eof --verbose
804 __git_has_doubledash && return
809 --interactive --refresh --patch --update --dry-run
810 --ignore-errors --intent-to-add
821 __gitcomp "$(git archive --list)" "" "${cur##--format=}"
825 __gitcomp_nl "$(__git_remotes)" "" "${cur##--remote=}"
830 --format= --list --verbose
831 --prefix= --remote= --exec=
841 __git_has_doubledash && return
843 local subcommands="start bad good skip reset visualize replay log run"
844 local subcommand="$(__git_find_on_cmdline "$subcommands")"
845 if [ -z "$subcommand" ]; then
846 if [ -f "$(__gitdir)"/BISECT_START ]; then
847 __gitcomp "$subcommands"
849 __gitcomp "replay start"
854 case "$subcommand" in
855 bad|good|reset|skip|start)
856 __gitcomp_nl "$(__git_refs)"
866 local i c=1 only_local_ref="n" has_r="n"
868 while [ $c -lt $cword ]; do
871 -d|-m) only_local_ref="y" ;;
880 --color --no-color --verbose --abbrev= --no-abbrev
881 --track --no-track --contains --merged --no-merged
882 --set-upstream --edit-description --list
886 if [ $only_local_ref = "y" -a $has_r = "n" ]; then
887 __gitcomp_nl "$(__git_heads)"
889 __gitcomp_nl "$(__git_refs)"
897 local cmd="${words[2]}"
900 __gitcomp "create list-heads verify unbundle"
908 __git_complete_revlist
917 __git_has_doubledash && return
921 __gitcomp "diff3 merge" "" "${cur##--conflict=}"
925 --quiet --ours --theirs --track --no-track --merge
926 --conflict= --orphan --patch
930 # check if --track, --no-track, or --no-guess was specified
931 # if so, disable DWIM mode
932 local flags="--track --no-track --no-guess" track=1
933 if [ -n "$(__git_find_on_cmdline "$flags")" ]; then
936 __gitcomp_nl "$(__git_refs '' $track)"
943 __gitcomp "$(__git_refs)"
950 __gitcomp "--edit --no-commit"
953 __gitcomp_nl "$(__git_refs)"
960 __git_has_doubledash && return
964 __gitcomp "--dry-run --quiet"
997 __git_has_doubledash && return
1001 __gitcomp "default strip verbatim whitespace
1002 " "" "${cur##--cleanup=}"
1005 --reuse-message=*|--reedit-message=*|\
1006 --fixup=*|--squash=*)
1007 __gitcomp_nl "$(__git_refs)" "" "${cur#*=}"
1010 --untracked-files=*)
1011 __gitcomp "all no normal" "" "${cur##--untracked-files=}"
1016 --all --author= --signoff --verify --no-verify
1018 --amend --include --only --interactive
1019 --dry-run --reuse-message= --reedit-message=
1020 --reset-author --file= --message= --template=
1021 --cleanup= --untracked-files --untracked-files=
1022 --verbose --quiet --fixup= --squash=
1034 --all --tags --contains --abbrev= --candidates=
1035 --exact-match --debug --long --match --always
1039 __gitcomp_nl "$(__git_refs)"
1042 __git_diff_common_options="--stat --numstat --shortstat --summary
1043 --patch-with-stat --name-only --name-status --color
1044 --no-color --color-words --no-renames --check
1045 --full-index --binary --abbrev --diff-filter=
1046 --find-copies-harder
1047 --text --ignore-space-at-eol --ignore-space-change
1048 --ignore-all-space --exit-code --quiet --ext-diff
1050 --no-prefix --src-prefix= --dst-prefix=
1051 --inter-hunk-context=
1054 --dirstat --dirstat= --dirstat-by-file
1055 --dirstat-by-file= --cumulative
1060 __git_has_doubledash && return
1064 __gitcomp "--cached --staged --pickaxe-all --pickaxe-regex
1065 --base --ours --theirs --no-index
1066 $__git_diff_common_options
1071 __git_complete_revlist_file
1074 __git_mergetools_common="diffuse ecmerge emerge kdiff3 meld opendiff
1075 tkdiff vimdiff gvimdiff xxdiff araxis p4merge bc3
1080 __git_has_doubledash && return
1084 __gitcomp "$__git_mergetools_common kompare" "" "${cur##--tool=}"
1088 __gitcomp "--cached --staged --pickaxe-all --pickaxe-regex
1089 --base --ours --theirs
1090 --no-renames --diff-filter= --find-copies-harder
1091 --relative --ignore-submodules
1099 __git_fetch_options="
1100 --quiet --verbose --append --upload-pack --force --keep --depth=
1101 --tags --no-tags --all --prune --dry-run
1108 __gitcomp "$__git_fetch_options"
1112 __git_complete_remote_or_refspec
1115 _git_format_patch ()
1121 " "" "${cur##--thread=}"
1126 --stdout --attach --no-attach --thread --thread=
1128 --numbered --start-number
1131 --signoff --signature --no-signature
1132 --in-reply-to= --cc=
1133 --full-index --binary
1136 --no-prefix --src-prefix= --dst-prefix=
1137 --inline --suffix= --ignore-if-in-upstream
1143 __git_complete_revlist
1151 --tags --root --unreachable --cache --no-reflogs --full
1152 --strict --verbose --lost-found
1164 __gitcomp "--prune --aggressive"
1176 __git_match_ctag() {
1177 awk "/^${1////\\/}/ { print \$1 }" "$2"
1182 __git_has_doubledash && return
1188 --text --ignore-case --word-regexp --invert-match
1189 --full-name --line-number
1190 --extended-regexp --basic-regexp --fixed-strings
1192 --files-with-matches --name-only
1193 --files-without-match
1196 --and --or --not --all-match
1202 case "$cword,$prev" in
1204 if test -r tags; then
1205 __gitcomp_nl "$(__git_match_ctag "$cur" tags)"
1211 __gitcomp_nl "$(__git_refs)"
1218 __gitcomp "--all --info --man --web"
1222 __git_compute_all_commands
1223 __gitcomp "$__git_all_commands $(__git_aliases)
1224 attributes cli core-tutorial cvs-migration
1225 diffcore gitk glossary hooks ignore modules
1226 namespaces repository-layout tutorial tutorial-2
1236 false true umask group all world everybody
1237 " "" "${cur##--shared=}"
1241 __gitcomp "--quiet --bare --template= --shared --shared="
1250 __git_has_doubledash && return
1254 __gitcomp "--cached --deleted --modified --others --ignored
1255 --stage --directory --no-empty-directory --unmerged
1256 --killed --exclude= --exclude-from=
1257 --exclude-per-directory= --exclude-standard
1258 --error-unmatch --with-tree= --full-name
1259 --abbrev --ignored --exclude-per-directory
1269 __gitcomp_nl "$(__git_remotes)"
1277 # Options that go well for log, shortlog and gitk
1278 __git_log_common_options="
1280 --branches --tags --remotes
1281 --first-parent --merges --no-merges
1283 --max-age= --since= --after=
1284 --min-age= --until= --before=
1285 --min-parents= --max-parents=
1286 --no-min-parents --no-max-parents
1288 # Options that go well for log and gitk (not shortlog)
1289 __git_log_gitk_options="
1290 --dense --sparse --full-history
1291 --simplify-merges --simplify-by-decoration
1292 --left-right --notes --no-notes
1294 # Options that go well for log and shortlog (not gitk)
1295 __git_log_shortlog_options="
1296 --author= --committer= --grep=
1300 __git_log_pretty_formats="oneline short medium full fuller email raw format:"
1301 __git_log_date_formats="relative iso8601 rfc2822 short local default raw"
1305 __git_has_doubledash && return
1307 local g="$(git rev-parse --git-dir 2>/dev/null)"
1309 if [ -f "$g/MERGE_HEAD" ]; then
1313 --pretty=*|--format=*)
1314 __gitcomp "$__git_log_pretty_formats $(__git_pretty_aliases)
1319 __gitcomp "$__git_log_date_formats" "" "${cur##--date=}"
1323 __gitcomp "long short" "" "${cur##--decorate=}"
1328 $__git_log_common_options
1329 $__git_log_shortlog_options
1330 $__git_log_gitk_options
1331 --root --topo-order --date-order --reverse
1332 --follow --full-diff
1333 --abbrev-commit --abbrev=
1334 --relative-date --date=
1335 --pretty= --format= --oneline
1338 --decorate --decorate=
1340 --parents --children
1342 $__git_diff_common_options
1343 --pickaxe-all --pickaxe-regex
1348 __git_complete_revlist
1351 __git_merge_options="
1352 --no-commit --no-stat --log --no-log --squash --strategy
1353 --commit --stat --no-squash --ff --no-ff --ff-only --edit --no-edit
1358 __git_complete_strategy && return
1362 __gitcomp "$__git_merge_options"
1365 __gitcomp_nl "$(__git_refs)"
1372 __gitcomp "$__git_mergetools_common tortoisemerge" "" "${cur##--tool=}"
1385 __gitcomp_nl "$(__git_refs)"
1392 __gitcomp "--dry-run"
1401 __gitcomp "--tags --all --stdin"
1406 local subcommands='add append copy edit list prune remove show'
1407 local subcommand="$(__git_find_on_cmdline "$subcommands")"
1409 case "$subcommand,$cur" in
1416 __gitcomp_nl "$(__git_refs)"
1419 __gitcomp "$subcommands --ref"
1423 add,--reuse-message=*|append,--reuse-message=*|\
1424 add,--reedit-message=*|append,--reedit-message=*)
1425 __gitcomp_nl "$(__git_refs)" "" "${cur#*=}"
1428 __gitcomp '--file= --message= --reedit-message=
1435 __gitcomp '--dry-run --verbose'
1444 __gitcomp_nl "$(__git_refs)"
1453 __git_complete_strategy && return
1458 --rebase --no-rebase
1459 $__git_merge_options
1460 $__git_fetch_options
1465 __git_complete_remote_or_refspec
1472 __gitcomp_nl "$(__git_remotes)"
1477 __gitcomp_nl "$(__git_remotes)" "" "${cur##--repo=}"
1482 --all --mirror --tags --dry-run --force --verbose
1483 --receive-pack= --repo= --set-upstream
1488 __git_complete_remote_or_refspec
1493 local dir="$(__gitdir)"
1494 if [ -d "$dir"/rebase-apply ] || [ -d "$dir"/rebase-merge ]; then
1495 __gitcomp "--continue --skip --abort"
1498 __git_complete_strategy && return
1501 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
1506 --onto --merge --strategy --interactive
1507 --preserve-merges --stat --no-stat
1508 --committer-date-is-author-date --ignore-date
1509 --ignore-whitespace --whitespace=
1515 __gitcomp_nl "$(__git_refs)"
1520 local subcommands="show delete expire"
1521 local subcommand="$(__git_find_on_cmdline "$subcommands")"
1523 if [ -z "$subcommand" ]; then
1524 __gitcomp "$subcommands"
1526 __gitcomp_nl "$(__git_refs)"
1530 __git_send_email_confirm_options="always never auto cc compose"
1531 __git_send_email_suppresscc_options="author self cc bodycc sob cccmd body all"
1538 $__git_send_email_confirm_options
1539 " "" "${cur##--confirm=}"
1544 $__git_send_email_suppresscc_options
1545 " "" "${cur##--suppress-cc=}"
1549 --smtp-encryption=*)
1550 __gitcomp "ssl tls" "" "${cur##--smtp-encryption=}"
1554 __gitcomp "--annotate --bcc --cc --cc-cmd --chain-reply-to
1555 --compose --confirm= --dry-run --envelope-sender
1557 --in-reply-to --no-chain-reply-to --no-signed-off-by-cc
1558 --no-suppress-from --no-thread --quiet
1559 --signed-off-by-cc --smtp-pass --smtp-server
1560 --smtp-server-port --smtp-encryption= --smtp-user
1561 --subject --suppress-cc= --suppress-from --thread --to
1562 --validate --no-validate"
1574 __git_config_get_set_variables ()
1576 local prevword word config_file= c=$cword
1577 while [ $c -gt 1 ]; do
1580 --global|--system|--file=*)
1585 config_file="$word $prevword"
1593 git --git-dir="$(__gitdir)" config $config_file --list 2>/dev/null |
1608 __gitcomp_nl "$(__git_remotes)"
1612 __gitcomp_nl "$(__git_refs)"
1616 local remote="${prev#remote.}"
1617 remote="${remote%.fetch}"
1618 if [ -z "$cur" ]; then
1619 COMPREPLY=("refs/heads/")
1622 __gitcomp_nl "$(__git_refs_remotes "$remote")"
1626 local remote="${prev#remote.}"
1627 remote="${remote%.push}"
1628 __gitcomp_nl "$(git --git-dir="$(__gitdir)" \
1629 for-each-ref --format='%(refname):%(refname)' \
1633 pull.twohead|pull.octopus)
1634 __git_compute_merge_strategies
1635 __gitcomp "$__git_merge_strategies"
1638 color.branch|color.diff|color.interactive|\
1639 color.showbranch|color.status|color.ui)
1640 __gitcomp "always never auto"
1644 __gitcomp "false true"
1649 normal black red green yellow blue magenta cyan white
1650 bold dim ul blink reverse
1655 __gitcomp "man info web html"
1659 __gitcomp "$__git_log_date_formats"
1662 sendemail.aliasesfiletype)
1663 __gitcomp "mutt mailrc pine elm gnus"
1667 __gitcomp "$__git_send_email_confirm_options"
1670 sendemail.suppresscc)
1671 __gitcomp "$__git_send_email_suppresscc_options"
1674 --get|--get-all|--unset|--unset-all)
1675 __gitcomp_nl "$(__git_config_get_set_variables)"
1686 --global --system --file=
1687 --list --replace-all
1688 --get --get-all --get-regexp
1689 --add --unset --unset-all
1690 --remove-section --rename-section
1695 local pfx="${cur%.*}." cur_="${cur##*.}"
1696 __gitcomp "remote merge mergeoptions rebase" "$pfx" "$cur_"
1700 local pfx="${cur%.*}." cur_="${cur#*.}"
1701 __gitcomp_nl "$(__git_heads)" "$pfx" "$cur_" "."
1705 local pfx="${cur%.*}." cur_="${cur##*.}"
1707 argprompt cmd confirm needsfile noconsole norescan
1708 prompt revprompt revunmerged title
1713 local pfx="${cur%.*}." cur_="${cur##*.}"
1714 __gitcomp "cmd path" "$pfx" "$cur_"
1718 local pfx="${cur%.*}." cur_="${cur##*.}"
1719 __gitcomp "cmd path" "$pfx" "$cur_"
1723 local pfx="${cur%.*}." cur_="${cur##*.}"
1724 __gitcomp "cmd path trustExitCode" "$pfx" "$cur_"
1728 local pfx="${cur%.*}." cur_="${cur#*.}"
1729 __git_compute_all_commands
1730 __gitcomp_nl "$__git_all_commands" "$pfx" "$cur_"
1734 local pfx="${cur%.*}." cur_="${cur##*.}"
1736 url proxy fetch push mirror skipDefaultUpdate
1737 receivepack uploadpack tagopt pushurl
1742 local pfx="${cur%.*}." cur_="${cur#*.}"
1743 __gitcomp_nl "$(__git_remotes)" "$pfx" "$cur_" "."
1747 local pfx="${cur%.*}." cur_="${cur##*.}"
1748 __gitcomp "insteadOf pushInsteadOf" "$pfx" "$cur_"
1754 advice.commitBeforeMerge
1756 advice.implicitIdentity
1757 advice.pushNonFastForward
1758 advice.resolveConflict
1762 apply.ignorewhitespace
1764 branch.autosetupmerge
1765 branch.autosetuprebase
1769 color.branch.current
1774 color.decorate.branch
1775 color.decorate.remoteBranch
1776 color.decorate.stash
1786 color.diff.whitespace
1791 color.grep.linenumber
1794 color.grep.separator
1796 color.interactive.error
1797 color.interactive.header
1798 color.interactive.help
1799 color.interactive.prompt
1804 color.status.changed
1806 color.status.nobranch
1807 color.status.untracked
1808 color.status.updated
1817 core.bigFileThreshold
1820 core.deltaBaseCacheLimit
1825 core.fsyncobjectfiles
1827 core.ignoreCygwinFSTricks
1830 core.logAllRefUpdates
1831 core.loosecompression
1834 core.packedGitWindowSize
1836 core.preferSymlinkRefs
1839 core.repositoryFormatVersion
1841 core.sharedRepository
1845 core.warnAmbiguousRefs
1848 diff.autorefreshindex
1851 diff.ignoreSubmodules
1856 diff.suppressBlankEmpty
1861 fetch.recurseSubmodules
1870 format.subjectprefix
1881 gc.reflogexpireunreachable
1885 gitcvs.commitmsgannotation
1886 gitcvs.dbTableNamePrefix
1897 gui.copyblamethreshold
1901 gui.matchtrackingbranch
1902 gui.newbranchtemplate
1903 gui.pruneduringfetch
1904 gui.spellingdictionary
1919 http.sslCertPasswordProtected
1924 i18n.logOutputEncoding
1930 imap.preformattedHTML
1940 interactive.singlekey
1956 mergetool.keepBackup
1957 mergetool.keepTemporaries
1962 notes.rewrite.rebase
1966 pack.deltaCacheLimit
1982 receive.denyCurrentBranch
1983 receive.denyDeleteCurrent
1985 receive.denyNonFastForwards
1988 receive.updateserverinfo
1990 repack.usedeltabaseoffset
1994 sendemail.aliasesfile
1995 sendemail.aliasfiletype
1999 sendemail.chainreplyto
2001 sendemail.envelopesender
2005 sendemail.signedoffbycc
2006 sendemail.smtpdomain
2007 sendemail.smtpencryption
2009 sendemail.smtpserver
2010 sendemail.smtpserveroption
2011 sendemail.smtpserverport
2013 sendemail.suppresscc
2014 sendemail.suppressfrom
2019 status.relativePaths
2020 status.showUntrackedFiles
2021 status.submodulesummary
2024 transfer.unpackLimit
2036 local subcommands="add rename remove set-head set-branches set-url show prune update"
2037 local subcommand="$(__git_find_on_cmdline "$subcommands")"
2038 if [ -z "$subcommand" ]; then
2039 __gitcomp "$subcommands"
2043 case "$subcommand" in
2044 rename|remove|set-url|show|prune)
2045 __gitcomp_nl "$(__git_remotes)"
2047 set-head|set-branches)
2048 __git_complete_remote_or_refspec
2051 local i c='' IFS=$'\n'
2052 for i in $(git --git-dir="$(__gitdir)" config --get-regexp "remotes\..*" 2>/dev/null); do
2066 __gitcomp_nl "$(__git_refs)"
2071 __git_has_doubledash && return
2075 __gitcomp "--merge --mixed --hard --soft --patch"
2079 __gitcomp_nl "$(__git_refs)"
2086 __gitcomp "--edit --mainline --no-edit --no-commit --signoff"
2090 __gitcomp_nl "$(__git_refs)"
2095 __git_has_doubledash && return
2099 __gitcomp "--cached --dry-run --ignore-unmatch --quiet"
2108 __git_has_doubledash && return
2113 $__git_log_common_options
2114 $__git_log_shortlog_options
2115 --numbered --summary
2120 __git_complete_revlist
2125 __git_has_doubledash && return
2128 --pretty=*|--format=*)
2129 __gitcomp "$__git_log_pretty_formats $(__git_pretty_aliases)
2134 __gitcomp "--pretty= --format= --abbrev-commit --oneline
2135 $__git_diff_common_options
2148 --all --remotes --topo-order --current --more=
2149 --list --independent --merge-base --no-name
2151 --sha1-name --sparse --topics --reflog
2156 __git_complete_revlist
2161 local save_opts='--keep-index --no-keep-index --quiet --patch'
2162 local subcommands='save list show apply clear drop pop create branch'
2163 local subcommand="$(__git_find_on_cmdline "$subcommands")"
2164 if [ -z "$subcommand" ]; then
2167 __gitcomp "$save_opts"
2170 if [ -z "$(__git_find_on_cmdline "$save_opts")" ]; then
2171 __gitcomp "$subcommands"
2178 case "$subcommand,$cur" in
2180 __gitcomp "$save_opts"
2183 __gitcomp "--index --quiet"
2185 show,--*|drop,--*|branch,--*)
2188 show,*|apply,*|drop,*|pop,*|branch,*)
2189 __gitcomp_nl "$(git --git-dir="$(__gitdir)" stash list \
2190 | sed -n -e 's/:.*//p')"
2201 __git_has_doubledash && return
2203 local subcommands="add status init update summary foreach sync"
2204 if [ -z "$(__git_find_on_cmdline "$subcommands")" ]; then
2207 __gitcomp "--quiet --cached"
2210 __gitcomp "$subcommands"
2220 init fetch clone rebase dcommit log find-rev
2221 set-tree commit-diff info create-ignore propget
2222 proplist show-ignore show-externals branch tag blame
2223 migrate mkdirs reset gc
2225 local subcommand="$(__git_find_on_cmdline "$subcommands")"
2226 if [ -z "$subcommand" ]; then
2227 __gitcomp "$subcommands"
2229 local remote_opts="--username= --config-dir= --no-auth-cache"
2231 --follow-parent --authors-file= --repack=
2232 --no-metadata --use-svm-props --use-svnsync-props
2233 --log-window-size= --no-checkout --quiet
2234 --repack-flags --use-log-author --localtime
2235 --ignore-paths= $remote_opts
2238 --template= --shared= --trunk= --tags=
2239 --branches= --stdlayout --minimize-url
2240 --no-metadata --use-svm-props --use-svnsync-props
2241 --rewrite-root= --prefix= --use-log-author
2242 --add-author-from $remote_opts
2245 --edit --rmdir --find-copies-harder --copy-similarity=
2248 case "$subcommand,$cur" in
2250 __gitcomp "--revision= --fetch-all $fc_opts"
2253 __gitcomp "--revision= $fc_opts $init_opts"
2256 __gitcomp "$init_opts"
2260 --merge --strategy= --verbose --dry-run
2261 --fetch-all --no-rebase --commit-url
2262 --revision --interactive $cmt_opts $fc_opts
2266 __gitcomp "--stdin $cmt_opts $fc_opts"
2268 create-ignore,--*|propget,--*|proplist,--*|show-ignore,--*|\
2269 show-externals,--*|mkdirs,--*)
2270 __gitcomp "--revision="
2274 --limit= --revision= --verbose --incremental
2275 --oneline --show-commit --non-recursive
2276 --authors-file= --color
2281 --merge --verbose --strategy= --local
2282 --fetch-all --dry-run $fc_opts
2286 __gitcomp "--message= --file= --revision= $cmt_opts"
2292 __gitcomp "--dry-run --message --tag"
2295 __gitcomp "--dry-run --message"
2298 __gitcomp "--git-format"
2302 --config-dir= --ignore-paths= --minimize
2303 --no-auth-cache --username=
2307 __gitcomp "--revision= --parent"
2319 while [ $c -lt $cword ]; do
2323 __gitcomp_nl "$(__git_tags)"
2339 __gitcomp_nl "$(__git_tags)"
2345 __gitcomp_nl "$(__git_refs)"
2357 local i c=1 command __git_dir
2359 while [ $c -lt $cword ]; do
2362 --git-dir=*) __git_dir="${i#--git-dir=}" ;;
2363 --bare) __git_dir="." ;;
2364 --help) command="help"; break ;;
2367 *) command="$i"; break ;;
2372 if [ -z "$command" ]; then
2386 --no-replace-objects
2390 *) __git_compute_porcelain_commands
2391 __gitcomp "$__git_porcelain_commands $(__git_aliases)" ;;
2396 local completion_func="_git_${command//-/_}"
2397 declare -f $completion_func >/dev/null && $completion_func && return
2399 local expansion=$(__git_aliased_command "$command")
2400 if [ -n "$expansion" ]; then
2401 completion_func="_git_${expansion//-/_}"
2402 declare -f $completion_func >/dev/null && $completion_func
2408 __git_has_doubledash && return
2410 local g="$(__gitdir)"
2412 if [ -f "$g/MERGE_HEAD" ]; then
2418 $__git_log_common_options
2419 $__git_log_gitk_options
2425 __git_complete_revlist
2430 if [[ -n ${ZSH_VERSION-} ]]; then
2434 # workaround zsh's bug that leaves 'words' as a special
2435 # variable in versions < 4.3.12
2438 # workaround zsh's bug that quotes spaces in the COMPREPLY
2439 # array if IFS doesn't contain spaces.
2442 local cur words cword prev
2443 _get_comp_words_by_ref -n =: cur words cword prev
2447 # Setup completion for certain functions defined above by setting common
2448 # variables and workarounds.
2449 # This is NOT a public function; use at your own risk.
2452 local wrapper="__git_wrap${2}"
2453 eval "$wrapper () { __git_func_wrap $2 ; }"
2454 complete -o bashdefault -o default -o nospace -F $wrapper $1 2>/dev/null \
2455 || complete -o default -o nospace -F $wrapper $1
2458 # wrapper for backwards compatibility
2461 __git_wrap__git_main
2464 # wrapper for backwards compatibility
2467 __git_wrap__gitk_main
2470 __git_complete git __git_main
2471 __git_complete gitk __gitk_main
2473 # The following are necessary only for Cygwin, and only are needed
2474 # when the user has tab-completed the executable name and consequently
2475 # included the '.exe' suffix.
2477 if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
2478 __git_complete git.exe __git_main