Merge branch 'fc/completion'
[git.git] / contrib / completion / git-completion.bash
blob91234d47ad7f6e3ee0f45d53f67426eeba6bfaf2
1 #!bash
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 # *) file paths within current working directory and index
17 # *) common --long-options
19 # To use these routines:
21 # 1) Copy this file to somewhere (e.g. ~/.git-completion.sh).
22 # 2) Add the following line to your .bashrc/.zshrc:
23 # source ~/.git-completion.sh
24 # 3) Consider changing your PS1 to also show the current branch,
25 # see git-prompt.sh for details.
27 case "$COMP_WORDBREAKS" in
28 *:*) : great ;;
29 *) COMP_WORDBREAKS="$COMP_WORDBREAKS:"
30 esac
32 # __gitdir accepts 0 or 1 arguments (i.e., location)
33 # returns location of .git repo
34 __gitdir ()
36 # Note: this function is duplicated in git-prompt.sh
37 # When updating it, make sure you update the other one to match.
38 if [ -z "${1-}" ]; then
39 if [ -n "${__git_dir-}" ]; then
40 echo "$__git_dir"
41 elif [ -n "${GIT_DIR-}" ]; then
42 test -d "${GIT_DIR-}" || return 1
43 echo "$GIT_DIR"
44 elif [ -d .git ]; then
45 echo .git
46 else
47 git rev-parse --git-dir 2>/dev/null
49 elif [ -d "$1/.git" ]; then
50 echo "$1/.git"
51 else
52 echo "$1"
56 # The following function is based on code from:
58 # bash_completion - programmable completion functions for bash 3.2+
60 # Copyright © 2006-2008, Ian Macdonald <ian@caliban.org>
61 # © 2009-2010, Bash Completion Maintainers
62 # <bash-completion-devel@lists.alioth.debian.org>
64 # This program is free software; you can redistribute it and/or modify
65 # it under the terms of the GNU General Public License as published by
66 # the Free Software Foundation; either version 2, or (at your option)
67 # any later version.
69 # This program is distributed in the hope that it will be useful,
70 # but WITHOUT ANY WARRANTY; without even the implied warranty of
71 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
72 # GNU General Public License for more details.
74 # You should have received a copy of the GNU General Public License
75 # along with this program; if not, write to the Free Software Foundation,
76 # Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
78 # The latest version of this software can be obtained here:
80 # http://bash-completion.alioth.debian.org/
82 # RELEASE: 2.x
84 # This function can be used to access a tokenized list of words
85 # on the command line:
87 # __git_reassemble_comp_words_by_ref '=:'
88 # if test "${words_[cword_-1]}" = -w
89 # then
90 # ...
91 # fi
93 # The argument should be a collection of characters from the list of
94 # word completion separators (COMP_WORDBREAKS) to treat as ordinary
95 # characters.
97 # This is roughly equivalent to going back in time and setting
98 # COMP_WORDBREAKS to exclude those characters. The intent is to
99 # make option types like --date=<type> and <rev>:<path> easy to
100 # recognize by treating each shell word as a single token.
102 # It is best not to set COMP_WORDBREAKS directly because the value is
103 # shared with other completion scripts. By the time the completion
104 # function gets called, COMP_WORDS has already been populated so local
105 # changes to COMP_WORDBREAKS have no effect.
107 # Output: words_, cword_, cur_.
109 __git_reassemble_comp_words_by_ref()
111 local exclude i j first
112 # Which word separators to exclude?
113 exclude="${1//[^$COMP_WORDBREAKS]}"
114 cword_=$COMP_CWORD
115 if [ -z "$exclude" ]; then
116 words_=("${COMP_WORDS[@]}")
117 return
119 # List of word completion separators has shrunk;
120 # re-assemble words to complete.
121 for ((i=0, j=0; i < ${#COMP_WORDS[@]}; i++, j++)); do
122 # Append each nonempty word consisting of just
123 # word separator characters to the current word.
124 first=t
125 while
126 [ $i -gt 0 ] &&
127 [ -n "${COMP_WORDS[$i]}" ] &&
128 # word consists of excluded word separators
129 [ "${COMP_WORDS[$i]//[^$exclude]}" = "${COMP_WORDS[$i]}" ]
131 # Attach to the previous token,
132 # unless the previous token is the command name.
133 if [ $j -ge 2 ] && [ -n "$first" ]; then
134 ((j--))
136 first=
137 words_[$j]=${words_[j]}${COMP_WORDS[i]}
138 if [ $i = $COMP_CWORD ]; then
139 cword_=$j
141 if (($i < ${#COMP_WORDS[@]} - 1)); then
142 ((i++))
143 else
144 # Done.
145 return
147 done
148 words_[$j]=${words_[j]}${COMP_WORDS[i]}
149 if [ $i = $COMP_CWORD ]; then
150 cword_=$j
152 done
155 if ! type _get_comp_words_by_ref >/dev/null 2>&1; then
156 _get_comp_words_by_ref ()
158 local exclude cur_ words_ cword_
159 if [ "$1" = "-n" ]; then
160 exclude=$2
161 shift 2
163 __git_reassemble_comp_words_by_ref "$exclude"
164 cur_=${words_[cword_]}
165 while [ $# -gt 0 ]; do
166 case "$1" in
167 cur)
168 cur=$cur_
170 prev)
171 prev=${words_[$cword_-1]}
173 words)
174 words=("${words_[@]}")
176 cword)
177 cword=$cword_
179 esac
180 shift
181 done
185 __gitcompadd ()
187 local i=0
188 for x in $1; do
189 if [[ "$x" == "$3"* ]]; then
190 COMPREPLY[i++]="$2$x$4"
192 done
195 # Generates completion reply, appending a space to possible completion words,
196 # if necessary.
197 # It accepts 1 to 4 arguments:
198 # 1: List of possible completion words.
199 # 2: A prefix to be added to each possible completion word (optional).
200 # 3: Generate possible completion matches for this word (optional).
201 # 4: A suffix to be appended to each possible completion word (optional).
202 __gitcomp ()
204 local cur_="${3-$cur}"
206 case "$cur_" in
207 --*=)
210 local c i=0 IFS=$' \t\n'
211 for c in $1; do
212 c="$c${4-}"
213 if [[ $c == "$cur_"* ]]; then
214 case $c in
215 --*=*|*.) ;;
216 *) c="$c " ;;
217 esac
218 COMPREPLY[i++]="${2-}$c"
220 done
222 esac
225 # Generates completion reply from newline-separated possible completion words
226 # by appending a space to all of them.
227 # It accepts 1 to 4 arguments:
228 # 1: List of possible completion words, separated by a single newline.
229 # 2: A prefix to be added to each possible completion word (optional).
230 # 3: Generate possible completion matches for this word (optional).
231 # 4: A suffix to be appended to each possible completion word instead of
232 # the default space (optional). If specified but empty, nothing is
233 # appended.
234 __gitcomp_nl ()
236 local IFS=$'\n'
237 __gitcompadd "$1" "${2-}" "${3-$cur}" "${4- }"
240 # Generates completion reply with compgen from newline-separated possible
241 # completion filenames.
242 # It accepts 1 to 3 arguments:
243 # 1: List of possible completion filenames, separated by a single newline.
244 # 2: A directory prefix to be added to each possible completion filename
245 # (optional).
246 # 3: Generate possible completion matches for this word (optional).
247 __gitcomp_file ()
249 local IFS=$'\n'
251 # XXX does not work when the directory prefix contains a tilde,
252 # since tilde expansion is not applied.
253 # This means that COMPREPLY will be empty and Bash default
254 # completion will be used.
255 __gitcompadd "$1" "${2-}" "${3-$cur}" ""
257 # use a hack to enable file mode in bash < 4
258 compopt -o filenames +o nospace 2>/dev/null ||
259 compgen -f /non-existing-dir/ > /dev/null
262 # Execute 'git ls-files', unless the --committable option is specified, in
263 # which case it runs 'git diff-index' to find out the files that can be
264 # committed. It return paths relative to the directory specified in the first
265 # argument, and using the options specified in the second argument.
266 __git_ls_files_helper ()
269 test -n "${CDPATH+set}" && unset CDPATH
270 cd "$1"
271 if [ "$2" == "--committable" ]; then
272 git diff-index --name-only --relative HEAD
273 else
274 # NOTE: $2 is not quoted in order to support multiple options
275 git ls-files --exclude-standard $2
277 ) 2>/dev/null
281 # __git_index_files accepts 1 or 2 arguments:
282 # 1: Options to pass to ls-files (required).
283 # 2: A directory path (optional).
284 # If provided, only files within the specified directory are listed.
285 # Sub directories are never recursed. Path must have a trailing
286 # slash.
287 __git_index_files ()
289 local dir="$(__gitdir)" root="${2-.}" file
291 if [ -d "$dir" ]; then
292 __git_ls_files_helper "$root" "$1" |
293 while read -r file; do
294 case "$file" in
295 ?*/*) echo "${file%%/*}" ;;
296 *) echo "$file" ;;
297 esac
298 done | sort | uniq
302 __git_heads ()
304 local dir="$(__gitdir)"
305 if [ -d "$dir" ]; then
306 git --git-dir="$dir" for-each-ref --format='%(refname:short)' \
307 refs/heads
308 return
312 __git_tags ()
314 local dir="$(__gitdir)"
315 if [ -d "$dir" ]; then
316 git --git-dir="$dir" for-each-ref --format='%(refname:short)' \
317 refs/tags
318 return
322 # __git_refs accepts 0, 1 (to pass to __gitdir), or 2 arguments
323 # presence of 2nd argument means use the guess heuristic employed
324 # by checkout for tracking branches
325 __git_refs ()
327 local i hash dir="$(__gitdir "${1-}")" track="${2-}"
328 local format refs
329 if [ -d "$dir" ]; then
330 case "$cur" in
331 refs|refs/*)
332 format="refname"
333 refs="${cur%/*}"
334 track=""
337 for i in HEAD FETCH_HEAD ORIG_HEAD MERGE_HEAD; do
338 if [ -e "$dir/$i" ]; then echo $i; fi
339 done
340 format="refname:short"
341 refs="refs/tags refs/heads refs/remotes"
343 esac
344 git --git-dir="$dir" for-each-ref --format="%($format)" \
345 $refs
346 if [ -n "$track" ]; then
347 # employ the heuristic used by git checkout
348 # Try to find a remote branch that matches the completion word
349 # but only output if the branch name is unique
350 local ref entry
351 git --git-dir="$dir" for-each-ref --shell --format="ref=%(refname:short)" \
352 "refs/remotes/" | \
353 while read -r entry; do
354 eval "$entry"
355 ref="${ref#*/}"
356 if [[ "$ref" == "$cur"* ]]; then
357 echo "$ref"
359 done | sort | uniq -u
361 return
363 case "$cur" in
364 refs|refs/*)
365 git ls-remote "$dir" "$cur*" 2>/dev/null | \
366 while read -r hash i; do
367 case "$i" in
368 *^{}) ;;
369 *) echo "$i" ;;
370 esac
371 done
374 git ls-remote "$dir" HEAD ORIG_HEAD 'refs/tags/*' 'refs/heads/*' 'refs/remotes/*' 2>/dev/null | \
375 while read -r hash i; do
376 case "$i" in
377 *^{}) ;;
378 refs/*) echo "${i#refs/*/}" ;;
379 *) echo "$i" ;;
380 esac
381 done
383 esac
386 # __git_refs2 requires 1 argument (to pass to __git_refs)
387 __git_refs2 ()
389 local i
390 for i in $(__git_refs "$1"); do
391 echo "$i:$i"
392 done
395 # __git_refs_remotes requires 1 argument (to pass to ls-remote)
396 __git_refs_remotes ()
398 local i hash
399 git ls-remote "$1" 'refs/heads/*' 2>/dev/null | \
400 while read -r hash i; do
401 echo "$i:refs/remotes/$1/${i#refs/heads/}"
402 done
405 __git_remotes ()
407 local i IFS=$'\n' d="$(__gitdir)"
408 test -d "$d/remotes" && ls -1 "$d/remotes"
409 for i in $(git --git-dir="$d" config --get-regexp 'remote\..*\.url' 2>/dev/null); do
410 i="${i#remote.}"
411 echo "${i/.url*/}"
412 done
415 __git_list_merge_strategies ()
417 git merge -s help 2>&1 |
418 sed -n -e '/[Aa]vailable strategies are: /,/^$/{
419 s/\.$//
420 s/.*://
421 s/^[ ]*//
422 s/[ ]*$//
427 __git_merge_strategies=
428 # 'git merge -s help' (and thus detection of the merge strategy
429 # list) fails, unfortunately, if run outside of any git working
430 # tree. __git_merge_strategies is set to the empty string in
431 # that case, and the detection will be repeated the next time it
432 # is needed.
433 __git_compute_merge_strategies ()
435 test -n "$__git_merge_strategies" ||
436 __git_merge_strategies=$(__git_list_merge_strategies)
439 __git_complete_revlist_file ()
441 local pfx ls ref cur_="$cur"
442 case "$cur_" in
443 *..?*:*)
444 return
446 ?*:*)
447 ref="${cur_%%:*}"
448 cur_="${cur_#*:}"
449 case "$cur_" in
450 ?*/*)
451 pfx="${cur_%/*}"
452 cur_="${cur_##*/}"
453 ls="$ref:$pfx"
454 pfx="$pfx/"
457 ls="$ref"
459 esac
461 case "$COMP_WORDBREAKS" in
462 *:*) : great ;;
463 *) pfx="$ref:$pfx" ;;
464 esac
466 __gitcomp_nl "$(git --git-dir="$(__gitdir)" ls-tree "$ls" 2>/dev/null \
467 | sed '/^100... blob /{
468 s,^.* ,,
469 s,$, ,
471 /^120000 blob /{
472 s,^.* ,,
473 s,$, ,
475 /^040000 tree /{
476 s,^.* ,,
477 s,$,/,
479 s/^.* //')" \
480 "$pfx" "$cur_" ""
482 *...*)
483 pfx="${cur_%...*}..."
484 cur_="${cur_#*...}"
485 __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
487 *..*)
488 pfx="${cur_%..*}.."
489 cur_="${cur_#*..}"
490 __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
493 __gitcomp_nl "$(__git_refs)"
495 esac
499 # __git_complete_index_file requires 1 argument:
500 # 1: the options to pass to ls-file
502 # The exception is --committable, which finds the files appropriate commit.
503 __git_complete_index_file ()
505 local pfx="" cur_="$cur"
507 case "$cur_" in
508 ?*/*)
509 pfx="${cur_%/*}"
510 cur_="${cur_##*/}"
511 pfx="${pfx}/"
513 esac
515 __gitcomp_file "$(__git_index_files "$1" "$pfx")" "$pfx" "$cur_"
518 __git_complete_file ()
520 __git_complete_revlist_file
523 __git_complete_revlist ()
525 __git_complete_revlist_file
528 __git_complete_remote_or_refspec ()
530 local cur_="$cur" cmd="${words[1]}"
531 local i c=2 remote="" pfx="" lhs=1 no_complete_refspec=0
532 if [ "$cmd" = "remote" ]; then
533 ((c++))
535 while [ $c -lt $cword ]; do
536 i="${words[c]}"
537 case "$i" in
538 --mirror) [ "$cmd" = "push" ] && no_complete_refspec=1 ;;
539 --all)
540 case "$cmd" in
541 push) no_complete_refspec=1 ;;
542 fetch)
543 return
545 *) ;;
546 esac
548 -*) ;;
549 *) remote="$i"; break ;;
550 esac
551 ((c++))
552 done
553 if [ -z "$remote" ]; then
554 __gitcomp_nl "$(__git_remotes)"
555 return
557 if [ $no_complete_refspec = 1 ]; then
558 return
560 [ "$remote" = "." ] && remote=
561 case "$cur_" in
562 *:*)
563 case "$COMP_WORDBREAKS" in
564 *:*) : great ;;
565 *) pfx="${cur_%%:*}:" ;;
566 esac
567 cur_="${cur_#*:}"
568 lhs=0
571 pfx="+"
572 cur_="${cur_#+}"
574 esac
575 case "$cmd" in
576 fetch)
577 if [ $lhs = 1 ]; then
578 __gitcomp_nl "$(__git_refs2 "$remote")" "$pfx" "$cur_"
579 else
580 __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
583 pull|remote)
584 if [ $lhs = 1 ]; then
585 __gitcomp_nl "$(__git_refs "$remote")" "$pfx" "$cur_"
586 else
587 __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
590 push)
591 if [ $lhs = 1 ]; then
592 __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
593 else
594 __gitcomp_nl "$(__git_refs "$remote")" "$pfx" "$cur_"
597 esac
600 __git_complete_strategy ()
602 __git_compute_merge_strategies
603 case "$prev" in
604 -s|--strategy)
605 __gitcomp "$__git_merge_strategies"
606 return 0
607 esac
608 case "$cur" in
609 --strategy=*)
610 __gitcomp "$__git_merge_strategies" "" "${cur##--strategy=}"
611 return 0
613 esac
614 return 1
617 __git_commands () {
618 if test -n "${GIT_TESTING_COMMAND_COMPLETION:-}"
619 then
620 printf "%s" "${GIT_TESTING_COMMAND_COMPLETION}"
621 else
622 git help -a|egrep '^ [a-zA-Z0-9]'
626 __git_list_all_commands ()
628 local i IFS=" "$'\n'
629 for i in $(__git_commands)
631 case $i in
632 *--*) : helper pattern;;
633 *) echo $i;;
634 esac
635 done
638 __git_all_commands=
639 __git_compute_all_commands ()
641 test -n "$__git_all_commands" ||
642 __git_all_commands=$(__git_list_all_commands)
645 __git_list_porcelain_commands ()
647 local i IFS=" "$'\n'
648 __git_compute_all_commands
649 for i in $__git_all_commands
651 case $i in
652 *--*) : helper pattern;;
653 applymbox) : ask gittus;;
654 applypatch) : ask gittus;;
655 archimport) : import;;
656 cat-file) : plumbing;;
657 check-attr) : plumbing;;
658 check-ignore) : plumbing;;
659 check-ref-format) : plumbing;;
660 checkout-index) : plumbing;;
661 commit-tree) : plumbing;;
662 count-objects) : infrequent;;
663 credential-cache) : credentials helper;;
664 credential-store) : credentials helper;;
665 cvsexportcommit) : export;;
666 cvsimport) : import;;
667 cvsserver) : daemon;;
668 daemon) : daemon;;
669 diff-files) : plumbing;;
670 diff-index) : plumbing;;
671 diff-tree) : plumbing;;
672 fast-import) : import;;
673 fast-export) : export;;
674 fsck-objects) : plumbing;;
675 fetch-pack) : plumbing;;
676 fmt-merge-msg) : plumbing;;
677 for-each-ref) : plumbing;;
678 hash-object) : plumbing;;
679 http-*) : transport;;
680 index-pack) : plumbing;;
681 init-db) : deprecated;;
682 local-fetch) : plumbing;;
683 lost-found) : infrequent;;
684 ls-files) : plumbing;;
685 ls-remote) : plumbing;;
686 ls-tree) : plumbing;;
687 mailinfo) : plumbing;;
688 mailsplit) : plumbing;;
689 merge-*) : plumbing;;
690 mktree) : plumbing;;
691 mktag) : plumbing;;
692 pack-objects) : plumbing;;
693 pack-redundant) : plumbing;;
694 pack-refs) : plumbing;;
695 parse-remote) : plumbing;;
696 patch-id) : plumbing;;
697 peek-remote) : plumbing;;
698 prune) : plumbing;;
699 prune-packed) : plumbing;;
700 quiltimport) : import;;
701 read-tree) : plumbing;;
702 receive-pack) : plumbing;;
703 remote-*) : transport;;
704 repo-config) : deprecated;;
705 rerere) : plumbing;;
706 rev-list) : plumbing;;
707 rev-parse) : plumbing;;
708 runstatus) : plumbing;;
709 sh-setup) : internal;;
710 shell) : daemon;;
711 show-ref) : plumbing;;
712 send-pack) : plumbing;;
713 show-index) : plumbing;;
714 ssh-*) : transport;;
715 stripspace) : plumbing;;
716 symbolic-ref) : plumbing;;
717 tar-tree) : deprecated;;
718 unpack-file) : plumbing;;
719 unpack-objects) : plumbing;;
720 update-index) : plumbing;;
721 update-ref) : plumbing;;
722 update-server-info) : daemon;;
723 upload-archive) : plumbing;;
724 upload-pack) : plumbing;;
725 write-tree) : plumbing;;
726 var) : infrequent;;
727 verify-pack) : infrequent;;
728 verify-tag) : plumbing;;
729 *) echo $i;;
730 esac
731 done
734 __git_porcelain_commands=
735 __git_compute_porcelain_commands ()
737 __git_compute_all_commands
738 test -n "$__git_porcelain_commands" ||
739 __git_porcelain_commands=$(__git_list_porcelain_commands)
742 __git_pretty_aliases ()
744 local i IFS=$'\n'
745 for i in $(git --git-dir="$(__gitdir)" config --get-regexp "pretty\..*" 2>/dev/null); do
746 case "$i" in
747 pretty.*)
748 i="${i#pretty.}"
749 echo "${i/ */}"
751 esac
752 done
755 __git_aliases ()
757 local i IFS=$'\n'
758 for i in $(git --git-dir="$(__gitdir)" config --get-regexp "alias\..*" 2>/dev/null); do
759 case "$i" in
760 alias.*)
761 i="${i#alias.}"
762 echo "${i/ */}"
764 esac
765 done
768 # __git_aliased_command requires 1 argument
769 __git_aliased_command ()
771 local word cmdline=$(git --git-dir="$(__gitdir)" \
772 config --get "alias.$1")
773 for word in $cmdline; do
774 case "$word" in
775 \!gitk|gitk)
776 echo "gitk"
777 return
779 \!*) : shell command alias ;;
780 -*) : option ;;
781 *=*) : setting env ;;
782 git) : git itself ;;
784 echo "$word"
785 return
786 esac
787 done
790 # __git_find_on_cmdline requires 1 argument
791 __git_find_on_cmdline ()
793 local word subcommand c=1
794 while [ $c -lt $cword ]; do
795 word="${words[c]}"
796 for subcommand in $1; do
797 if [ "$subcommand" = "$word" ]; then
798 echo "$subcommand"
799 return
801 done
802 ((c++))
803 done
806 __git_has_doubledash ()
808 local c=1
809 while [ $c -lt $cword ]; do
810 if [ "--" = "${words[c]}" ]; then
811 return 0
813 ((c++))
814 done
815 return 1
818 # Try to count non option arguments passed on the command line for the
819 # specified git command.
820 # When options are used, it is necessary to use the special -- option to
821 # tell the implementation were non option arguments begin.
822 # XXX this can not be improved, since options can appear everywhere, as
823 # an example:
824 # git mv x -n y
826 # __git_count_arguments requires 1 argument: the git command executed.
827 __git_count_arguments ()
829 local word i c=0
831 # Skip "git" (first argument)
832 for ((i=1; i < ${#words[@]}; i++)); do
833 word="${words[i]}"
835 case "$word" in
837 # Good; we can assume that the following are only non
838 # option arguments.
839 ((c = 0))
841 "$1")
842 # Skip the specified git command and discard git
843 # main options
844 ((c = 0))
847 ((c++))
849 esac
850 done
852 printf "%d" $c
855 __git_whitespacelist="nowarn warn error error-all fix"
857 _git_am ()
859 local dir="$(__gitdir)"
860 if [ -d "$dir"/rebase-apply ]; then
861 __gitcomp "--skip --continue --resolved --abort"
862 return
864 case "$cur" in
865 --whitespace=*)
866 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
867 return
869 --*)
870 __gitcomp "
871 --3way --committer-date-is-author-date --ignore-date
872 --ignore-whitespace --ignore-space-change
873 --interactive --keep --no-utf8 --signoff --utf8
874 --whitespace= --scissors
876 return
877 esac
880 _git_apply ()
882 case "$cur" in
883 --whitespace=*)
884 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
885 return
887 --*)
888 __gitcomp "
889 --stat --numstat --summary --check --index
890 --cached --index-info --reverse --reject --unidiff-zero
891 --apply --no-add --exclude=
892 --ignore-whitespace --ignore-space-change
893 --whitespace= --inaccurate-eof --verbose
895 return
896 esac
899 _git_add ()
901 case "$cur" in
902 --*)
903 __gitcomp "
904 --interactive --refresh --patch --update --dry-run
905 --ignore-errors --intent-to-add
907 return
908 esac
910 # XXX should we check for --update and --all options ?
911 __git_complete_index_file "--others --modified"
914 _git_archive ()
916 case "$cur" in
917 --format=*)
918 __gitcomp "$(git archive --list)" "" "${cur##--format=}"
919 return
921 --remote=*)
922 __gitcomp_nl "$(__git_remotes)" "" "${cur##--remote=}"
923 return
925 --*)
926 __gitcomp "
927 --format= --list --verbose
928 --prefix= --remote= --exec=
930 return
932 esac
933 __git_complete_file
936 _git_bisect ()
938 __git_has_doubledash && return
940 local subcommands="start bad good skip reset visualize replay log run"
941 local subcommand="$(__git_find_on_cmdline "$subcommands")"
942 if [ -z "$subcommand" ]; then
943 if [ -f "$(__gitdir)"/BISECT_START ]; then
944 __gitcomp "$subcommands"
945 else
946 __gitcomp "replay start"
948 return
951 case "$subcommand" in
952 bad|good|reset|skip|start)
953 __gitcomp_nl "$(__git_refs)"
957 esac
960 _git_branch ()
962 local i c=1 only_local_ref="n" has_r="n"
964 while [ $c -lt $cword ]; do
965 i="${words[c]}"
966 case "$i" in
967 -d|-m) only_local_ref="y" ;;
968 -r) has_r="y" ;;
969 esac
970 ((c++))
971 done
973 case "$cur" in
974 --set-upstream-to=*)
975 __gitcomp "$(__git_refs)" "" "${cur##--set-upstream-to=}"
977 --*)
978 __gitcomp "
979 --color --no-color --verbose --abbrev= --no-abbrev
980 --track --no-track --contains --merged --no-merged
981 --set-upstream-to= --edit-description --list
982 --unset-upstream
986 if [ $only_local_ref = "y" -a $has_r = "n" ]; then
987 __gitcomp_nl "$(__git_heads)"
988 else
989 __gitcomp_nl "$(__git_refs)"
992 esac
995 _git_bundle ()
997 local cmd="${words[2]}"
998 case "$cword" in
1000 __gitcomp "create list-heads verify unbundle"
1003 # looking for a file
1006 case "$cmd" in
1007 create)
1008 __git_complete_revlist
1010 esac
1012 esac
1015 _git_checkout ()
1017 __git_has_doubledash && return
1019 case "$cur" in
1020 --conflict=*)
1021 __gitcomp "diff3 merge" "" "${cur##--conflict=}"
1023 --*)
1024 __gitcomp "
1025 --quiet --ours --theirs --track --no-track --merge
1026 --conflict= --orphan --patch
1030 # check if --track, --no-track, or --no-guess was specified
1031 # if so, disable DWIM mode
1032 local flags="--track --no-track --no-guess" track=1
1033 if [ -n "$(__git_find_on_cmdline "$flags")" ]; then
1034 track=''
1036 __gitcomp_nl "$(__git_refs '' $track)"
1038 esac
1041 _git_cherry ()
1043 __gitcomp "$(__git_refs)"
1046 _git_cherry_pick ()
1048 local dir="$(__gitdir)"
1049 if [ -f "$dir"/CHERRY_PICK_HEAD ]; then
1050 __gitcomp "--continue --quit --abort"
1051 return
1053 case "$cur" in
1054 --*)
1055 __gitcomp "--edit --no-commit --signoff --strategy= --mainline"
1058 __gitcomp_nl "$(__git_refs)"
1060 esac
1063 _git_clean ()
1065 case "$cur" in
1066 --*)
1067 __gitcomp "--dry-run --quiet"
1068 return
1070 esac
1072 # XXX should we check for -x option ?
1073 __git_complete_index_file "--others"
1076 _git_clone ()
1078 case "$cur" in
1079 --*)
1080 __gitcomp "
1081 --local
1082 --no-hardlinks
1083 --shared
1084 --reference
1085 --quiet
1086 --no-checkout
1087 --bare
1088 --mirror
1089 --origin
1090 --upload-pack
1091 --template=
1092 --depth
1093 --single-branch
1094 --branch
1096 return
1098 esac
1101 _git_commit ()
1103 case "$prev" in
1104 -c|-C)
1105 __gitcomp_nl "$(__git_refs)" "" "${cur}"
1106 return
1108 esac
1110 case "$cur" in
1111 --cleanup=*)
1112 __gitcomp "default strip verbatim whitespace
1113 " "" "${cur##--cleanup=}"
1114 return
1116 --reuse-message=*|--reedit-message=*|\
1117 --fixup=*|--squash=*)
1118 __gitcomp_nl "$(__git_refs)" "" "${cur#*=}"
1119 return
1121 --untracked-files=*)
1122 __gitcomp "all no normal" "" "${cur##--untracked-files=}"
1123 return
1125 --*)
1126 __gitcomp "
1127 --all --author= --signoff --verify --no-verify
1128 --edit --no-edit
1129 --amend --include --only --interactive
1130 --dry-run --reuse-message= --reedit-message=
1131 --reset-author --file= --message= --template=
1132 --cleanup= --untracked-files --untracked-files=
1133 --verbose --quiet --fixup= --squash=
1135 return
1136 esac
1138 if git rev-parse --verify --quiet HEAD >/dev/null; then
1139 __git_complete_index_file "--committable"
1140 else
1141 # This is the first commit
1142 __git_complete_index_file "--cached"
1146 _git_describe ()
1148 case "$cur" in
1149 --*)
1150 __gitcomp "
1151 --all --tags --contains --abbrev= --candidates=
1152 --exact-match --debug --long --match --always
1154 return
1155 esac
1156 __gitcomp_nl "$(__git_refs)"
1159 __git_diff_algorithms="myers minimal patience histogram"
1161 __git_diff_common_options="--stat --numstat --shortstat --summary
1162 --patch-with-stat --name-only --name-status --color
1163 --no-color --color-words --no-renames --check
1164 --full-index --binary --abbrev --diff-filter=
1165 --find-copies-harder
1166 --text --ignore-space-at-eol --ignore-space-change
1167 --ignore-all-space --exit-code --quiet --ext-diff
1168 --no-ext-diff
1169 --no-prefix --src-prefix= --dst-prefix=
1170 --inter-hunk-context=
1171 --patience --histogram --minimal
1172 --raw
1173 --dirstat --dirstat= --dirstat-by-file
1174 --dirstat-by-file= --cumulative
1175 --diff-algorithm=
1178 _git_diff ()
1180 __git_has_doubledash && return
1182 case "$cur" in
1183 --diff-algorithm=*)
1184 __gitcomp "$__git_diff_algorithms" "" "${cur##--diff-algorithm=}"
1185 return
1187 --*)
1188 __gitcomp "--cached --staged --pickaxe-all --pickaxe-regex
1189 --base --ours --theirs --no-index
1190 $__git_diff_common_options
1192 return
1194 esac
1195 __git_complete_revlist_file
1198 __git_mergetools_common="diffuse ecmerge emerge kdiff3 meld opendiff
1199 tkdiff vimdiff gvimdiff xxdiff araxis p4merge bc3 codecompare
1202 _git_difftool ()
1204 __git_has_doubledash && return
1206 case "$cur" in
1207 --tool=*)
1208 __gitcomp "$__git_mergetools_common kompare" "" "${cur##--tool=}"
1209 return
1211 --*)
1212 __gitcomp "--cached --staged --pickaxe-all --pickaxe-regex
1213 --base --ours --theirs
1214 --no-renames --diff-filter= --find-copies-harder
1215 --relative --ignore-submodules
1216 --tool="
1217 return
1219 esac
1220 __git_complete_file
1223 __git_fetch_options="
1224 --quiet --verbose --append --upload-pack --force --keep --depth=
1225 --tags --no-tags --all --prune --dry-run
1228 _git_fetch ()
1230 case "$cur" in
1231 --*)
1232 __gitcomp "$__git_fetch_options"
1233 return
1235 esac
1236 __git_complete_remote_or_refspec
1239 __git_format_patch_options="
1240 --stdout --attach --no-attach --thread --thread= --no-thread
1241 --numbered --start-number --numbered-files --keep-subject --signoff
1242 --signature --no-signature --in-reply-to= --cc= --full-index --binary
1243 --not --all --cover-letter --no-prefix --src-prefix= --dst-prefix=
1244 --inline --suffix= --ignore-if-in-upstream --subject-prefix=
1245 --output-directory --reroll-count --to= --quiet --notes
1248 _git_format_patch ()
1250 case "$cur" in
1251 --thread=*)
1252 __gitcomp "
1253 deep shallow
1254 " "" "${cur##--thread=}"
1255 return
1257 --*)
1258 __gitcomp "$__git_format_patch_options"
1259 return
1261 esac
1262 __git_complete_revlist
1265 _git_fsck ()
1267 case "$cur" in
1268 --*)
1269 __gitcomp "
1270 --tags --root --unreachable --cache --no-reflogs --full
1271 --strict --verbose --lost-found
1273 return
1275 esac
1278 _git_gc ()
1280 case "$cur" in
1281 --*)
1282 __gitcomp "--prune --aggressive"
1283 return
1285 esac
1288 _git_gitk ()
1290 _gitk
1293 __git_match_ctag() {
1294 awk "/^${1////\\/}/ { print \$1 }" "$2"
1297 _git_grep ()
1299 __git_has_doubledash && return
1301 case "$cur" in
1302 --*)
1303 __gitcomp "
1304 --cached
1305 --text --ignore-case --word-regexp --invert-match
1306 --full-name --line-number
1307 --extended-regexp --basic-regexp --fixed-strings
1308 --perl-regexp
1309 --files-with-matches --name-only
1310 --files-without-match
1311 --max-depth
1312 --count
1313 --and --or --not --all-match
1315 return
1317 esac
1319 case "$cword,$prev" in
1320 2,*|*,-*)
1321 if test -r tags; then
1322 __gitcomp_nl "$(__git_match_ctag "$cur" tags)"
1323 return
1326 esac
1328 __gitcomp_nl "$(__git_refs)"
1331 _git_help ()
1333 case "$cur" in
1334 --*)
1335 __gitcomp "--all --info --man --web"
1336 return
1338 esac
1339 __git_compute_all_commands
1340 __gitcomp "$__git_all_commands $(__git_aliases)
1341 attributes cli core-tutorial cvs-migration
1342 diffcore gitk glossary hooks ignore modules
1343 namespaces repository-layout tutorial tutorial-2
1344 workflows
1348 _git_init ()
1350 case "$cur" in
1351 --shared=*)
1352 __gitcomp "
1353 false true umask group all world everybody
1354 " "" "${cur##--shared=}"
1355 return
1357 --*)
1358 __gitcomp "--quiet --bare --template= --shared --shared="
1359 return
1361 esac
1364 _git_ls_files ()
1366 case "$cur" in
1367 --*)
1368 __gitcomp "--cached --deleted --modified --others --ignored
1369 --stage --directory --no-empty-directory --unmerged
1370 --killed --exclude= --exclude-from=
1371 --exclude-per-directory= --exclude-standard
1372 --error-unmatch --with-tree= --full-name
1373 --abbrev --ignored --exclude-per-directory
1375 return
1377 esac
1379 # XXX ignore options like --modified and always suggest all cached
1380 # files.
1381 __git_complete_index_file "--cached"
1384 _git_ls_remote ()
1386 __gitcomp_nl "$(__git_remotes)"
1389 _git_ls_tree ()
1391 __git_complete_file
1394 # Options that go well for log, shortlog and gitk
1395 __git_log_common_options="
1396 --not --all
1397 --branches --tags --remotes
1398 --first-parent --merges --no-merges
1399 --max-count=
1400 --max-age= --since= --after=
1401 --min-age= --until= --before=
1402 --min-parents= --max-parents=
1403 --no-min-parents --no-max-parents
1405 # Options that go well for log and gitk (not shortlog)
1406 __git_log_gitk_options="
1407 --dense --sparse --full-history
1408 --simplify-merges --simplify-by-decoration
1409 --left-right --notes --no-notes
1411 # Options that go well for log and shortlog (not gitk)
1412 __git_log_shortlog_options="
1413 --author= --committer= --grep=
1414 --all-match
1417 __git_log_pretty_formats="oneline short medium full fuller email raw format:"
1418 __git_log_date_formats="relative iso8601 rfc2822 short local default raw"
1420 _git_log ()
1422 __git_has_doubledash && return
1424 local g="$(git rev-parse --git-dir 2>/dev/null)"
1425 local merge=""
1426 if [ -f "$g/MERGE_HEAD" ]; then
1427 merge="--merge"
1429 case "$cur" in
1430 --pretty=*|--format=*)
1431 __gitcomp "$__git_log_pretty_formats $(__git_pretty_aliases)
1432 " "" "${cur#*=}"
1433 return
1435 --date=*)
1436 __gitcomp "$__git_log_date_formats" "" "${cur##--date=}"
1437 return
1439 --decorate=*)
1440 __gitcomp "long short" "" "${cur##--decorate=}"
1441 return
1443 --*)
1444 __gitcomp "
1445 $__git_log_common_options
1446 $__git_log_shortlog_options
1447 $__git_log_gitk_options
1448 --root --topo-order --date-order --reverse
1449 --follow --full-diff
1450 --abbrev-commit --abbrev=
1451 --relative-date --date=
1452 --pretty= --format= --oneline
1453 --cherry-pick
1454 --graph
1455 --decorate --decorate=
1456 --walk-reflogs
1457 --parents --children
1458 $merge
1459 $__git_diff_common_options
1460 --pickaxe-all --pickaxe-regex
1462 return
1464 esac
1465 __git_complete_revlist
1468 __git_merge_options="
1469 --no-commit --no-stat --log --no-log --squash --strategy
1470 --commit --stat --no-squash --ff --no-ff --ff-only --edit --no-edit
1473 _git_merge ()
1475 __git_complete_strategy && return
1477 case "$cur" in
1478 --*)
1479 __gitcomp "$__git_merge_options"
1480 return
1481 esac
1482 __gitcomp_nl "$(__git_refs)"
1485 _git_mergetool ()
1487 case "$cur" in
1488 --tool=*)
1489 __gitcomp "$__git_mergetools_common tortoisemerge" "" "${cur##--tool=}"
1490 return
1492 --*)
1493 __gitcomp "--tool="
1494 return
1496 esac
1499 _git_merge_base ()
1501 __gitcomp_nl "$(__git_refs)"
1504 _git_mv ()
1506 case "$cur" in
1507 --*)
1508 __gitcomp "--dry-run"
1509 return
1511 esac
1513 if [ $(__git_count_arguments "mv") -gt 0 ]; then
1514 # We need to show both cached and untracked files (including
1515 # empty directories) since this may not be the last argument.
1516 __git_complete_index_file "--cached --others --directory"
1517 else
1518 __git_complete_index_file "--cached"
1522 _git_name_rev ()
1524 __gitcomp "--tags --all --stdin"
1527 _git_notes ()
1529 local subcommands='add append copy edit list prune remove show'
1530 local subcommand="$(__git_find_on_cmdline "$subcommands")"
1532 case "$subcommand,$cur" in
1533 ,--*)
1534 __gitcomp '--ref'
1537 case "$prev" in
1538 --ref)
1539 __gitcomp_nl "$(__git_refs)"
1542 __gitcomp "$subcommands --ref"
1544 esac
1546 add,--reuse-message=*|append,--reuse-message=*|\
1547 add,--reedit-message=*|append,--reedit-message=*)
1548 __gitcomp_nl "$(__git_refs)" "" "${cur#*=}"
1550 add,--*|append,--*)
1551 __gitcomp '--file= --message= --reedit-message=
1552 --reuse-message='
1554 copy,--*)
1555 __gitcomp '--stdin'
1557 prune,--*)
1558 __gitcomp '--dry-run --verbose'
1560 prune,*)
1563 case "$prev" in
1564 -m|-F)
1567 __gitcomp_nl "$(__git_refs)"
1569 esac
1571 esac
1574 _git_pull ()
1576 __git_complete_strategy && return
1578 case "$cur" in
1579 --*)
1580 __gitcomp "
1581 --rebase --no-rebase
1582 $__git_merge_options
1583 $__git_fetch_options
1585 return
1587 esac
1588 __git_complete_remote_or_refspec
1591 _git_push ()
1593 case "$prev" in
1594 --repo)
1595 __gitcomp_nl "$(__git_remotes)"
1596 return
1597 esac
1598 case "$cur" in
1599 --repo=*)
1600 __gitcomp_nl "$(__git_remotes)" "" "${cur##--repo=}"
1601 return
1603 --*)
1604 __gitcomp "
1605 --all --mirror --tags --dry-run --force --verbose
1606 --receive-pack= --repo= --set-upstream
1608 return
1610 esac
1611 __git_complete_remote_or_refspec
1614 _git_rebase ()
1616 local dir="$(__gitdir)"
1617 if [ -d "$dir"/rebase-apply ] || [ -d "$dir"/rebase-merge ]; then
1618 __gitcomp "--continue --skip --abort"
1619 return
1621 __git_complete_strategy && return
1622 case "$cur" in
1623 --whitespace=*)
1624 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
1625 return
1627 --*)
1628 __gitcomp "
1629 --onto --merge --strategy --interactive
1630 --preserve-merges --stat --no-stat
1631 --committer-date-is-author-date --ignore-date
1632 --ignore-whitespace --whitespace=
1633 --autosquash
1636 return
1637 esac
1638 __gitcomp_nl "$(__git_refs)"
1641 _git_reflog ()
1643 local subcommands="show delete expire"
1644 local subcommand="$(__git_find_on_cmdline "$subcommands")"
1646 if [ -z "$subcommand" ]; then
1647 __gitcomp "$subcommands"
1648 else
1649 __gitcomp_nl "$(__git_refs)"
1653 __git_send_email_confirm_options="always never auto cc compose"
1654 __git_send_email_suppresscc_options="author self cc bodycc sob cccmd body all"
1656 _git_send_email ()
1658 case "$cur" in
1659 --confirm=*)
1660 __gitcomp "
1661 $__git_send_email_confirm_options
1662 " "" "${cur##--confirm=}"
1663 return
1665 --suppress-cc=*)
1666 __gitcomp "
1667 $__git_send_email_suppresscc_options
1668 " "" "${cur##--suppress-cc=}"
1670 return
1672 --smtp-encryption=*)
1673 __gitcomp "ssl tls" "" "${cur##--smtp-encryption=}"
1674 return
1676 --thread=*)
1677 __gitcomp "
1678 deep shallow
1679 " "" "${cur##--thread=}"
1680 return
1682 --*)
1683 __gitcomp "--annotate --bcc --cc --cc-cmd --chain-reply-to
1684 --compose --confirm= --dry-run --envelope-sender
1685 --from --identity
1686 --in-reply-to --no-chain-reply-to --no-signed-off-by-cc
1687 --no-suppress-from --no-thread --quiet
1688 --signed-off-by-cc --smtp-pass --smtp-server
1689 --smtp-server-port --smtp-encryption= --smtp-user
1690 --subject --suppress-cc= --suppress-from --thread --to
1691 --validate --no-validate
1692 $__git_format_patch_options"
1693 return
1695 esac
1696 __git_complete_revlist
1699 _git_stage ()
1701 _git_add
1704 __git_config_get_set_variables ()
1706 local prevword word config_file= c=$cword
1707 while [ $c -gt 1 ]; do
1708 word="${words[c]}"
1709 case "$word" in
1710 --system|--global|--local|--file=*)
1711 config_file="$word"
1712 break
1714 -f|--file)
1715 config_file="$word $prevword"
1716 break
1718 esac
1719 prevword=$word
1720 c=$((--c))
1721 done
1723 git --git-dir="$(__gitdir)" config $config_file --list 2>/dev/null |
1724 while read -r line
1726 case "$line" in
1727 *.*=*)
1728 echo "${line/=*/}"
1730 esac
1731 done
1734 _git_config ()
1736 case "$prev" in
1737 branch.*.remote|branch.*.pushremote)
1738 __gitcomp_nl "$(__git_remotes)"
1739 return
1741 branch.*.merge)
1742 __gitcomp_nl "$(__git_refs)"
1743 return
1745 branch.*.rebase)
1746 __gitcomp "false true"
1747 return
1749 remote.pushdefault)
1750 __gitcomp_nl "$(__git_remotes)"
1751 return
1753 remote.*.fetch)
1754 local remote="${prev#remote.}"
1755 remote="${remote%.fetch}"
1756 if [ -z "$cur" ]; then
1757 __gitcomp_nl "refs/heads/" "" "" ""
1758 return
1760 __gitcomp_nl "$(__git_refs_remotes "$remote")"
1761 return
1763 remote.*.push)
1764 local remote="${prev#remote.}"
1765 remote="${remote%.push}"
1766 __gitcomp_nl "$(git --git-dir="$(__gitdir)" \
1767 for-each-ref --format='%(refname):%(refname)' \
1768 refs/heads)"
1769 return
1771 pull.twohead|pull.octopus)
1772 __git_compute_merge_strategies
1773 __gitcomp "$__git_merge_strategies"
1774 return
1776 color.branch|color.diff|color.interactive|\
1777 color.showbranch|color.status|color.ui)
1778 __gitcomp "always never auto"
1779 return
1781 color.pager)
1782 __gitcomp "false true"
1783 return
1785 color.*.*)
1786 __gitcomp "
1787 normal black red green yellow blue magenta cyan white
1788 bold dim ul blink reverse
1790 return
1792 diff.submodule)
1793 __gitcomp "log short"
1794 return
1796 help.format)
1797 __gitcomp "man info web html"
1798 return
1800 log.date)
1801 __gitcomp "$__git_log_date_formats"
1802 return
1804 sendemail.aliasesfiletype)
1805 __gitcomp "mutt mailrc pine elm gnus"
1806 return
1808 sendemail.confirm)
1809 __gitcomp "$__git_send_email_confirm_options"
1810 return
1812 sendemail.suppresscc)
1813 __gitcomp "$__git_send_email_suppresscc_options"
1814 return
1816 --get|--get-all|--unset|--unset-all)
1817 __gitcomp_nl "$(__git_config_get_set_variables)"
1818 return
1820 *.*)
1821 return
1823 esac
1824 case "$cur" in
1825 --*)
1826 __gitcomp "
1827 --system --global --local --file=
1828 --list --replace-all
1829 --get --get-all --get-regexp
1830 --add --unset --unset-all
1831 --remove-section --rename-section
1833 return
1835 branch.*.*)
1836 local pfx="${cur%.*}." cur_="${cur##*.}"
1837 __gitcomp "remote pushremote merge mergeoptions rebase" "$pfx" "$cur_"
1838 return
1840 branch.*)
1841 local pfx="${cur%.*}." cur_="${cur#*.}"
1842 __gitcomp_nl "$(__git_heads)" "$pfx" "$cur_" "."
1843 return
1845 guitool.*.*)
1846 local pfx="${cur%.*}." cur_="${cur##*.}"
1847 __gitcomp "
1848 argprompt cmd confirm needsfile noconsole norescan
1849 prompt revprompt revunmerged title
1850 " "$pfx" "$cur_"
1851 return
1853 difftool.*.*)
1854 local pfx="${cur%.*}." cur_="${cur##*.}"
1855 __gitcomp "cmd path" "$pfx" "$cur_"
1856 return
1858 man.*.*)
1859 local pfx="${cur%.*}." cur_="${cur##*.}"
1860 __gitcomp "cmd path" "$pfx" "$cur_"
1861 return
1863 mergetool.*.*)
1864 local pfx="${cur%.*}." cur_="${cur##*.}"
1865 __gitcomp "cmd path trustExitCode" "$pfx" "$cur_"
1866 return
1868 pager.*)
1869 local pfx="${cur%.*}." cur_="${cur#*.}"
1870 __git_compute_all_commands
1871 __gitcomp_nl "$__git_all_commands" "$pfx" "$cur_"
1872 return
1874 remote.*.*)
1875 local pfx="${cur%.*}." cur_="${cur##*.}"
1876 __gitcomp "
1877 url proxy fetch push mirror skipDefaultUpdate
1878 receivepack uploadpack tagopt pushurl
1879 " "$pfx" "$cur_"
1880 return
1882 remote.*)
1883 local pfx="${cur%.*}." cur_="${cur#*.}"
1884 __gitcomp_nl "$(__git_remotes)" "$pfx" "$cur_" "."
1885 return
1887 url.*.*)
1888 local pfx="${cur%.*}." cur_="${cur##*.}"
1889 __gitcomp "insteadOf pushInsteadOf" "$pfx" "$cur_"
1890 return
1892 esac
1893 __gitcomp "
1894 add.ignoreErrors
1895 advice.commitBeforeMerge
1896 advice.detachedHead
1897 advice.implicitIdentity
1898 advice.pushNonFastForward
1899 advice.resolveConflict
1900 advice.statusHints
1901 alias.
1902 am.keepcr
1903 apply.ignorewhitespace
1904 apply.whitespace
1905 branch.autosetupmerge
1906 branch.autosetuprebase
1907 browser.
1908 clean.requireForce
1909 color.branch
1910 color.branch.current
1911 color.branch.local
1912 color.branch.plain
1913 color.branch.remote
1914 color.decorate.HEAD
1915 color.decorate.branch
1916 color.decorate.remoteBranch
1917 color.decorate.stash
1918 color.decorate.tag
1919 color.diff
1920 color.diff.commit
1921 color.diff.frag
1922 color.diff.func
1923 color.diff.meta
1924 color.diff.new
1925 color.diff.old
1926 color.diff.plain
1927 color.diff.whitespace
1928 color.grep
1929 color.grep.context
1930 color.grep.filename
1931 color.grep.function
1932 color.grep.linenumber
1933 color.grep.match
1934 color.grep.selected
1935 color.grep.separator
1936 color.interactive
1937 color.interactive.error
1938 color.interactive.header
1939 color.interactive.help
1940 color.interactive.prompt
1941 color.pager
1942 color.showbranch
1943 color.status
1944 color.status.added
1945 color.status.changed
1946 color.status.header
1947 color.status.nobranch
1948 color.status.untracked
1949 color.status.updated
1950 color.ui
1951 commit.status
1952 commit.template
1953 core.abbrev
1954 core.askpass
1955 core.attributesfile
1956 core.autocrlf
1957 core.bare
1958 core.bigFileThreshold
1959 core.compression
1960 core.createObject
1961 core.deltaBaseCacheLimit
1962 core.editor
1963 core.eol
1964 core.excludesfile
1965 core.fileMode
1966 core.fsyncobjectfiles
1967 core.gitProxy
1968 core.ignoreCygwinFSTricks
1969 core.ignoreStat
1970 core.ignorecase
1971 core.logAllRefUpdates
1972 core.loosecompression
1973 core.notesRef
1974 core.packedGitLimit
1975 core.packedGitWindowSize
1976 core.pager
1977 core.preferSymlinkRefs
1978 core.preloadindex
1979 core.quotepath
1980 core.repositoryFormatVersion
1981 core.safecrlf
1982 core.sharedRepository
1983 core.sparseCheckout
1984 core.symlinks
1985 core.trustctime
1986 core.warnAmbiguousRefs
1987 core.whitespace
1988 core.worktree
1989 diff.autorefreshindex
1990 diff.external
1991 diff.ignoreSubmodules
1992 diff.mnemonicprefix
1993 diff.noprefix
1994 diff.renameLimit
1995 diff.renames
1996 diff.statGraphWidth
1997 diff.submodule
1998 diff.suppressBlankEmpty
1999 diff.tool
2000 diff.wordRegex
2001 diff.algorithm
2002 difftool.
2003 difftool.prompt
2004 fetch.recurseSubmodules
2005 fetch.unpackLimit
2006 format.attach
2007 format.cc
2008 format.headers
2009 format.numbered
2010 format.pretty
2011 format.signature
2012 format.signoff
2013 format.subjectprefix
2014 format.suffix
2015 format.thread
2016 format.to
2018 gc.aggressiveWindow
2019 gc.auto
2020 gc.autopacklimit
2021 gc.packrefs
2022 gc.pruneexpire
2023 gc.reflogexpire
2024 gc.reflogexpireunreachable
2025 gc.rerereresolved
2026 gc.rerereunresolved
2027 gitcvs.allbinary
2028 gitcvs.commitmsgannotation
2029 gitcvs.dbTableNamePrefix
2030 gitcvs.dbdriver
2031 gitcvs.dbname
2032 gitcvs.dbpass
2033 gitcvs.dbuser
2034 gitcvs.enabled
2035 gitcvs.logfile
2036 gitcvs.usecrlfattr
2037 guitool.
2038 gui.blamehistoryctx
2039 gui.commitmsgwidth
2040 gui.copyblamethreshold
2041 gui.diffcontext
2042 gui.encoding
2043 gui.fastcopyblame
2044 gui.matchtrackingbranch
2045 gui.newbranchtemplate
2046 gui.pruneduringfetch
2047 gui.spellingdictionary
2048 gui.trustmtime
2049 help.autocorrect
2050 help.browser
2051 help.format
2052 http.lowSpeedLimit
2053 http.lowSpeedTime
2054 http.maxRequests
2055 http.minSessions
2056 http.noEPSV
2057 http.postBuffer
2058 http.proxy
2059 http.sslCAInfo
2060 http.sslCAPath
2061 http.sslCert
2062 http.sslCertPasswordProtected
2063 http.sslKey
2064 http.sslVerify
2065 http.useragent
2066 i18n.commitEncoding
2067 i18n.logOutputEncoding
2068 imap.authMethod
2069 imap.folder
2070 imap.host
2071 imap.pass
2072 imap.port
2073 imap.preformattedHTML
2074 imap.sslverify
2075 imap.tunnel
2076 imap.user
2077 init.templatedir
2078 instaweb.browser
2079 instaweb.httpd
2080 instaweb.local
2081 instaweb.modulepath
2082 instaweb.port
2083 interactive.singlekey
2084 log.date
2085 log.decorate
2086 log.showroot
2087 mailmap.file
2088 man.
2089 man.viewer
2090 merge.
2091 merge.conflictstyle
2092 merge.log
2093 merge.renameLimit
2094 merge.renormalize
2095 merge.stat
2096 merge.tool
2097 merge.verbosity
2098 mergetool.
2099 mergetool.keepBackup
2100 mergetool.keepTemporaries
2101 mergetool.prompt
2102 notes.displayRef
2103 notes.rewrite.
2104 notes.rewrite.amend
2105 notes.rewrite.rebase
2106 notes.rewriteMode
2107 notes.rewriteRef
2108 pack.compression
2109 pack.deltaCacheLimit
2110 pack.deltaCacheSize
2111 pack.depth
2112 pack.indexVersion
2113 pack.packSizeLimit
2114 pack.threads
2115 pack.window
2116 pack.windowMemory
2117 pager.
2118 pretty.
2119 pull.octopus
2120 pull.twohead
2121 push.default
2122 rebase.autosquash
2123 rebase.stat
2124 receive.autogc
2125 receive.denyCurrentBranch
2126 receive.denyDeleteCurrent
2127 receive.denyDeletes
2128 receive.denyNonFastForwards
2129 receive.fsckObjects
2130 receive.unpackLimit
2131 receive.updateserverinfo
2132 remote.pushdefault
2133 remotes.
2134 repack.usedeltabaseoffset
2135 rerere.autoupdate
2136 rerere.enabled
2137 sendemail.
2138 sendemail.aliasesfile
2139 sendemail.aliasfiletype
2140 sendemail.bcc
2141 sendemail.cc
2142 sendemail.cccmd
2143 sendemail.chainreplyto
2144 sendemail.confirm
2145 sendemail.envelopesender
2146 sendemail.from
2147 sendemail.identity
2148 sendemail.multiedit
2149 sendemail.signedoffbycc
2150 sendemail.smtpdomain
2151 sendemail.smtpencryption
2152 sendemail.smtppass
2153 sendemail.smtpserver
2154 sendemail.smtpserveroption
2155 sendemail.smtpserverport
2156 sendemail.smtpuser
2157 sendemail.suppresscc
2158 sendemail.suppressfrom
2159 sendemail.thread
2160 sendemail.to
2161 sendemail.validate
2162 showbranch.default
2163 status.relativePaths
2164 status.showUntrackedFiles
2165 status.submodulesummary
2166 submodule.
2167 tar.umask
2168 transfer.unpackLimit
2169 url.
2170 user.email
2171 user.name
2172 user.signingkey
2173 web.browser
2174 branch. remote.
2178 _git_remote ()
2180 local subcommands="add rename remove set-head set-branches set-url show prune update"
2181 local subcommand="$(__git_find_on_cmdline "$subcommands")"
2182 if [ -z "$subcommand" ]; then
2183 __gitcomp "$subcommands"
2184 return
2187 case "$subcommand" in
2188 rename|remove|set-url|show|prune)
2189 __gitcomp_nl "$(__git_remotes)"
2191 set-head|set-branches)
2192 __git_complete_remote_or_refspec
2194 update)
2195 local i c='' IFS=$'\n'
2196 for i in $(git --git-dir="$(__gitdir)" config --get-regexp "remotes\..*" 2>/dev/null); do
2197 i="${i#remotes.}"
2198 c="$c ${i/ */}"
2199 done
2200 __gitcomp "$c"
2204 esac
2207 _git_replace ()
2209 __gitcomp_nl "$(__git_refs)"
2212 _git_reset ()
2214 __git_has_doubledash && return
2216 case "$cur" in
2217 --*)
2218 __gitcomp "--merge --mixed --hard --soft --patch"
2219 return
2221 esac
2222 __gitcomp_nl "$(__git_refs)"
2225 _git_revert ()
2227 case "$cur" in
2228 --*)
2229 __gitcomp "--edit --mainline --no-edit --no-commit --signoff"
2230 return
2232 esac
2233 __gitcomp_nl "$(__git_refs)"
2236 _git_rm ()
2238 case "$cur" in
2239 --*)
2240 __gitcomp "--cached --dry-run --ignore-unmatch --quiet"
2241 return
2243 esac
2245 __git_complete_index_file "--cached"
2248 _git_shortlog ()
2250 __git_has_doubledash && return
2252 case "$cur" in
2253 --*)
2254 __gitcomp "
2255 $__git_log_common_options
2256 $__git_log_shortlog_options
2257 --numbered --summary
2259 return
2261 esac
2262 __git_complete_revlist
2265 _git_show ()
2267 __git_has_doubledash && return
2269 case "$cur" in
2270 --pretty=*|--format=*)
2271 __gitcomp "$__git_log_pretty_formats $(__git_pretty_aliases)
2272 " "" "${cur#*=}"
2273 return
2275 --diff-algorithm=*)
2276 __gitcomp "$__git_diff_algorithms" "" "${cur##--diff-algorithm=}"
2277 return
2279 --*)
2280 __gitcomp "--pretty= --format= --abbrev-commit --oneline
2281 $__git_diff_common_options
2283 return
2285 esac
2286 __git_complete_file
2289 _git_show_branch ()
2291 case "$cur" in
2292 --*)
2293 __gitcomp "
2294 --all --remotes --topo-order --current --more=
2295 --list --independent --merge-base --no-name
2296 --color --no-color
2297 --sha1-name --sparse --topics --reflog
2299 return
2301 esac
2302 __git_complete_revlist
2305 _git_stash ()
2307 local save_opts='--keep-index --no-keep-index --quiet --patch'
2308 local subcommands='save list show apply clear drop pop create branch'
2309 local subcommand="$(__git_find_on_cmdline "$subcommands")"
2310 if [ -z "$subcommand" ]; then
2311 case "$cur" in
2312 --*)
2313 __gitcomp "$save_opts"
2316 if [ -z "$(__git_find_on_cmdline "$save_opts")" ]; then
2317 __gitcomp "$subcommands"
2320 esac
2321 else
2322 case "$subcommand,$cur" in
2323 save,--*)
2324 __gitcomp "$save_opts"
2326 apply,--*|pop,--*)
2327 __gitcomp "--index --quiet"
2329 show,--*|drop,--*|branch,--*)
2331 show,*|apply,*|drop,*|pop,*|branch,*)
2332 __gitcomp_nl "$(git --git-dir="$(__gitdir)" stash list \
2333 | sed -n -e 's/:.*//p')"
2337 esac
2341 _git_submodule ()
2343 __git_has_doubledash && return
2345 local subcommands="add status init deinit update summary foreach sync"
2346 if [ -z "$(__git_find_on_cmdline "$subcommands")" ]; then
2347 case "$cur" in
2348 --*)
2349 __gitcomp "--quiet --cached"
2352 __gitcomp "$subcommands"
2354 esac
2355 return
2359 _git_svn ()
2361 local subcommands="
2362 init fetch clone rebase dcommit log find-rev
2363 set-tree commit-diff info create-ignore propget
2364 proplist show-ignore show-externals branch tag blame
2365 migrate mkdirs reset gc
2367 local subcommand="$(__git_find_on_cmdline "$subcommands")"
2368 if [ -z "$subcommand" ]; then
2369 __gitcomp "$subcommands"
2370 else
2371 local remote_opts="--username= --config-dir= --no-auth-cache"
2372 local fc_opts="
2373 --follow-parent --authors-file= --repack=
2374 --no-metadata --use-svm-props --use-svnsync-props
2375 --log-window-size= --no-checkout --quiet
2376 --repack-flags --use-log-author --localtime
2377 --ignore-paths= --include-paths= $remote_opts
2379 local init_opts="
2380 --template= --shared= --trunk= --tags=
2381 --branches= --stdlayout --minimize-url
2382 --no-metadata --use-svm-props --use-svnsync-props
2383 --rewrite-root= --prefix= --use-log-author
2384 --add-author-from $remote_opts
2386 local cmt_opts="
2387 --edit --rmdir --find-copies-harder --copy-similarity=
2390 case "$subcommand,$cur" in
2391 fetch,--*)
2392 __gitcomp "--revision= --fetch-all $fc_opts"
2394 clone,--*)
2395 __gitcomp "--revision= $fc_opts $init_opts"
2397 init,--*)
2398 __gitcomp "$init_opts"
2400 dcommit,--*)
2401 __gitcomp "
2402 --merge --strategy= --verbose --dry-run
2403 --fetch-all --no-rebase --commit-url
2404 --revision --interactive $cmt_opts $fc_opts
2407 set-tree,--*)
2408 __gitcomp "--stdin $cmt_opts $fc_opts"
2410 create-ignore,--*|propget,--*|proplist,--*|show-ignore,--*|\
2411 show-externals,--*|mkdirs,--*)
2412 __gitcomp "--revision="
2414 log,--*)
2415 __gitcomp "
2416 --limit= --revision= --verbose --incremental
2417 --oneline --show-commit --non-recursive
2418 --authors-file= --color
2421 rebase,--*)
2422 __gitcomp "
2423 --merge --verbose --strategy= --local
2424 --fetch-all --dry-run $fc_opts
2427 commit-diff,--*)
2428 __gitcomp "--message= --file= --revision= $cmt_opts"
2430 info,--*)
2431 __gitcomp "--url"
2433 branch,--*)
2434 __gitcomp "--dry-run --message --tag"
2436 tag,--*)
2437 __gitcomp "--dry-run --message"
2439 blame,--*)
2440 __gitcomp "--git-format"
2442 migrate,--*)
2443 __gitcomp "
2444 --config-dir= --ignore-paths= --minimize
2445 --no-auth-cache --username=
2448 reset,--*)
2449 __gitcomp "--revision= --parent"
2453 esac
2457 _git_tag ()
2459 local i c=1 f=0
2460 while [ $c -lt $cword ]; do
2461 i="${words[c]}"
2462 case "$i" in
2463 -d|-v)
2464 __gitcomp_nl "$(__git_tags)"
2465 return
2470 esac
2471 ((c++))
2472 done
2474 case "$prev" in
2475 -m|-F)
2477 -*|tag)
2478 if [ $f = 1 ]; then
2479 __gitcomp_nl "$(__git_tags)"
2483 __gitcomp_nl "$(__git_refs)"
2485 esac
2488 _git_whatchanged ()
2490 _git_log
2493 __git_main ()
2495 local i c=1 command __git_dir
2497 while [ $c -lt $cword ]; do
2498 i="${words[c]}"
2499 case "$i" in
2500 --git-dir=*) __git_dir="${i#--git-dir=}" ;;
2501 --bare) __git_dir="." ;;
2502 --help) command="help"; break ;;
2503 -c) c=$((++c)) ;;
2504 -*) ;;
2505 *) command="$i"; break ;;
2506 esac
2507 ((c++))
2508 done
2510 if [ -z "$command" ]; then
2511 case "$cur" in
2512 --*) __gitcomp "
2513 --paginate
2514 --no-pager
2515 --git-dir=
2516 --bare
2517 --version
2518 --exec-path
2519 --exec-path=
2520 --html-path
2521 --info-path
2522 --work-tree=
2523 --namespace=
2524 --no-replace-objects
2525 --help
2528 *) __git_compute_porcelain_commands
2529 __gitcomp "$__git_porcelain_commands $(__git_aliases)" ;;
2530 esac
2531 return
2534 local completion_func="_git_${command//-/_}"
2535 declare -f $completion_func >/dev/null && $completion_func && return
2537 local expansion=$(__git_aliased_command "$command")
2538 if [ -n "$expansion" ]; then
2539 completion_func="_git_${expansion//-/_}"
2540 declare -f $completion_func >/dev/null && $completion_func
2544 __gitk_main ()
2546 __git_has_doubledash && return
2548 local g="$(__gitdir)"
2549 local merge=""
2550 if [ -f "$g/MERGE_HEAD" ]; then
2551 merge="--merge"
2553 case "$cur" in
2554 --*)
2555 __gitcomp "
2556 $__git_log_common_options
2557 $__git_log_gitk_options
2558 $merge
2560 return
2562 esac
2563 __git_complete_revlist
2566 if [[ -n ${ZSH_VERSION-} ]]; then
2567 echo "WARNING: this script is deprecated, please see git-completion.zsh" 1>&2
2569 autoload -U +X compinit && compinit
2571 __gitcomp ()
2573 emulate -L zsh
2575 local cur_="${3-$cur}"
2577 case "$cur_" in
2578 --*=)
2581 local c IFS=$' \t\n'
2582 local -a array
2583 for c in ${=1}; do
2584 c="$c${4-}"
2585 case $c in
2586 --*=*|*.) ;;
2587 *) c="$c " ;;
2588 esac
2589 array+=("$c")
2590 done
2591 compset -P '*[=:]'
2592 compadd -Q -S '' -p "${2-}" -a -- array && _ret=0
2594 esac
2597 __gitcomp_nl ()
2599 emulate -L zsh
2601 local IFS=$'\n'
2602 compset -P '*[=:]'
2603 compadd -Q -S "${4- }" -p "${2-}" -- ${=1} && _ret=0
2606 __gitcomp_file ()
2608 emulate -L zsh
2610 local IFS=$'\n'
2611 compset -P '*[=:]'
2612 compadd -Q -p "${2-}" -f -- ${=1} && _ret=0
2615 _git ()
2617 local _ret=1 cur cword prev
2618 cur=${words[CURRENT]}
2619 prev=${words[CURRENT-1]}
2620 let cword=CURRENT-1
2621 emulate ksh -c __${service}_main
2622 let _ret && _default && _ret=0
2623 return _ret
2626 compdef _git git gitk
2627 return
2630 __git_func_wrap ()
2632 local cur words cword prev
2633 _get_comp_words_by_ref -n =: cur words cword prev
2637 # Setup completion for certain functions defined above by setting common
2638 # variables and workarounds.
2639 # This is NOT a public function; use at your own risk.
2640 __git_complete ()
2642 local wrapper="__git_wrap${2}"
2643 eval "$wrapper () { __git_func_wrap $2 ; }"
2644 complete -o bashdefault -o default -o nospace -F $wrapper $1 2>/dev/null \
2645 || complete -o default -o nospace -F $wrapper $1
2648 # wrapper for backwards compatibility
2649 _git ()
2651 __git_wrap__git_main
2654 # wrapper for backwards compatibility
2655 _gitk ()
2657 __git_wrap__gitk_main
2660 __git_complete git __git_main
2661 __git_complete gitk __gitk_main
2663 # The following are necessary only for Cygwin, and only are needed
2664 # when the user has tab-completed the executable name and consequently
2665 # included the '.exe' suffix.
2667 if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
2668 __git_complete git.exe __git_main