1 # bash/zsh completion support for core Git.
3 # Copyright (C) 2006,2007 Shawn O. Pearce <spearce@spearce.org>
4 # Conceptually based on gitcompletion (http://gitweb.hawaga.org.uk/).
5 # Distributed under the GNU General Public License, version 2.0.
7 # The contained completion routines provide support for completing:
9 # *) local and remote branch names
10 # *) local and remote tag names
11 # *) .git/remotes file names
12 # *) git 'subcommands'
13 # *) git email aliases for git-send-email
14 # *) tree paths within 'ref:path/to/file' expressions
15 # *) file paths within current working directory and index
16 # *) common --long-options
18 # To use these routines:
20 # 1) Copy this file to somewhere (e.g. ~/.git-completion.bash).
21 # 2) Add the following line to your .bashrc/.zshrc:
22 # source ~/.git-completion.bash
23 # 3) Consider changing your PS1 to also show the current branch,
24 # see git-prompt.sh for details.
26 # If you use complex aliases of form '!f() { ... }; f', you can use the null
27 # command ':' as the first command in the function body to declare the desired
28 # completion style. For example '!f() { : git commit ; ... }; f' will
29 # tell the completion to use commit completion. This also works with aliases
30 # of form "!sh -c '...'". For example, "!sh -c ': git commit ; ... '".
32 # Compatible with bash 3.2.57.
34 # You can set the following environment variables to influence the behavior of
35 # the completion routines:
37 # GIT_COMPLETION_CHECKOUT_NO_GUESS
39 # When set to "1", do not include "DWIM" suggestions in git-checkout
40 # completion (e.g., completing "foo" when "origin/foo" exists).
42 case "$COMP_WORDBREAKS" in
44 *) COMP_WORDBREAKS="$COMP_WORDBREAKS:"
47 # Discovers the path to the git repository taking any '--git-dir=<path>' and
48 # '-C <path>' options into account and stores it in the $__git_repo_path
50 __git_find_repo_path ()
52 if [ -n "$__git_repo_path" ]; then
53 # we already know where it is
57 if [ -n "${__git_C_args-}" ]; then
58 __git_repo_path="$(git "${__git_C_args[@]}" \
59 ${__git_dir:+--git-dir="$__git_dir"} \
60 rev-parse --absolute-git-dir 2>/dev/null)"
61 elif [ -n "${__git_dir-}" ]; then
62 test -d "$__git_dir" &&
63 __git_repo_path="$__git_dir"
64 elif [ -n "${GIT_DIR-}" ]; then
65 test -d "${GIT_DIR-}" &&
66 __git_repo_path="$GIT_DIR"
67 elif [ -d .git ]; then
70 __git_repo_path="$(git rev-parse --git-dir 2>/dev/null)"
74 # Deprecated: use __git_find_repo_path() and $__git_repo_path instead
75 # __gitdir accepts 0 or 1 arguments (i.e., location)
76 # returns location of .git repo
79 if [ -z "${1-}" ]; then
80 __git_find_repo_path || return 1
81 echo "$__git_repo_path"
82 elif [ -d "$1/.git" ]; then
89 # Runs git with all the options given as argument, respecting any
90 # '--git-dir=<path>' and '-C <path>' options present on the command line
93 git ${__git_C_args:+"${__git_C_args[@]}"} \
94 ${__git_dir:+--git-dir="$__git_dir"} "$@" 2>/dev/null
97 # Removes backslash escaping, single quotes and double quotes from a word,
98 # stores the result in the variable $dequoted_word.
99 # 1: The word to dequote.
102 local rest="$1" len ch
106 while test -n "$rest"; do
107 len=${#dequoted_word}
108 dequoted_word="$dequoted_word${rest%%[\\\'\"]*}"
109 rest="${rest:$((${#dequoted_word}-$len))}"
111 case "${rest:0:1}" in
118 dequoted_word="$dequoted_word$ch"
125 len=${#dequoted_word}
126 dequoted_word="$dequoted_word${rest%%\'*}"
127 rest="${rest:$((${#dequoted_word}-$len+1))}"
131 while test -n "$rest" ; do
132 len=${#dequoted_word}
133 dequoted_word="$dequoted_word${rest%%[\\\"]*}"
134 rest="${rest:$((${#dequoted_word}-$len))}"
135 case "${rest:0:1}" in
140 dequoted_word="$dequoted_word$ch"
145 dequoted_word="$dequoted_word\\$ch"
161 # The following function is based on code from:
163 # bash_completion - programmable completion functions for bash 3.2+
165 # Copyright © 2006-2008, Ian Macdonald <ian@caliban.org>
166 # © 2009-2010, Bash Completion Maintainers
167 # <bash-completion-devel@lists.alioth.debian.org>
169 # This program is free software; you can redistribute it and/or modify
170 # it under the terms of the GNU General Public License as published by
171 # the Free Software Foundation; either version 2, or (at your option)
174 # This program is distributed in the hope that it will be useful,
175 # but WITHOUT ANY WARRANTY; without even the implied warranty of
176 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
177 # GNU General Public License for more details.
179 # You should have received a copy of the GNU General Public License
180 # along with this program; if not, see <http://www.gnu.org/licenses/>.
182 # The latest version of this software can be obtained here:
184 # http://bash-completion.alioth.debian.org/
188 # This function can be used to access a tokenized list of words
189 # on the command line:
191 # __git_reassemble_comp_words_by_ref '=:'
192 # if test "${words_[cword_-1]}" = -w
197 # The argument should be a collection of characters from the list of
198 # word completion separators (COMP_WORDBREAKS) to treat as ordinary
201 # This is roughly equivalent to going back in time and setting
202 # COMP_WORDBREAKS to exclude those characters. The intent is to
203 # make option types like --date=<type> and <rev>:<path> easy to
204 # recognize by treating each shell word as a single token.
206 # It is best not to set COMP_WORDBREAKS directly because the value is
207 # shared with other completion scripts. By the time the completion
208 # function gets called, COMP_WORDS has already been populated so local
209 # changes to COMP_WORDBREAKS have no effect.
211 # Output: words_, cword_, cur_.
213 __git_reassemble_comp_words_by_ref()
215 local exclude i j first
216 # Which word separators to exclude?
217 exclude="${1//[^$COMP_WORDBREAKS]}"
219 if [ -z "$exclude" ]; then
220 words_=("${COMP_WORDS[@]}")
223 # List of word completion separators has shrunk;
224 # re-assemble words to complete.
225 for ((i=0, j=0; i < ${#COMP_WORDS[@]}; i++, j++)); do
226 # Append each nonempty word consisting of just
227 # word separator characters to the current word.
231 [ -n "${COMP_WORDS[$i]}" ] &&
232 # word consists of excluded word separators
233 [ "${COMP_WORDS[$i]//[^$exclude]}" = "${COMP_WORDS[$i]}" ]
235 # Attach to the previous token,
236 # unless the previous token is the command name.
237 if [ $j -ge 2 ] && [ -n "$first" ]; then
241 words_[$j]=${words_[j]}${COMP_WORDS[i]}
242 if [ $i = $COMP_CWORD ]; then
245 if (($i < ${#COMP_WORDS[@]} - 1)); then
252 words_[$j]=${words_[j]}${COMP_WORDS[i]}
253 if [ $i = $COMP_CWORD ]; then
259 if ! type _get_comp_words_by_ref >/dev/null 2>&1; then
260 _get_comp_words_by_ref ()
262 local exclude cur_ words_ cword_
263 if [ "$1" = "-n" ]; then
267 __git_reassemble_comp_words_by_ref "$exclude"
268 cur_=${words_[cword_]}
269 while [ $# -gt 0 ]; do
275 prev=${words_[$cword_-1]}
278 words=("${words_[@]}")
289 # Fills the COMPREPLY array with prefiltered words without any additional
291 # Callers must take care of providing only words that match the current word
292 # to be completed and adding any prefix and/or suffix (trailing space!), if
294 # 1: List of newline-separated matching completion words, complete with
305 local x i=${#COMPREPLY[@]}
307 if [[ "$x" == "$3"* ]]; then
308 COMPREPLY[i++]="$2$x$4"
319 # Generates completion reply, appending a space to possible completion words,
321 # It accepts 1 to 4 arguments:
322 # 1: List of possible completion words.
323 # 2: A prefix to be added to each possible completion word (optional).
324 # 3: Generate possible completion matches for this word (optional).
325 # 4: A suffix to be appended to each possible completion word (optional).
328 local cur_="${3-$cur}"
334 local c i=0 IFS=$' \t\n'
337 if [[ $c == "$cur_"* ]]; then
342 COMPREPLY[i++]="${2-}$c"
349 # Clear the variables caching builtins' options when (re-)sourcing
350 # the completion script.
351 if [[ -n ${ZSH_VERSION-} ]]; then
352 unset $(set |sed -ne 's/^\(__gitcomp_builtin_[a-zA-Z0-9_][a-zA-Z0-9_]*\)=.*/\1/p') 2>/dev/null
354 unset $(compgen -v __gitcomp_builtin_)
357 # This function is equivalent to
359 # __gitcomp "$(git xxx --git-completion-helper) ..."
361 # except that the output is cached. Accept 1-3 arguments:
362 # 1: the git command to execute, this is also the cache key
363 # 2: extra options to be added on top (e.g. negative forms)
364 # 3: options to be excluded
367 # spaces must be replaced with underscore for multi-word
368 # commands, e.g. "git remote add" becomes remote_add.
373 local var=__gitcomp_builtin_"${cmd/-/_}"
375 eval "options=\$$var"
377 if [ -z "$options" ]; then
378 # leading and trailing spaces are significant to make
379 # option removal work correctly.
380 options=" $(__git ${cmd/_/ } --git-completion-helper) $incl "
382 options="${options/ $i / }"
384 eval "$var=\"$options\""
390 # Variation of __gitcomp_nl () that appends to the existing list of
391 # completion candidates, COMPREPLY.
392 __gitcomp_nl_append ()
395 __gitcompappend "$1" "${2-}" "${3-$cur}" "${4- }"
398 # Generates completion reply from newline-separated possible completion words
399 # by appending a space to all of them.
400 # It accepts 1 to 4 arguments:
401 # 1: List of possible completion words, separated by a single newline.
402 # 2: A prefix to be added to each possible completion word (optional).
403 # 3: Generate possible completion matches for this word (optional).
404 # 4: A suffix to be appended to each possible completion word instead of
405 # the default space (optional). If specified but empty, nothing is
410 __gitcomp_nl_append "$@"
413 # Fills the COMPREPLY array with prefiltered paths without any additional
415 # Callers must take care of providing only paths that match the current path
416 # to be completed and adding any prefix path components, if necessary.
417 # 1: List of newline-separated matching paths, complete with all prefix
419 __gitcomp_file_direct ()
425 # use a hack to enable file mode in bash < 4
426 compopt -o filenames +o nospace 2>/dev/null ||
427 compgen -f /non-existing-dir/ >/dev/null ||
431 # Generates completion reply with compgen from newline-separated possible
432 # completion filenames.
433 # It accepts 1 to 3 arguments:
434 # 1: List of possible completion filenames, separated by a single newline.
435 # 2: A directory prefix to be added to each possible completion filename
437 # 3: Generate possible completion matches for this word (optional).
442 # XXX does not work when the directory prefix contains a tilde,
443 # since tilde expansion is not applied.
444 # This means that COMPREPLY will be empty and Bash default
445 # completion will be used.
446 __gitcompadd "$1" "${2-}" "${3-$cur}" ""
448 # use a hack to enable file mode in bash < 4
449 compopt -o filenames +o nospace 2>/dev/null ||
450 compgen -f /non-existing-dir/ >/dev/null ||
454 # Execute 'git ls-files', unless the --committable option is specified, in
455 # which case it runs 'git diff-index' to find out the files that can be
456 # committed. It return paths relative to the directory specified in the first
457 # argument, and using the options specified in the second argument.
458 __git_ls_files_helper ()
460 if [ "$2" == "--committable" ]; then
461 __git -C "$1" -c core.quotePath=false diff-index \
462 --name-only --relative HEAD -- "${3//\\/\\\\}*"
464 # NOTE: $2 is not quoted in order to support multiple options
465 __git -C "$1" -c core.quotePath=false ls-files \
466 --exclude-standard $2 -- "${3//\\/\\\\}*"
471 # __git_index_files accepts 1 or 2 arguments:
472 # 1: Options to pass to ls-files (required).
473 # 2: A directory path (optional).
474 # If provided, only files within the specified directory are listed.
475 # Sub directories are never recursed. Path must have a trailing
477 # 3: List only paths matching this path component (optional).
480 local root="$2" match="$3"
482 __git_ls_files_helper "$root" "$1" "$match" |
483 awk -F / -v pfx="${2//\\/\\\\}" '{
488 if (substr(p, 1, 1) != "\"") {
489 # No special characters, easy!
494 # The path is quoted.
499 # Even when a directory name itself does not contain
500 # any special characters, it will still be quoted if
501 # any of its (stripped) trailing path components do.
502 # Because of this we may have seen the same direcory
503 # both quoted and unquoted.
505 # We have seen the same directory unquoted,
512 function dequote(p, bs_idx, out, esc, esc_idx, dec) {
513 # Skip opening double quote.
516 # Interpret backslash escape sequences.
517 while ((bs_idx = index(p, "\\")) != 0) {
518 out = out substr(p, 1, bs_idx - 1)
519 esc = substr(p, bs_idx + 1, 1)
520 p = substr(p, bs_idx + 2)
522 if ((esc_idx = index("abtvfr\"\\", esc)) != 0) {
523 # C-style one-character escape sequence.
524 out = out substr("\a\b\t\v\f\r\"\\",
526 } else if (esc == "n") {
527 # Uh-oh, a newline character.
528 # We cant reliably put a pathname
529 # containing a newline into COMPREPLY,
530 # and the newline would create a mess.
534 # Must be a \nnn octal value, then.
536 substr(p, 1, 1) * 8 + \
538 out = out sprintf("%c", dec)
542 # Drop closing double quote, if there is one.
543 # (There isnt any if this is a directory, as it was
544 # already stripped with the trailing path components.)
545 if (substr(p, length(p), 1) == "\"")
546 out = out substr(p, 1, length(p) - 1)
554 # __git_complete_index_file requires 1 argument:
555 # 1: the options to pass to ls-file
557 # The exception is --committable, which finds the files appropriate commit.
558 __git_complete_index_file ()
560 local dequoted_word pfx="" cur_
564 case "$dequoted_word" in
566 pfx="${dequoted_word%/*}/"
567 cur_="${dequoted_word##*/}"
570 cur_="$dequoted_word"
573 __gitcomp_file_direct "$(__git_index_files "$1" "$pfx" "$cur_")"
576 # Lists branches from the local repository.
577 # 1: A prefix to be added to each listed branch (optional).
578 # 2: List only branches matching this word (optional; list all branches if
580 # 3: A suffix to be appended to each listed branch (optional).
583 local pfx="${1-}" cur_="${2-}" sfx="${3-}"
585 __git for-each-ref --format="${pfx//\%/%%}%(refname:strip=2)$sfx" \
586 "refs/heads/$cur_*" "refs/heads/$cur_*/**"
589 # Lists tags from the local repository.
590 # Accepts the same positional parameters as __git_heads() above.
593 local pfx="${1-}" cur_="${2-}" sfx="${3-}"
595 __git for-each-ref --format="${pfx//\%/%%}%(refname:strip=2)$sfx" \
596 "refs/tags/$cur_*" "refs/tags/$cur_*/**"
599 # Lists refs from the local (by default) or from a remote repository.
600 # It accepts 0, 1 or 2 arguments:
601 # 1: The remote to list refs from (optional; ignored, if set but empty).
602 # Can be the name of a configured remote, a path, or a URL.
603 # 2: In addition to local refs, list unique branches from refs/remotes/ for
604 # 'git checkout's tracking DWIMery (optional; ignored, if set but empty).
605 # 3: A prefix to be added to each listed ref (optional).
606 # 4: List only refs matching this word (optional; list all refs if unset or
608 # 5: A suffix to be appended to each listed ref (optional; ignored, if set
611 # Use __git_complete_refs() instead.
614 local i hash dir track="${2-}"
615 local list_refs_from=path remote="${1-}"
617 local pfx="${3-}" cur_="${4-$cur}" sfx="${5-}"
619 local fer_pfx="${pfx//\%/%%}" # "escape" for-each-ref format specifiers
622 dir="$__git_repo_path"
624 if [ -z "$remote" ]; then
625 if [ -z "$dir" ]; then
629 if __git_is_configured_remote "$remote"; then
630 # configured remote takes precedence over a
631 # local directory with the same name
632 list_refs_from=remote
633 elif [ -d "$remote/.git" ]; then
635 elif [ -d "$remote" ]; then
642 if [ "$list_refs_from" = path ]; then
643 if [[ "$cur_" == ^* ]]; then
652 refs=("$match*" "$match*/**")
656 for i in HEAD FETCH_HEAD ORIG_HEAD MERGE_HEAD REBASE_HEAD; do
659 if [ -e "$dir/$i" ]; then
665 format="refname:strip=2"
666 refs=("refs/tags/$match*" "refs/tags/$match*/**"
667 "refs/heads/$match*" "refs/heads/$match*/**"
668 "refs/remotes/$match*" "refs/remotes/$match*/**")
671 __git_dir="$dir" __git for-each-ref --format="$fer_pfx%($format)$sfx" \
673 if [ -n "$track" ]; then
674 # employ the heuristic used by git checkout
675 # Try to find a remote branch that matches the completion word
676 # but only output if the branch name is unique
677 __git for-each-ref --format="$fer_pfx%(refname:strip=3)$sfx" \
678 --sort="refname:strip=3" \
679 "refs/remotes/*/$match*" "refs/remotes/*/$match*/**" | \
686 __git ls-remote "$remote" "$match*" | \
687 while read -r hash i; do
690 *) echo "$pfx$i$sfx" ;;
695 if [ "$list_refs_from" = remote ]; then
697 $match*) echo "${pfx}HEAD$sfx" ;;
699 __git for-each-ref --format="$fer_pfx%(refname:strip=3)$sfx" \
700 "refs/remotes/$remote/$match*" \
701 "refs/remotes/$remote/$match*/**"
705 $match*) query_symref="HEAD" ;;
707 __git ls-remote "$remote" $query_symref \
708 "refs/tags/$match*" "refs/heads/$match*" \
709 "refs/remotes/$match*" |
710 while read -r hash i; do
713 refs/*) echo "$pfx${i#refs/*/}$sfx" ;;
714 *) echo "$pfx$i$sfx" ;; # symbolic refs
722 # Completes refs, short and long, local and remote, symbolic and pseudo.
724 # Usage: __git_complete_refs [<option>]...
725 # --remote=<remote>: The remote to list refs from, can be the name of a
726 # configured remote, a path, or a URL.
727 # --track: List unique remote branches for 'git checkout's tracking DWIMery.
728 # --pfx=<prefix>: A prefix to be added to each ref.
729 # --cur=<word>: The current ref to be completed. Defaults to the current
730 # word to be completed.
731 # --sfx=<suffix>: A suffix to be appended to each ref instead of the default
733 __git_complete_refs ()
735 local remote track pfx cur_="$cur" sfx=" "
737 while test $# != 0; do
739 --remote=*) remote="${1##--remote=}" ;;
740 --track) track="yes" ;;
741 --pfx=*) pfx="${1##--pfx=}" ;;
742 --cur=*) cur_="${1##--cur=}" ;;
743 --sfx=*) sfx="${1##--sfx=}" ;;
749 __gitcomp_direct "$(__git_refs "$remote" "$track" "$pfx" "$cur_" "$sfx")"
752 # __git_refs2 requires 1 argument (to pass to __git_refs)
753 # Deprecated: use __git_complete_fetch_refspecs() instead.
757 for i in $(__git_refs "$1"); do
762 # Completes refspecs for fetching from a remote repository.
763 # 1: The remote repository.
764 # 2: A prefix to be added to each listed refspec (optional).
765 # 3: The ref to be completed as a refspec instead of the current word to be
766 # completed (optional)
767 # 4: A suffix to be appended to each listed refspec instead of the default
769 __git_complete_fetch_refspecs ()
771 local i remote="$1" pfx="${2-}" cur_="${3-$cur}" sfx="${4- }"
774 for i in $(__git_refs "$remote" "" "" "$cur_") ; do
780 # __git_refs_remotes requires 1 argument (to pass to ls-remote)
781 __git_refs_remotes ()
784 __git ls-remote "$1" 'refs/heads/*' | \
785 while read -r hash i; do
786 echo "$i:refs/remotes/$1/${i#refs/heads/}"
793 test -d "$__git_repo_path/remotes" && ls -1 "$__git_repo_path/remotes"
797 # Returns true if $1 matches the name of a configured remote, false otherwise.
798 __git_is_configured_remote ()
801 for remote in $(__git_remotes); do
802 if [ "$remote" = "$1" ]; then
809 __git_list_merge_strategies ()
811 LANG=C LC_ALL=C git merge -s help 2>&1 |
812 sed -n -e '/[Aa]vailable strategies are: /,/^$/{
821 __git_merge_strategies=
822 # 'git merge -s help' (and thus detection of the merge strategy
823 # list) fails, unfortunately, if run outside of any git working
824 # tree. __git_merge_strategies is set to the empty string in
825 # that case, and the detection will be repeated the next time it
827 __git_compute_merge_strategies ()
829 test -n "$__git_merge_strategies" ||
830 __git_merge_strategies=$(__git_list_merge_strategies)
833 __git_complete_revlist_file ()
835 local pfx ls ref cur_="$cur"
855 case "$COMP_WORDBREAKS" in
857 *) pfx="$ref:$pfx" ;;
860 __gitcomp_nl "$(__git ls-tree "$ls" \
861 | sed '/^100... blob /{
877 pfx="${cur_%...*}..."
879 __git_complete_refs --pfx="$pfx" --cur="$cur_"
884 __git_complete_refs --pfx="$pfx" --cur="$cur_"
892 __git_complete_file ()
894 __git_complete_revlist_file
897 __git_complete_revlist ()
899 __git_complete_revlist_file
902 __git_complete_remote_or_refspec ()
904 local cur_="$cur" cmd="${words[1]}"
905 local i c=2 remote="" pfx="" lhs=1 no_complete_refspec=0
906 if [ "$cmd" = "remote" ]; then
909 while [ $c -lt $cword ]; do
912 --mirror) [ "$cmd" = "push" ] && no_complete_refspec=1 ;;
913 -d|--delete) [ "$cmd" = "push" ] && lhs=0 ;;
916 push) no_complete_refspec=1 ;;
924 *) remote="$i"; break ;;
928 if [ -z "$remote" ]; then
929 __gitcomp_nl "$(__git_remotes)"
932 if [ $no_complete_refspec = 1 ]; then
935 [ "$remote" = "." ] && remote=
938 case "$COMP_WORDBREAKS" in
940 *) pfx="${cur_%%:*}:" ;;
952 if [ $lhs = 1 ]; then
953 __git_complete_fetch_refspecs "$remote" "$pfx" "$cur_"
955 __git_complete_refs --pfx="$pfx" --cur="$cur_"
959 if [ $lhs = 1 ]; then
960 __git_complete_refs --remote="$remote" --pfx="$pfx" --cur="$cur_"
962 __git_complete_refs --pfx="$pfx" --cur="$cur_"
966 if [ $lhs = 1 ]; then
967 __git_complete_refs --pfx="$pfx" --cur="$cur_"
969 __git_complete_refs --remote="$remote" --pfx="$pfx" --cur="$cur_"
975 __git_complete_strategy ()
977 __git_compute_merge_strategies
980 __gitcomp "$__git_merge_strategies"
985 __gitcomp "$__git_merge_strategies" "" "${cur##--strategy=}"
993 if test -n "${GIT_TESTING_COMMAND_COMPLETION:-}"
995 printf "%s" "${GIT_TESTING_COMMAND_COMPLETION}"
997 git help -a|egrep '^ [a-zA-Z0-9]'
1001 __git_list_all_commands ()
1003 local i IFS=" "$'\n'
1004 for i in $(__git_commands)
1007 *--*) : helper pattern;;
1014 __git_compute_all_commands ()
1016 test -n "$__git_all_commands" ||
1017 __git_all_commands=$(__git_list_all_commands)
1020 __git_list_porcelain_commands ()
1022 local i IFS=" "$'\n'
1023 __git_compute_all_commands
1024 for i in $__git_all_commands
1027 *--*) : helper pattern;;
1028 applymbox) : ask gittus;;
1029 applypatch) : ask gittus;;
1030 archimport) : import;;
1031 cat-file) : plumbing;;
1032 check-attr) : plumbing;;
1033 check-ignore) : plumbing;;
1034 check-mailmap) : plumbing;;
1035 check-ref-format) : plumbing;;
1036 checkout-index) : plumbing;;
1037 column) : internal helper;;
1038 commit-graph) : plumbing;;
1039 commit-tree) : plumbing;;
1040 count-objects) : infrequent;;
1041 credential) : credentials;;
1042 credential-*) : credentials helper;;
1043 cvsexportcommit) : export;;
1044 cvsimport) : import;;
1045 cvsserver) : daemon;;
1047 diff-files) : plumbing;;
1048 diff-index) : plumbing;;
1049 diff-tree) : plumbing;;
1050 fast-import) : import;;
1051 fast-export) : export;;
1052 fsck-objects) : plumbing;;
1053 fetch-pack) : plumbing;;
1054 fmt-merge-msg) : plumbing;;
1055 for-each-ref) : plumbing;;
1056 hash-object) : plumbing;;
1057 http-*) : transport;;
1058 index-pack) : plumbing;;
1059 init-db) : deprecated;;
1060 local-fetch) : plumbing;;
1061 ls-files) : plumbing;;
1062 ls-remote) : plumbing;;
1063 ls-tree) : plumbing;;
1064 mailinfo) : plumbing;;
1065 mailsplit) : plumbing;;
1066 merge-*) : plumbing;;
1067 mktree) : plumbing;;
1069 pack-objects) : plumbing;;
1070 pack-redundant) : plumbing;;
1071 pack-refs) : plumbing;;
1072 parse-remote) : plumbing;;
1073 patch-id) : plumbing;;
1075 prune-packed) : plumbing;;
1076 quiltimport) : import;;
1077 read-tree) : plumbing;;
1078 receive-pack) : plumbing;;
1079 remote-*) : transport;;
1080 rerere) : plumbing;;
1081 rev-list) : plumbing;;
1082 rev-parse) : plumbing;;
1083 runstatus) : plumbing;;
1084 sh-setup) : internal;;
1086 show-ref) : plumbing;;
1087 send-pack) : plumbing;;
1088 show-index) : plumbing;;
1089 ssh-*) : transport;;
1090 stripspace) : plumbing;;
1091 symbolic-ref) : plumbing;;
1092 unpack-file) : plumbing;;
1093 unpack-objects) : plumbing;;
1094 update-index) : plumbing;;
1095 update-ref) : plumbing;;
1096 update-server-info) : daemon;;
1097 upload-archive) : plumbing;;
1098 upload-pack) : plumbing;;
1099 write-tree) : plumbing;;
1101 verify-pack) : infrequent;;
1102 verify-tag) : plumbing;;
1108 __git_porcelain_commands=
1109 __git_compute_porcelain_commands ()
1111 test -n "$__git_porcelain_commands" ||
1112 __git_porcelain_commands=$(__git_list_porcelain_commands)
1115 # Lists all set config variables starting with the given section prefix,
1116 # with the prefix removed.
1117 __git_get_config_variables ()
1119 local section="$1" i IFS=$'\n'
1120 for i in $(__git config --name-only --get-regexp "^$section\..*"); do
1121 echo "${i#$section.}"
1125 __git_pretty_aliases ()
1127 __git_get_config_variables "pretty"
1132 __git_get_config_variables "alias"
1135 # __git_aliased_command requires 1 argument
1136 __git_aliased_command ()
1138 local word cmdline=$(__git config --get "alias.$1")
1139 for word in $cmdline; do
1145 \!*) : shell command alias ;;
1147 *=*) : setting env ;;
1148 git) : git itself ;;
1149 \(\)) : skip parens of shell function definition ;;
1150 {) : skip start of shell helper function ;;
1151 :) : skip null command ;;
1152 \'*) : skip opening quote after sh -c ;;
1160 # __git_find_on_cmdline requires 1 argument
1161 __git_find_on_cmdline ()
1163 local word subcommand c=1
1164 while [ $c -lt $cword ]; do
1166 for subcommand in $1; do
1167 if [ "$subcommand" = "$word" ]; then
1176 # Echo the value of an option set on the command line or config
1178 # $1: short option name
1179 # $2: long option name including =
1180 # $3: list of possible values
1181 # $4: config string (optional)
1184 # result="$(__git_get_option_value "-d" "--do-something=" \
1185 # "yes no" "core.doSomething")"
1187 # result is then either empty (no option set) or "yes" or "no"
1189 # __git_get_option_value requires 3 arguments
1190 __git_get_option_value ()
1192 local c short_opt long_opt val
1193 local result= values config_key word
1201 while [ $c -ge 0 ]; do
1203 for val in $values; do
1204 if [ "$short_opt$val" = "$word" ] ||
1205 [ "$long_opt$val" = "$word" ]; then
1213 if [ -n "$config_key" ] && [ -z "$result" ]; then
1214 result="$(__git config "$config_key")"
1220 __git_has_doubledash ()
1223 while [ $c -lt $cword ]; do
1224 if [ "--" = "${words[c]}" ]; then
1232 # Try to count non option arguments passed on the command line for the
1233 # specified git command.
1234 # When options are used, it is necessary to use the special -- option to
1235 # tell the implementation were non option arguments begin.
1236 # XXX this can not be improved, since options can appear everywhere, as
1240 # __git_count_arguments requires 1 argument: the git command executed.
1241 __git_count_arguments ()
1245 # Skip "git" (first argument)
1246 for ((i=1; i < ${#words[@]}; i++)); do
1251 # Good; we can assume that the following are only non
1256 # Skip the specified git command and discard git
1269 __git_whitespacelist="nowarn warn error error-all fix"
1270 __git_am_inprogress_options="--skip --continue --resolved --abort --quit --show-current-patch"
1274 __git_find_repo_path
1275 if [ -d "$__git_repo_path"/rebase-apply ]; then
1276 __gitcomp "$__git_am_inprogress_options"
1281 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
1285 __gitcomp_builtin am "--no-utf8" \
1286 "$__git_am_inprogress_options"
1295 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
1299 __gitcomp_builtin apply
1308 __gitcomp_builtin add
1312 local complete_opt="--others --modified --directory --no-empty-directory"
1313 if test -n "$(__git_find_on_cmdline "-u --update")"
1315 complete_opt="--modified"
1317 __git_complete_index_file "$complete_opt"
1324 __gitcomp "$(git archive --list)" "" "${cur##--format=}"
1328 __gitcomp_nl "$(__git_remotes)" "" "${cur##--remote=}"
1333 --format= --list --verbose
1334 --prefix= --remote= --exec= --output
1344 __git_has_doubledash && return
1346 local subcommands="start bad good skip reset visualize replay log run"
1347 local subcommand="$(__git_find_on_cmdline "$subcommands")"
1348 if [ -z "$subcommand" ]; then
1349 __git_find_repo_path
1350 if [ -f "$__git_repo_path"/BISECT_START ]; then
1351 __gitcomp "$subcommands"
1353 __gitcomp "replay start"
1358 case "$subcommand" in
1359 bad|good|reset|skip|start)
1369 local i c=1 only_local_ref="n" has_r="n"
1371 while [ $c -lt $cword ]; do
1374 -d|--delete|-m|--move) only_local_ref="y" ;;
1375 -r|--remotes) has_r="y" ;;
1381 --set-upstream-to=*)
1382 __git_complete_refs --cur="${cur##--set-upstream-to=}"
1385 __gitcomp_builtin branch "--no-color --no-abbrev
1386 --no-track --no-column
1390 if [ $only_local_ref = "y" -a $has_r = "n" ]; then
1391 __gitcomp_direct "$(__git_heads "" "$cur" " ")"
1401 local cmd="${words[2]}"
1404 __gitcomp "create list-heads verify unbundle"
1407 # looking for a file
1412 __git_complete_revlist
1421 __git_has_doubledash && return
1425 __gitcomp "diff3 merge" "" "${cur##--conflict=}"
1428 __gitcomp_builtin checkout "--no-track --no-recurse-submodules"
1431 # check if --track, --no-track, or --no-guess was specified
1432 # if so, disable DWIM mode
1433 local flags="--track --no-track --no-guess" track_opt="--track"
1434 if [ "$GIT_COMPLETION_CHECKOUT_NO_GUESS" = "1" ] ||
1435 [ -n "$(__git_find_on_cmdline "$flags")" ]; then
1438 __git_complete_refs $track_opt
1447 __gitcomp_builtin cherry
1454 __git_cherry_pick_inprogress_options="--continue --quit --abort"
1458 __git_find_repo_path
1459 if [ -f "$__git_repo_path"/CHERRY_PICK_HEAD ]; then
1460 __gitcomp "$__git_cherry_pick_inprogress_options"
1465 __gitcomp_builtin cherry-pick "" \
1466 "$__git_cherry_pick_inprogress_options"
1478 __gitcomp_builtin clean
1483 # XXX should we check for -x option ?
1484 __git_complete_index_file "--others --directory"
1491 __gitcomp_builtin clone "--no-single-branch"
1497 __git_untracked_file_modes="all no normal"
1510 __gitcomp "default scissors strip verbatim whitespace
1511 " "" "${cur##--cleanup=}"
1514 --reuse-message=*|--reedit-message=*|\
1515 --fixup=*|--squash=*)
1516 __git_complete_refs --cur="${cur#*=}"
1519 --untracked-files=*)
1520 __gitcomp "$__git_untracked_file_modes" "" "${cur##--untracked-files=}"
1524 __gitcomp_builtin commit "--no-edit --verify"
1528 if __git rev-parse --verify --quiet HEAD >/dev/null; then
1529 __git_complete_index_file "--committable"
1531 # This is the first commit
1532 __git_complete_index_file "--cached"
1540 __gitcomp_builtin describe
1546 __git_diff_algorithms="myers minimal patience histogram"
1548 __git_diff_submodule_formats="diff log short"
1550 __git_diff_common_options="--stat --numstat --shortstat --summary
1551 --patch-with-stat --name-only --name-status --color
1552 --no-color --color-words --no-renames --check
1553 --full-index --binary --abbrev --diff-filter=
1554 --find-copies-harder --ignore-cr-at-eol
1555 --text --ignore-space-at-eol --ignore-space-change
1556 --ignore-all-space --ignore-blank-lines --exit-code
1557 --quiet --ext-diff --no-ext-diff
1558 --no-prefix --src-prefix= --dst-prefix=
1559 --inter-hunk-context=
1560 --patience --histogram --minimal
1561 --raw --word-diff --word-diff-regex=
1562 --dirstat --dirstat= --dirstat-by-file
1563 --dirstat-by-file= --cumulative
1565 --submodule --submodule= --ignore-submodules
1570 __git_has_doubledash && return
1574 __gitcomp "$__git_diff_algorithms" "" "${cur##--diff-algorithm=}"
1578 __gitcomp "$__git_diff_submodule_formats" "" "${cur##--submodule=}"
1582 __gitcomp "--cached --staged --pickaxe-all --pickaxe-regex
1583 --base --ours --theirs --no-index
1584 $__git_diff_common_options
1589 __git_complete_revlist_file
1592 __git_mergetools_common="diffuse diffmerge ecmerge emerge kdiff3 meld opendiff
1593 tkdiff vimdiff gvimdiff xxdiff araxis p4merge bc codecompare
1598 __git_has_doubledash && return
1602 __gitcomp "$__git_mergetools_common kompare" "" "${cur##--tool=}"
1606 __gitcomp_builtin difftool "$__git_diff_common_options
1607 --base --cached --ours --theirs
1608 --pickaxe-all --pickaxe-regex
1614 __git_complete_revlist_file
1617 __git_fetch_recurse_submodules="yes on-demand no"
1622 --recurse-submodules=*)
1623 __gitcomp "$__git_fetch_recurse_submodules" "" "${cur##--recurse-submodules=}"
1627 __gitcomp_builtin fetch "--no-tags"
1631 __git_complete_remote_or_refspec
1634 __git_format_patch_options="
1635 --stdout --attach --no-attach --thread --thread= --no-thread
1636 --numbered --start-number --numbered-files --keep-subject --signoff
1637 --signature --no-signature --in-reply-to= --cc= --full-index --binary
1638 --not --all --cover-letter --no-prefix --src-prefix= --dst-prefix=
1639 --inline --suffix= --ignore-if-in-upstream --subject-prefix=
1640 --output-directory --reroll-count --to= --quiet --notes
1643 _git_format_patch ()
1649 " "" "${cur##--thread=}"
1653 __gitcomp "$__git_format_patch_options"
1657 __git_complete_revlist
1664 __gitcomp_builtin fsck "--no-reflogs"
1675 # Lists matching symbol names from a tag (as in ctags) file.
1676 # 1: List symbol names matching this word.
1677 # 2: The tag file to list symbol names from.
1678 # 3: A prefix to be added to each listed symbol name (optional).
1679 # 4: A suffix to be appended to each listed symbol name (optional).
1680 __git_match_ctag () {
1681 awk -v pfx="${3-}" -v sfx="${4-}" "
1682 /^${1//\//\\/}/ { print pfx \$1 sfx }
1686 # Complete symbol names from a tag file.
1687 # Usage: __git_complete_symbol [<option>]...
1688 # --tags=<file>: The tag file to list symbol names from instead of the
1690 # --pfx=<prefix>: A prefix to be added to each symbol name.
1691 # --cur=<word>: The current symbol name to be completed. Defaults to
1692 # the current word to be completed.
1693 # --sfx=<suffix>: A suffix to be appended to each symbol name instead
1694 # of the default space.
1695 __git_complete_symbol () {
1696 local tags=tags pfx="" cur_="${cur-}" sfx=" "
1698 while test $# != 0; do
1700 --tags=*) tags="${1##--tags=}" ;;
1701 --pfx=*) pfx="${1##--pfx=}" ;;
1702 --cur=*) cur_="${1##--cur=}" ;;
1703 --sfx=*) sfx="${1##--sfx=}" ;;
1709 if test -r "$tags"; then
1710 __gitcomp_direct "$(__git_match_ctag "$cur_" "$tags" "$pfx" "$sfx")"
1716 __git_has_doubledash && return
1720 __gitcomp_builtin grep
1725 case "$cword,$prev" in
1727 __git_complete_symbol && return
1738 __gitcomp_builtin help
1742 __git_compute_all_commands
1743 __gitcomp "$__git_all_commands $(__git_aliases)
1744 attributes cli core-tutorial cvs-migration
1745 diffcore everyday gitk glossary hooks ignore modules
1746 namespaces repository-layout revisions tutorial tutorial-2
1756 false true umask group all world everybody
1757 " "" "${cur##--shared=}"
1761 __gitcomp_builtin init
1771 __gitcomp_builtin ls-files "--no-empty-directory"
1776 # XXX ignore options like --modified and always suggest all cached
1778 __git_complete_index_file "--cached"
1785 __gitcomp_builtin ls-remote
1789 __gitcomp_nl "$(__git_remotes)"
1796 __gitcomp_builtin ls-tree
1804 # Options that go well for log, shortlog and gitk
1805 __git_log_common_options="
1807 --branches --tags --remotes
1808 --first-parent --merges --no-merges
1810 --max-age= --since= --after=
1811 --min-age= --until= --before=
1812 --min-parents= --max-parents=
1813 --no-min-parents --no-max-parents
1815 # Options that go well for log and gitk (not shortlog)
1816 __git_log_gitk_options="
1817 --dense --sparse --full-history
1818 --simplify-merges --simplify-by-decoration
1819 --left-right --notes --no-notes
1821 # Options that go well for log and shortlog (not gitk)
1822 __git_log_shortlog_options="
1823 --author= --committer= --grep=
1824 --all-match --invert-grep
1827 __git_log_pretty_formats="oneline short medium full fuller email raw format:"
1828 __git_log_date_formats="relative iso8601 rfc2822 short local default raw"
1832 __git_has_doubledash && return
1833 __git_find_repo_path
1836 if [ -f "$__git_repo_path/MERGE_HEAD" ]; then
1839 case "$prev,$cur" in
1841 return # fall back to Bash filename completion
1844 __git_complete_symbol --cur="${cur#:}" --sfx=":"
1848 __git_complete_symbol
1853 --pretty=*|--format=*)
1854 __gitcomp "$__git_log_pretty_formats $(__git_pretty_aliases)
1859 __gitcomp "$__git_log_date_formats" "" "${cur##--date=}"
1863 __gitcomp "full short no" "" "${cur##--decorate=}"
1867 __gitcomp "$__git_diff_algorithms" "" "${cur##--diff-algorithm=}"
1871 __gitcomp "$__git_diff_submodule_formats" "" "${cur##--submodule=}"
1876 $__git_log_common_options
1877 $__git_log_shortlog_options
1878 $__git_log_gitk_options
1879 --root --topo-order --date-order --reverse
1880 --follow --full-diff
1881 --abbrev-commit --abbrev=
1882 --relative-date --date=
1883 --pretty= --format= --oneline
1888 --decorate --decorate=
1890 --parents --children
1892 $__git_diff_common_options
1893 --pickaxe-all --pickaxe-regex
1898 return # fall back to Bash filename completion
1901 __git_complete_symbol --cur="${cur#-L:}" --sfx=":"
1905 __git_complete_symbol --pfx="-G" --cur="${cur#-G}"
1909 __git_complete_symbol --pfx="-S" --cur="${cur#-S}"
1913 __git_complete_revlist
1918 __git_complete_strategy && return
1922 __gitcomp_builtin merge "--no-rerere-autoupdate
1923 --no-commit --no-edit --no-ff
1924 --no-log --no-progress
1925 --no-squash --no-stat
1926 --no-verify-signatures
1937 __gitcomp "$__git_mergetools_common tortoisemerge" "" "${cur##--tool=}"
1941 __gitcomp "--tool= --prompt --no-prompt"
1951 __gitcomp_builtin merge-base
1962 __gitcomp_builtin mv
1967 if [ $(__git_count_arguments "mv") -gt 0 ]; then
1968 # We need to show both cached and untracked files (including
1969 # empty directories) since this may not be the last argument.
1970 __git_complete_index_file "--cached --others --directory"
1972 __git_complete_index_file "--cached"
1978 local subcommands='add append copy edit get-ref list merge prune remove show'
1979 local subcommand="$(__git_find_on_cmdline "$subcommands")"
1981 case "$subcommand,$cur" in
1983 __gitcomp_builtin notes
1991 __gitcomp "$subcommands --ref"
1995 *,--reuse-message=*|*,--reedit-message=*)
1996 __git_complete_refs --cur="${cur#*=}"
1999 __gitcomp_builtin notes_$subcommand
2002 # this command does not take a ref, do not complete it
2018 __git_complete_strategy && return
2021 --recurse-submodules=*)
2022 __gitcomp "$__git_fetch_recurse_submodules" "" "${cur##--recurse-submodules=}"
2026 __gitcomp_builtin pull "--no-autostash --no-commit --no-edit
2027 --no-ff --no-log --no-progress --no-rebase
2028 --no-squash --no-stat --no-tags
2029 --no-verify-signatures"
2034 __git_complete_remote_or_refspec
2037 __git_push_recurse_submodules="check on-demand only"
2039 __git_complete_force_with_lease ()
2047 __git_complete_refs --cur="${cur_#*:}"
2050 __git_complete_refs --cur="$cur_"
2059 __gitcomp_nl "$(__git_remotes)"
2062 --recurse-submodules)
2063 __gitcomp "$__git_push_recurse_submodules"
2069 __gitcomp_nl "$(__git_remotes)" "" "${cur##--repo=}"
2072 --recurse-submodules=*)
2073 __gitcomp "$__git_push_recurse_submodules" "" "${cur##--recurse-submodules=}"
2076 --force-with-lease=*)
2077 __git_complete_force_with_lease "${cur##--force-with-lease=}"
2081 __gitcomp_builtin push
2085 __git_complete_remote_or_refspec
2090 __git_find_repo_path
2091 if [ -f "$__git_repo_path"/rebase-merge/interactive ]; then
2092 __gitcomp "--continue --skip --abort --quit --edit-todo --show-current-patch"
2094 elif [ -d "$__git_repo_path"/rebase-apply ] || \
2095 [ -d "$__git_repo_path"/rebase-merge ]; then
2096 __gitcomp "--continue --skip --abort --quit --show-current-patch"
2099 __git_complete_strategy && return
2102 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
2107 --onto --merge --strategy --interactive
2108 --rebase-merges --preserve-merges --stat --no-stat
2109 --committer-date-is-author-date --ignore-date
2110 --ignore-whitespace --whitespace=
2111 --autosquash --no-autosquash
2112 --fork-point --no-fork-point
2113 --autostash --no-autostash
2114 --verify --no-verify
2115 --keep-empty --root --force-rebase --no-ff
2127 local subcommands="show delete expire"
2128 local subcommand="$(__git_find_on_cmdline "$subcommands")"
2130 if [ -z "$subcommand" ]; then
2131 __gitcomp "$subcommands"
2137 __git_send_email_confirm_options="always never auto cc compose"
2138 __git_send_email_suppresscc_options="author self cc bodycc sob cccmd body all"
2143 --to|--cc|--bcc|--from)
2144 __gitcomp "$(__git send-email --dump-aliases)"
2152 $__git_send_email_confirm_options
2153 " "" "${cur##--confirm=}"
2158 $__git_send_email_suppresscc_options
2159 " "" "${cur##--suppress-cc=}"
2163 --smtp-encryption=*)
2164 __gitcomp "ssl tls" "" "${cur##--smtp-encryption=}"
2170 " "" "${cur##--thread=}"
2173 --to=*|--cc=*|--bcc=*|--from=*)
2174 __gitcomp "$(__git send-email --dump-aliases)" "" "${cur#--*=}"
2178 __gitcomp "--annotate --bcc --cc --cc-cmd --chain-reply-to
2179 --compose --confirm= --dry-run --envelope-sender
2181 --in-reply-to --no-chain-reply-to --no-signed-off-by-cc
2182 --no-suppress-from --no-thread --quiet --reply-to
2183 --signed-off-by-cc --smtp-pass --smtp-server
2184 --smtp-server-port --smtp-encryption= --smtp-user
2185 --subject --suppress-cc= --suppress-from --thread --to
2186 --validate --no-validate
2187 $__git_format_patch_options"
2191 __git_complete_revlist
2202 local untracked_state
2205 --ignore-submodules=*)
2206 __gitcomp "none untracked dirty all" "" "${cur##--ignore-submodules=}"
2209 --untracked-files=*)
2210 __gitcomp "$__git_untracked_file_modes" "" "${cur##--untracked-files=}"
2215 always never auto column row plain dense nodense
2216 " "" "${cur##--column=}"
2220 __gitcomp_builtin status "--no-column"
2225 untracked_state="$(__git_get_option_value "-u" "--untracked-files=" \
2226 "$__git_untracked_file_modes" "status.showUntrackedFiles")"
2228 case "$untracked_state" in
2230 # --ignored option does not matter
2234 complete_opt="--cached --directory --no-empty-directory --others"
2236 if [ -n "$(__git_find_on_cmdline "--ignored")" ]; then
2237 complete_opt="$complete_opt --ignored --exclude=*"
2242 __git_complete_index_file "$complete_opt"
2245 __git_config_get_set_variables ()
2247 local prevword word config_file= c=$cword
2248 while [ $c -gt 1 ]; do
2251 --system|--global|--local|--file=*)
2256 config_file="$word $prevword"
2264 __git config $config_file --name-only --list
2270 branch.*.remote|branch.*.pushremote)
2271 __gitcomp_nl "$(__git_remotes)"
2279 __gitcomp "false true merges preserve interactive"
2283 __gitcomp_nl "$(__git_remotes)"
2287 local remote="${prev#remote.}"
2288 remote="${remote%.fetch}"
2289 if [ -z "$cur" ]; then
2290 __gitcomp_nl "refs/heads/" "" "" ""
2293 __gitcomp_nl "$(__git_refs_remotes "$remote")"
2297 local remote="${prev#remote.}"
2298 remote="${remote%.push}"
2299 __gitcomp_nl "$(__git for-each-ref \
2300 --format='%(refname):%(refname)' refs/heads)"
2303 pull.twohead|pull.octopus)
2304 __git_compute_merge_strategies
2305 __gitcomp "$__git_merge_strategies"
2308 color.branch|color.diff|color.interactive|\
2309 color.showbranch|color.status|color.ui)
2310 __gitcomp "always never auto"
2314 __gitcomp "false true"
2319 normal black red green yellow blue magenta cyan white
2320 bold dim ul blink reverse
2325 __gitcomp "log short"
2329 __gitcomp "man info web html"
2333 __gitcomp "$__git_log_date_formats"
2336 sendemail.aliasfiletype)
2337 __gitcomp "mutt mailrc pine elm gnus"
2341 __gitcomp "$__git_send_email_confirm_options"
2344 sendemail.suppresscc)
2345 __gitcomp "$__git_send_email_suppresscc_options"
2348 sendemail.transferencoding)
2349 __gitcomp "7bit 8bit quoted-printable base64"
2352 --get|--get-all|--unset|--unset-all)
2353 __gitcomp_nl "$(__git_config_get_set_variables)"
2362 __gitcomp_builtin config
2366 local pfx="${cur%.*}." cur_="${cur##*.}"
2367 __gitcomp "remote pushremote merge mergeoptions rebase" "$pfx" "$cur_"
2371 local pfx="${cur%.*}." cur_="${cur#*.}"
2372 __gitcomp_direct "$(__git_heads "$pfx" "$cur_" ".")"
2373 __gitcomp_nl_append $'autosetupmerge\nautosetuprebase\n' "$pfx" "$cur_"
2377 local pfx="${cur%.*}." cur_="${cur##*.}"
2379 argprompt cmd confirm needsfile noconsole norescan
2380 prompt revprompt revunmerged title
2385 local pfx="${cur%.*}." cur_="${cur##*.}"
2386 __gitcomp "cmd path" "$pfx" "$cur_"
2390 local pfx="${cur%.*}." cur_="${cur##*.}"
2391 __gitcomp "cmd path" "$pfx" "$cur_"
2395 local pfx="${cur%.*}." cur_="${cur##*.}"
2396 __gitcomp "cmd path trustExitCode" "$pfx" "$cur_"
2400 local pfx="${cur%.*}." cur_="${cur#*.}"
2401 __git_compute_all_commands
2402 __gitcomp_nl "$__git_all_commands" "$pfx" "$cur_"
2406 local pfx="${cur%.*}." cur_="${cur##*.}"
2408 url proxy fetch push mirror skipDefaultUpdate
2409 receivepack uploadpack tagopt pushurl
2414 local pfx="${cur%.*}." cur_="${cur#*.}"
2415 __gitcomp_nl "$(__git_remotes)" "$pfx" "$cur_" "."
2416 __gitcomp_nl_append "pushdefault" "$pfx" "$cur_"
2420 local pfx="${cur%.*}." cur_="${cur##*.}"
2421 __gitcomp "insteadOf pushInsteadOf" "$pfx" "$cur_"
2428 advice.commitBeforeMerge
2430 advice.implicitIdentity
2431 advice.pushAlreadyExists
2432 advice.pushFetchFirst
2433 advice.pushNeedsForce
2434 advice.pushNonFFCurrent
2435 advice.pushNonFFMatching
2436 advice.pushUpdateRejected
2437 advice.resolveConflict
2440 advice.statusUoption
2445 apply.ignorewhitespace
2447 branch.autosetupmerge
2448 branch.autosetuprebase
2452 color.branch.current
2457 color.decorate.branch
2458 color.decorate.remoteBranch
2459 color.decorate.stash
2469 color.diff.whitespace
2474 color.grep.linenumber
2477 color.grep.separator
2479 color.interactive.error
2480 color.interactive.header
2481 color.interactive.help
2482 color.interactive.prompt
2487 color.status.changed
2489 color.status.localBranch
2490 color.status.nobranch
2491 color.status.remoteBranch
2492 color.status.unmerged
2493 color.status.untracked
2494 color.status.updated
2506 core.bigFileThreshold
2512 core.deltaBaseCacheLimit
2517 core.fsyncobjectfiles
2523 core.logAllRefUpdates
2524 core.loosecompression
2527 core.packedGitWindowSize
2528 core.packedRefsTimeout
2530 core.precomposeUnicode
2531 core.preferSymlinkRefs
2536 core.repositoryFormatVersion
2538 core.sharedRepository
2545 core.warnAmbiguousRefs
2549 credential.useHttpPath
2551 credentialCache.ignoreSIGHUP
2552 diff.autorefreshindex
2554 diff.ignoreSubmodules
2561 diff.suppressBlankEmpty
2567 fetch.recurseSubmodules
2578 format.subjectprefix
2592 gc.reflogexpireunreachable
2595 gc.worktreePruneExpire
2597 gitcvs.commitmsgannotation
2598 gitcvs.dbTableNamePrefix
2609 gui.copyblamethreshold
2613 gui.matchtrackingbranch
2614 gui.newbranchtemplate
2615 gui.pruneduringfetch
2616 gui.spellingdictionary
2633 http.sslCertPasswordProtected
2638 i18n.logOutputEncoding
2644 imap.preformattedHTML
2654 interactive.singlekey
2670 mergetool.keepBackup
2671 mergetool.keepTemporaries
2676 notes.rewrite.rebase
2680 pack.deltaCacheLimit
2697 receive.denyCurrentBranch
2698 receive.denyDeleteCurrent
2700 receive.denyNonFastForwards
2703 receive.updateserverinfo
2706 repack.usedeltabaseoffset
2710 sendemail.aliasesfile
2711 sendemail.aliasfiletype
2715 sendemail.chainreplyto
2717 sendemail.envelopesender
2721 sendemail.signedoffbycc
2722 sendemail.smtpdomain
2723 sendemail.smtpencryption
2725 sendemail.smtpserver
2726 sendemail.smtpserveroption
2727 sendemail.smtpserverport
2729 sendemail.suppresscc
2730 sendemail.suppressfrom
2735 sendemail.smtpbatchsize
2736 sendemail.smtprelogindelay
2738 status.relativePaths
2739 status.showUntrackedFiles
2740 status.submodulesummary
2743 transfer.unpackLimit
2756 add rename remove set-head set-branches
2757 get-url set-url show prune update
2759 local subcommand="$(__git_find_on_cmdline "$subcommands")"
2760 if [ -z "$subcommand" ]; then
2763 __gitcomp_builtin remote
2766 __gitcomp "$subcommands"
2772 case "$subcommand,$cur" in
2774 __gitcomp_builtin remote_add "--no-tags"
2779 __gitcomp_builtin remote_set-head
2782 __gitcomp_builtin remote_set-branches
2784 set-head,*|set-branches,*)
2785 __git_complete_remote_or_refspec
2788 __gitcomp_builtin remote_update
2791 __gitcomp "$(__git_get_config_variables "remotes")"
2794 __gitcomp_builtin remote_set-url
2797 __gitcomp_builtin remote_get-url
2800 __gitcomp_builtin remote_prune
2803 __gitcomp_nl "$(__git_remotes)"
2812 __gitcomp_builtin replace
2821 local subcommands="clear forget diff remaining status gc"
2822 local subcommand="$(__git_find_on_cmdline "$subcommands")"
2823 if test -z "$subcommand"
2825 __gitcomp "$subcommands"
2832 __git_has_doubledash && return
2836 __gitcomp_builtin reset
2843 __git_revert_inprogress_options="--continue --quit --abort"
2847 __git_find_repo_path
2848 if [ -f "$__git_repo_path"/REVERT_HEAD ]; then
2849 __gitcomp "$__git_revert_inprogress_options"
2854 __gitcomp_builtin revert "--no-edit" \
2855 "$__git_revert_inprogress_options"
2866 __gitcomp_builtin rm
2871 __git_complete_index_file "--cached"
2876 __git_has_doubledash && return
2881 $__git_log_common_options
2882 $__git_log_shortlog_options
2883 --numbered --summary --email
2888 __git_complete_revlist
2893 __git_has_doubledash && return
2896 --pretty=*|--format=*)
2897 __gitcomp "$__git_log_pretty_formats $(__git_pretty_aliases)
2902 __gitcomp "$__git_diff_algorithms" "" "${cur##--diff-algorithm=}"
2906 __gitcomp "$__git_diff_submodule_formats" "" "${cur##--submodule=}"
2910 __gitcomp "--pretty= --format= --abbrev-commit --oneline
2912 $__git_diff_common_options
2917 __git_complete_revlist_file
2924 __gitcomp_builtin show-branch "--no-color"
2928 __git_complete_revlist
2933 local save_opts='--all --keep-index --no-keep-index --quiet --patch --include-untracked'
2934 local subcommands='push list show apply clear drop pop create branch'
2935 local subcommand="$(__git_find_on_cmdline "$subcommands save")"
2936 if [ -n "$(__git_find_on_cmdline "-p")" ]; then
2939 if [ -z "$subcommand" ]; then
2942 __gitcomp "$save_opts"
2945 if [ -z "$(__git_find_on_cmdline "$save_opts")" ]; then
2950 if [ -z "$(__git_find_on_cmdline "$save_opts")" ]; then
2951 __gitcomp "$subcommands"
2956 case "$subcommand,$cur" in
2958 __gitcomp "$save_opts --message"
2961 __gitcomp "$save_opts"
2964 __gitcomp "--index --quiet"
2969 show,--*|branch,--*)
2972 if [ $cword -eq 3 ]; then
2975 __gitcomp_nl "$(__git stash list \
2976 | sed -n -e 's/:.*//p')"
2979 show,*|apply,*|drop,*|pop,*)
2980 __gitcomp_nl "$(__git stash list \
2981 | sed -n -e 's/:.*//p')"
2991 __git_has_doubledash && return
2993 local subcommands="add status init deinit update summary foreach sync"
2994 local subcommand="$(__git_find_on_cmdline "$subcommands")"
2995 if [ -z "$subcommand" ]; then
3001 __gitcomp "$subcommands"
3007 case "$subcommand,$cur" in
3009 __gitcomp "--branch --force --name --reference --depth"
3012 __gitcomp "--cached --recursive"
3015 __gitcomp "--force --all"
3019 --init --remote --no-fetch
3020 --recommend-shallow --no-recommend-shallow
3021 --force --rebase --merge --reference --depth --recursive --jobs
3025 __gitcomp "--cached --files --summary-limit"
3027 foreach,--*|sync,--*)
3028 __gitcomp "--recursive"
3038 init fetch clone rebase dcommit log find-rev
3039 set-tree commit-diff info create-ignore propget
3040 proplist show-ignore show-externals branch tag blame
3041 migrate mkdirs reset gc
3043 local subcommand="$(__git_find_on_cmdline "$subcommands")"
3044 if [ -z "$subcommand" ]; then
3045 __gitcomp "$subcommands"
3047 local remote_opts="--username= --config-dir= --no-auth-cache"
3049 --follow-parent --authors-file= --repack=
3050 --no-metadata --use-svm-props --use-svnsync-props
3051 --log-window-size= --no-checkout --quiet
3052 --repack-flags --use-log-author --localtime
3054 --ignore-paths= --include-paths= $remote_opts
3057 --template= --shared= --trunk= --tags=
3058 --branches= --stdlayout --minimize-url
3059 --no-metadata --use-svm-props --use-svnsync-props
3060 --rewrite-root= --prefix= $remote_opts
3063 --edit --rmdir --find-copies-harder --copy-similarity=
3066 case "$subcommand,$cur" in
3068 __gitcomp "--revision= --fetch-all $fc_opts"
3071 __gitcomp "--revision= $fc_opts $init_opts"
3074 __gitcomp "$init_opts"
3078 --merge --strategy= --verbose --dry-run
3079 --fetch-all --no-rebase --commit-url
3080 --revision --interactive $cmt_opts $fc_opts
3084 __gitcomp "--stdin $cmt_opts $fc_opts"
3086 create-ignore,--*|propget,--*|proplist,--*|show-ignore,--*|\
3087 show-externals,--*|mkdirs,--*)
3088 __gitcomp "--revision="
3092 --limit= --revision= --verbose --incremental
3093 --oneline --show-commit --non-recursive
3094 --authors-file= --color
3099 --merge --verbose --strategy= --local
3100 --fetch-all --dry-run $fc_opts
3104 __gitcomp "--message= --file= --revision= $cmt_opts"
3110 __gitcomp "--dry-run --message --tag"
3113 __gitcomp "--dry-run --message"
3116 __gitcomp "--git-format"
3120 --config-dir= --ignore-paths= --minimize
3121 --no-auth-cache --username=
3125 __gitcomp "--revision= --parent"
3136 while [ $c -lt $cword ]; do
3139 -d|--delete|-v|--verify)
3140 __gitcomp_direct "$(__git_tags "" "$cur" " ")"
3155 __gitcomp_direct "$(__git_tags "" "$cur" " ")"
3165 __gitcomp_builtin tag
3177 local subcommands="add list lock move prune remove unlock"
3178 local subcommand="$(__git_find_on_cmdline "$subcommands")"
3179 if [ -z "$subcommand" ]; then
3180 __gitcomp "$subcommands"
3182 case "$subcommand,$cur" in
3184 __gitcomp_builtin worktree_add
3187 __gitcomp_builtin worktree_list
3190 __gitcomp_builtin worktree_lock
3193 __gitcomp_builtin worktree_prune
3204 __git_complete_common () {
3209 __gitcomp_builtin "$command"
3214 __git_cmds_with_parseopt_helper=
3215 __git_support_parseopt_helper () {
3216 test -n "$__git_cmds_with_parseopt_helper" ||
3217 __git_cmds_with_parseopt_helper="$(__git --list-parseopt-builtins)"
3219 case " $__git_cmds_with_parseopt_helper " in
3229 __git_complete_command () {
3231 local completion_func="_git_${command//-/_}"
3232 if ! declare -f $completion_func >/dev/null 2>/dev/null &&
3233 declare -f _completion_loader >/dev/null 2>/dev/null
3235 _completion_loader "git-$command"
3237 if declare -f $completion_func >/dev/null 2>/dev/null
3241 elif __git_support_parseopt_helper "$command"
3243 __git_complete_common "$command"
3252 local i c=1 command __git_dir __git_repo_path
3253 local __git_C_args C_args_count=0
3255 while [ $c -lt $cword ]; do
3258 --git-dir=*) __git_dir="${i#--git-dir=}" ;;
3259 --git-dir) ((c++)) ; __git_dir="${words[c]}" ;;
3260 --bare) __git_dir="." ;;
3261 --help) command="help"; break ;;
3262 -c|--work-tree|--namespace) ((c++)) ;;
3263 -C) __git_C_args[C_args_count++]=-C
3265 __git_C_args[C_args_count++]="${words[c]}"
3268 *) command="$i"; break ;;
3273 if [ -z "$command" ]; then
3275 --git-dir|-C|--work-tree)
3276 # these need a path argument, let's fall back to
3277 # Bash filename completion
3281 # we don't support completing these options' arguments
3299 --no-replace-objects
3303 *) __git_compute_porcelain_commands
3304 __gitcomp "$__git_porcelain_commands $(__git_aliases)" ;;
3309 __git_complete_command "$command" && return
3311 local expansion=$(__git_aliased_command "$command")
3312 if [ -n "$expansion" ]; then
3314 __git_complete_command "$expansion"
3320 __git_has_doubledash && return
3322 local __git_repo_path
3323 __git_find_repo_path
3326 if [ -f "$__git_repo_path/MERGE_HEAD" ]; then
3332 $__git_log_common_options
3333 $__git_log_gitk_options
3339 __git_complete_revlist
3342 if [[ -n ${ZSH_VERSION-} ]]; then
3343 echo "WARNING: this script is deprecated, please see git-completion.zsh" 1>&2
3345 autoload -U +X compinit && compinit
3351 local cur_="${3-$cur}"
3357 local c IFS=$' \t\n'
3365 array[${#array[@]}+1]="$c"
3368 compadd -Q -S '' -p "${2-}" -a -- array && _ret=0
3379 compadd -Q -- ${=1} && _ret=0
3388 compadd -Q -S "${4- }" -p "${2-}" -- ${=1} && _ret=0
3391 __gitcomp_file_direct ()
3397 compadd -Q -f -- ${=1} && _ret=0
3406 compadd -Q -p "${2-}" -f -- ${=1} && _ret=0
3411 local _ret=1 cur cword prev
3412 cur=${words[CURRENT]}
3413 prev=${words[CURRENT-1]}
3415 emulate ksh -c __${service}_main
3416 let _ret && _default && _ret=0
3420 compdef _git git gitk
3426 local cur words cword prev
3427 _get_comp_words_by_ref -n =: cur words cword prev
3431 # Setup completion for certain functions defined above by setting common
3432 # variables and workarounds.
3433 # This is NOT a public function; use at your own risk.
3436 local wrapper="__git_wrap${2}"
3437 eval "$wrapper () { __git_func_wrap $2 ; }"
3438 complete -o bashdefault -o default -o nospace -F $wrapper $1 2>/dev/null \
3439 || complete -o default -o nospace -F $wrapper $1
3442 # wrapper for backwards compatibility
3445 __git_wrap__git_main
3448 # wrapper for backwards compatibility
3451 __git_wrap__gitk_main
3454 __git_complete git __git_main
3455 __git_complete gitk __gitk_main
3457 # The following are necessary only for Cygwin, and only are needed
3458 # when the user has tab-completed the executable name and consequently
3459 # included the '.exe' suffix.
3461 if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
3462 __git_complete git.exe __git_main