git-completion.bash: add support for path completion
[git.git] / contrib / completion / git-completion.bash
blob51b8b3b5b4ccd80cae4648ffe88ea166f0e4e5c8
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 __gitcomp_1 ()
58 local c IFS=$' \t\n'
59 for c in $1; do
60 c="$c$2"
61 case $c in
62 --*=*|*.) ;;
63 *) c="$c " ;;
64 esac
65 printf '%s\n' "$c"
66 done
69 # The following function is based on code from:
71 # bash_completion - programmable completion functions for bash 3.2+
73 # Copyright © 2006-2008, Ian Macdonald <ian@caliban.org>
74 # © 2009-2010, Bash Completion Maintainers
75 # <bash-completion-devel@lists.alioth.debian.org>
77 # This program is free software; you can redistribute it and/or modify
78 # it under the terms of the GNU General Public License as published by
79 # the Free Software Foundation; either version 2, or (at your option)
80 # any later version.
82 # This program is distributed in the hope that it will be useful,
83 # but WITHOUT ANY WARRANTY; without even the implied warranty of
84 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
85 # GNU General Public License for more details.
87 # You should have received a copy of the GNU General Public License
88 # along with this program; if not, write to the Free Software Foundation,
89 # Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
91 # The latest version of this software can be obtained here:
93 # http://bash-completion.alioth.debian.org/
95 # RELEASE: 2.x
97 # This function can be used to access a tokenized list of words
98 # on the command line:
100 # __git_reassemble_comp_words_by_ref '=:'
101 # if test "${words_[cword_-1]}" = -w
102 # then
103 # ...
104 # fi
106 # The argument should be a collection of characters from the list of
107 # word completion separators (COMP_WORDBREAKS) to treat as ordinary
108 # characters.
110 # This is roughly equivalent to going back in time and setting
111 # COMP_WORDBREAKS to exclude those characters. The intent is to
112 # make option types like --date=<type> and <rev>:<path> easy to
113 # recognize by treating each shell word as a single token.
115 # It is best not to set COMP_WORDBREAKS directly because the value is
116 # shared with other completion scripts. By the time the completion
117 # function gets called, COMP_WORDS has already been populated so local
118 # changes to COMP_WORDBREAKS have no effect.
120 # Output: words_, cword_, cur_.
122 __git_reassemble_comp_words_by_ref()
124 local exclude i j first
125 # Which word separators to exclude?
126 exclude="${1//[^$COMP_WORDBREAKS]}"
127 cword_=$COMP_CWORD
128 if [ -z "$exclude" ]; then
129 words_=("${COMP_WORDS[@]}")
130 return
132 # List of word completion separators has shrunk;
133 # re-assemble words to complete.
134 for ((i=0, j=0; i < ${#COMP_WORDS[@]}; i++, j++)); do
135 # Append each nonempty word consisting of just
136 # word separator characters to the current word.
137 first=t
138 while
139 [ $i -gt 0 ] &&
140 [ -n "${COMP_WORDS[$i]}" ] &&
141 # word consists of excluded word separators
142 [ "${COMP_WORDS[$i]//[^$exclude]}" = "${COMP_WORDS[$i]}" ]
144 # Attach to the previous token,
145 # unless the previous token is the command name.
146 if [ $j -ge 2 ] && [ -n "$first" ]; then
147 ((j--))
149 first=
150 words_[$j]=${words_[j]}${COMP_WORDS[i]}
151 if [ $i = $COMP_CWORD ]; then
152 cword_=$j
154 if (($i < ${#COMP_WORDS[@]} - 1)); then
155 ((i++))
156 else
157 # Done.
158 return
160 done
161 words_[$j]=${words_[j]}${COMP_WORDS[i]}
162 if [ $i = $COMP_CWORD ]; then
163 cword_=$j
165 done
168 if ! type _get_comp_words_by_ref >/dev/null 2>&1; then
169 _get_comp_words_by_ref ()
171 local exclude cur_ words_ cword_
172 if [ "$1" = "-n" ]; then
173 exclude=$2
174 shift 2
176 __git_reassemble_comp_words_by_ref "$exclude"
177 cur_=${words_[cword_]}
178 while [ $# -gt 0 ]; do
179 case "$1" in
180 cur)
181 cur=$cur_
183 prev)
184 prev=${words_[$cword_-1]}
186 words)
187 words=("${words_[@]}")
189 cword)
190 cword=$cword_
192 esac
193 shift
194 done
198 # Generates completion reply with compgen, appending a space to possible
199 # completion words, if necessary.
200 # It accepts 1 to 4 arguments:
201 # 1: List of possible completion words.
202 # 2: A prefix to be added to each possible completion word (optional).
203 # 3: Generate possible completion matches for this word (optional).
204 # 4: A suffix to be appended to each possible completion word (optional).
205 __gitcomp ()
207 local cur_="${3-$cur}"
209 case "$cur_" in
210 --*=)
211 COMPREPLY=()
214 local IFS=$'\n'
215 COMPREPLY=($(compgen -P "${2-}" \
216 -W "$(__gitcomp_1 "${1-}" "${4-}")" \
217 -- "$cur_"))
219 esac
222 # Generates completion reply with compgen from newline-separated possible
223 # completion words by appending a space to all of them.
224 # It accepts 1 to 4 arguments:
225 # 1: List of possible completion words, separated by a single newline.
226 # 2: A prefix to be added to each possible completion word (optional).
227 # 3: Generate possible completion matches for this word (optional).
228 # 4: A suffix to be appended to each possible completion word instead of
229 # the default space (optional). If specified but empty, nothing is
230 # appended.
231 __gitcomp_nl ()
233 local IFS=$'\n'
234 COMPREPLY=($(compgen -P "${2-}" -S "${4- }" -W "$1" -- "${3-$cur}"))
237 # Generates completion reply with compgen from newline-separated possible
238 # completion filenames.
239 # It accepts 1 to 3 arguments:
240 # 1: List of possible completion filenames, separated by a single newline.
241 # 2: A directory prefix to be added to each possible completion filename
242 # (optional).
243 # 3: Generate possible completion matches for this word (optional).
244 __gitcomp_file ()
246 local IFS=$'\n'
248 # XXX does not work when the directory prefix contains a tilde,
249 # since tilde expansion is not applied.
250 # This means that COMPREPLY will be empty and Bash default
251 # completion will be used.
252 COMPREPLY=($(compgen -P "${2-}" -W "$1" -- "${3-$cur}"))
254 # Tell Bash that compspec generates filenames.
255 compopt -o filenames 2>/dev/null
258 __git_index_file_list_filter_compat ()
260 local path
262 while read -r path; do
263 case "$path" in
264 ?*/*) echo "${path%%/*}/" ;;
265 *) echo "$path" ;;
266 esac
267 done
270 __git_index_file_list_filter_bash ()
272 local path
274 while read -r path; do
275 case "$path" in
276 ?*/*)
277 # XXX if we append a slash to directory names when using
278 # `compopt -o filenames`, Bash will append another slash.
279 # This is pretty stupid, and this the reason why we have to
280 # define a compatible version for this function.
281 echo "${path%%/*}" ;;
283 echo "$path" ;;
284 esac
285 done
288 # Process path list returned by "ls-files" and "diff-index --name-only"
289 # commands, in order to list only file names relative to a specified
290 # directory, and append a slash to directory names.
291 __git_index_file_list_filter ()
293 # Default to Bash >= 4.x
294 __git_index_file_list_filter_bash
297 # Execute git ls-files, returning paths relative to the directory
298 # specified in the first argument, and using the options specified in
299 # the second argument.
300 __git_ls_files_helper ()
302 # NOTE: $2 is not quoted in order to support multiple options
303 cd "$1" && git ls-files --exclude-standard $2
304 } 2>/dev/null
307 # Execute git diff-index, returning paths relative to the directory
308 # specified in the first argument, and using the tree object id
309 # specified in the second argument.
310 __git_diff_index_helper ()
312 cd "$1" && git diff-index --name-only --relative "$2"
313 } 2>/dev/null
315 # __git_index_files accepts 1 or 2 arguments:
316 # 1: Options to pass to ls-files (required).
317 # Supported options are --cached, --modified, --deleted, --others,
318 # and --directory.
319 # 2: A directory path (optional).
320 # If provided, only files within the specified directory are listed.
321 # Sub directories are never recursed. Path must have a trailing
322 # slash.
323 __git_index_files ()
325 local dir="$(__gitdir)" root="${2-.}"
327 if [ -d "$dir" ]; then
328 __git_ls_files_helper "$root" "$1" | __git_index_file_list_filter |
329 sort | uniq
333 # __git_diff_index_files accepts 1 or 2 arguments:
334 # 1) The id of a tree object.
335 # 2) A directory path (optional).
336 # If provided, only files within the specified directory are listed.
337 # Sub directories are never recursed. Path must have a trailing
338 # slash.
339 __git_diff_index_files ()
341 local dir="$(__gitdir)" root="${2-.}"
343 if [ -d "$dir" ]; then
344 __git_diff_index_helper "$root" "$1" | __git_index_file_list_filter |
345 sort | uniq
349 __git_heads ()
351 local dir="$(__gitdir)"
352 if [ -d "$dir" ]; then
353 git --git-dir="$dir" for-each-ref --format='%(refname:short)' \
354 refs/heads
355 return
359 __git_tags ()
361 local dir="$(__gitdir)"
362 if [ -d "$dir" ]; then
363 git --git-dir="$dir" for-each-ref --format='%(refname:short)' \
364 refs/tags
365 return
369 # __git_refs accepts 0, 1 (to pass to __gitdir), or 2 arguments
370 # presence of 2nd argument means use the guess heuristic employed
371 # by checkout for tracking branches
372 __git_refs ()
374 local i hash dir="$(__gitdir "${1-}")" track="${2-}"
375 local format refs
376 if [ -d "$dir" ]; then
377 case "$cur" in
378 refs|refs/*)
379 format="refname"
380 refs="${cur%/*}"
381 track=""
384 for i in HEAD FETCH_HEAD ORIG_HEAD MERGE_HEAD; do
385 if [ -e "$dir/$i" ]; then echo $i; fi
386 done
387 format="refname:short"
388 refs="refs/tags refs/heads refs/remotes"
390 esac
391 git --git-dir="$dir" for-each-ref --format="%($format)" \
392 $refs
393 if [ -n "$track" ]; then
394 # employ the heuristic used by git checkout
395 # Try to find a remote branch that matches the completion word
396 # but only output if the branch name is unique
397 local ref entry
398 git --git-dir="$dir" for-each-ref --shell --format="ref=%(refname:short)" \
399 "refs/remotes/" | \
400 while read -r entry; do
401 eval "$entry"
402 ref="${ref#*/}"
403 if [[ "$ref" == "$cur"* ]]; then
404 echo "$ref"
406 done | sort | uniq -u
408 return
410 case "$cur" in
411 refs|refs/*)
412 git ls-remote "$dir" "$cur*" 2>/dev/null | \
413 while read -r hash i; do
414 case "$i" in
415 *^{}) ;;
416 *) echo "$i" ;;
417 esac
418 done
421 git ls-remote "$dir" HEAD ORIG_HEAD 'refs/tags/*' 'refs/heads/*' 'refs/remotes/*' 2>/dev/null | \
422 while read -r hash i; do
423 case "$i" in
424 *^{}) ;;
425 refs/*) echo "${i#refs/*/}" ;;
426 *) echo "$i" ;;
427 esac
428 done
430 esac
433 # __git_refs2 requires 1 argument (to pass to __git_refs)
434 __git_refs2 ()
436 local i
437 for i in $(__git_refs "$1"); do
438 echo "$i:$i"
439 done
442 # __git_refs_remotes requires 1 argument (to pass to ls-remote)
443 __git_refs_remotes ()
445 local i hash
446 git ls-remote "$1" 'refs/heads/*' 2>/dev/null | \
447 while read -r hash i; do
448 echo "$i:refs/remotes/$1/${i#refs/heads/}"
449 done
452 __git_remotes ()
454 local i IFS=$'\n' d="$(__gitdir)"
455 test -d "$d/remotes" && ls -1 "$d/remotes"
456 for i in $(git --git-dir="$d" config --get-regexp 'remote\..*\.url' 2>/dev/null); do
457 i="${i#remote.}"
458 echo "${i/.url*/}"
459 done
462 __git_list_merge_strategies ()
464 git merge -s help 2>&1 |
465 sed -n -e '/[Aa]vailable strategies are: /,/^$/{
466 s/\.$//
467 s/.*://
468 s/^[ ]*//
469 s/[ ]*$//
474 __git_merge_strategies=
475 # 'git merge -s help' (and thus detection of the merge strategy
476 # list) fails, unfortunately, if run outside of any git working
477 # tree. __git_merge_strategies is set to the empty string in
478 # that case, and the detection will be repeated the next time it
479 # is needed.
480 __git_compute_merge_strategies ()
482 test -n "$__git_merge_strategies" ||
483 __git_merge_strategies=$(__git_list_merge_strategies)
486 __git_complete_revlist_file ()
488 local pfx ls ref cur_="$cur"
489 case "$cur_" in
490 *..?*:*)
491 return
493 ?*:*)
494 ref="${cur_%%:*}"
495 cur_="${cur_#*:}"
496 case "$cur_" in
497 ?*/*)
498 pfx="${cur_%/*}"
499 cur_="${cur_##*/}"
500 ls="$ref:$pfx"
501 pfx="$pfx/"
504 ls="$ref"
506 esac
508 case "$COMP_WORDBREAKS" in
509 *:*) : great ;;
510 *) pfx="$ref:$pfx" ;;
511 esac
513 __gitcomp_nl "$(git --git-dir="$(__gitdir)" ls-tree "$ls" \
514 | sed '/^100... blob /{
515 s,^.* ,,
516 s,$, ,
518 /^120000 blob /{
519 s,^.* ,,
520 s,$, ,
522 /^040000 tree /{
523 s,^.* ,,
524 s,$,/,
526 s/^.* //')" \
527 "$pfx" "$cur_" ""
529 *...*)
530 pfx="${cur_%...*}..."
531 cur_="${cur_#*...}"
532 __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
534 *..*)
535 pfx="${cur_%..*}.."
536 cur_="${cur_#*..}"
537 __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
540 __gitcomp_nl "$(__git_refs)"
542 esac
546 # __git_complete_index_file requires 1 argument: the options to pass to
547 # ls-file
548 __git_complete_index_file ()
550 local pfx cur_="$cur"
552 case "$cur_" in
553 ?*/*)
554 pfx="${cur_%/*}"
555 cur_="${cur_##*/}"
556 pfx="${pfx}/"
558 __gitcomp_file "$(__git_index_files "$1" "$pfx")" "$pfx" "$cur_"
561 __gitcomp_file "$(__git_index_files "$1")" "" "$cur_"
563 esac
566 # __git_complete_diff_index_file requires 1 argument: the id of a tree
567 # object
568 __git_complete_diff_index_file ()
570 local pfx cur_="$cur"
572 case "$cur_" in
573 ?*/*)
574 pfx="${cur_%/*}"
575 cur_="${cur_##*/}"
576 pfx="${pfx}/"
578 __gitcomp_file "$(__git_diff_index_files "$1" "$pfx")" "$pfx" "$cur_"
581 __gitcomp_file "$(__git_diff_index_files "$1")" "" "$cur_"
583 esac
586 __git_complete_file ()
588 __git_complete_revlist_file
591 __git_complete_revlist ()
593 __git_complete_revlist_file
596 __git_complete_remote_or_refspec ()
598 local cur_="$cur" cmd="${words[1]}"
599 local i c=2 remote="" pfx="" lhs=1 no_complete_refspec=0
600 if [ "$cmd" = "remote" ]; then
601 ((c++))
603 while [ $c -lt $cword ]; do
604 i="${words[c]}"
605 case "$i" in
606 --mirror) [ "$cmd" = "push" ] && no_complete_refspec=1 ;;
607 --all)
608 case "$cmd" in
609 push) no_complete_refspec=1 ;;
610 fetch)
611 COMPREPLY=()
612 return
614 *) ;;
615 esac
617 -*) ;;
618 *) remote="$i"; break ;;
619 esac
620 ((c++))
621 done
622 if [ -z "$remote" ]; then
623 __gitcomp_nl "$(__git_remotes)"
624 return
626 if [ $no_complete_refspec = 1 ]; then
627 COMPREPLY=()
628 return
630 [ "$remote" = "." ] && remote=
631 case "$cur_" in
632 *:*)
633 case "$COMP_WORDBREAKS" in
634 *:*) : great ;;
635 *) pfx="${cur_%%:*}:" ;;
636 esac
637 cur_="${cur_#*:}"
638 lhs=0
641 pfx="+"
642 cur_="${cur_#+}"
644 esac
645 case "$cmd" in
646 fetch)
647 if [ $lhs = 1 ]; then
648 __gitcomp_nl "$(__git_refs2 "$remote")" "$pfx" "$cur_"
649 else
650 __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
653 pull|remote)
654 if [ $lhs = 1 ]; then
655 __gitcomp_nl "$(__git_refs "$remote")" "$pfx" "$cur_"
656 else
657 __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
660 push)
661 if [ $lhs = 1 ]; then
662 __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
663 else
664 __gitcomp_nl "$(__git_refs "$remote")" "$pfx" "$cur_"
667 esac
670 __git_complete_strategy ()
672 __git_compute_merge_strategies
673 case "$prev" in
674 -s|--strategy)
675 __gitcomp "$__git_merge_strategies"
676 return 0
677 esac
678 case "$cur" in
679 --strategy=*)
680 __gitcomp "$__git_merge_strategies" "" "${cur##--strategy=}"
681 return 0
683 esac
684 return 1
687 __git_list_all_commands ()
689 local i IFS=" "$'\n'
690 for i in $(git help -a|egrep '^ [a-zA-Z0-9]')
692 case $i in
693 *--*) : helper pattern;;
694 *) echo $i;;
695 esac
696 done
699 __git_all_commands=
700 __git_compute_all_commands ()
702 test -n "$__git_all_commands" ||
703 __git_all_commands=$(__git_list_all_commands)
706 __git_list_porcelain_commands ()
708 local i IFS=" "$'\n'
709 __git_compute_all_commands
710 for i in $__git_all_commands
712 case $i in
713 *--*) : helper pattern;;
714 applymbox) : ask gittus;;
715 applypatch) : ask gittus;;
716 archimport) : import;;
717 cat-file) : plumbing;;
718 check-attr) : plumbing;;
719 check-ref-format) : plumbing;;
720 checkout-index) : plumbing;;
721 commit-tree) : plumbing;;
722 count-objects) : infrequent;;
723 credential-cache) : credentials helper;;
724 credential-store) : credentials helper;;
725 cvsexportcommit) : export;;
726 cvsimport) : import;;
727 cvsserver) : daemon;;
728 daemon) : daemon;;
729 diff-files) : plumbing;;
730 diff-index) : plumbing;;
731 diff-tree) : plumbing;;
732 fast-import) : import;;
733 fast-export) : export;;
734 fsck-objects) : plumbing;;
735 fetch-pack) : plumbing;;
736 fmt-merge-msg) : plumbing;;
737 for-each-ref) : plumbing;;
738 hash-object) : plumbing;;
739 http-*) : transport;;
740 index-pack) : plumbing;;
741 init-db) : deprecated;;
742 local-fetch) : plumbing;;
743 lost-found) : infrequent;;
744 ls-files) : plumbing;;
745 ls-remote) : plumbing;;
746 ls-tree) : plumbing;;
747 mailinfo) : plumbing;;
748 mailsplit) : plumbing;;
749 merge-*) : plumbing;;
750 mktree) : plumbing;;
751 mktag) : plumbing;;
752 pack-objects) : plumbing;;
753 pack-redundant) : plumbing;;
754 pack-refs) : plumbing;;
755 parse-remote) : plumbing;;
756 patch-id) : plumbing;;
757 peek-remote) : plumbing;;
758 prune) : plumbing;;
759 prune-packed) : plumbing;;
760 quiltimport) : import;;
761 read-tree) : plumbing;;
762 receive-pack) : plumbing;;
763 remote-*) : transport;;
764 repo-config) : deprecated;;
765 rerere) : plumbing;;
766 rev-list) : plumbing;;
767 rev-parse) : plumbing;;
768 runstatus) : plumbing;;
769 sh-setup) : internal;;
770 shell) : daemon;;
771 show-ref) : plumbing;;
772 send-pack) : plumbing;;
773 show-index) : plumbing;;
774 ssh-*) : transport;;
775 stripspace) : plumbing;;
776 symbolic-ref) : plumbing;;
777 tar-tree) : deprecated;;
778 unpack-file) : plumbing;;
779 unpack-objects) : plumbing;;
780 update-index) : plumbing;;
781 update-ref) : plumbing;;
782 update-server-info) : daemon;;
783 upload-archive) : plumbing;;
784 upload-pack) : plumbing;;
785 write-tree) : plumbing;;
786 var) : infrequent;;
787 verify-pack) : infrequent;;
788 verify-tag) : plumbing;;
789 *) echo $i;;
790 esac
791 done
794 __git_porcelain_commands=
795 __git_compute_porcelain_commands ()
797 __git_compute_all_commands
798 test -n "$__git_porcelain_commands" ||
799 __git_porcelain_commands=$(__git_list_porcelain_commands)
802 __git_pretty_aliases ()
804 local i IFS=$'\n'
805 for i in $(git --git-dir="$(__gitdir)" config --get-regexp "pretty\..*" 2>/dev/null); do
806 case "$i" in
807 pretty.*)
808 i="${i#pretty.}"
809 echo "${i/ */}"
811 esac
812 done
815 __git_aliases ()
817 local i IFS=$'\n'
818 for i in $(git --git-dir="$(__gitdir)" config --get-regexp "alias\..*" 2>/dev/null); do
819 case "$i" in
820 alias.*)
821 i="${i#alias.}"
822 echo "${i/ */}"
824 esac
825 done
828 # __git_aliased_command requires 1 argument
829 __git_aliased_command ()
831 local word cmdline=$(git --git-dir="$(__gitdir)" \
832 config --get "alias.$1")
833 for word in $cmdline; do
834 case "$word" in
835 \!gitk|gitk)
836 echo "gitk"
837 return
839 \!*) : shell command alias ;;
840 -*) : option ;;
841 *=*) : setting env ;;
842 git) : git itself ;;
844 echo "$word"
845 return
846 esac
847 done
850 # __git_find_on_cmdline requires 1 argument
851 __git_find_on_cmdline ()
853 local word subcommand c=1
854 while [ $c -lt $cword ]; do
855 word="${words[c]}"
856 for subcommand in $1; do
857 if [ "$subcommand" = "$word" ]; then
858 echo "$subcommand"
859 return
861 done
862 ((c++))
863 done
866 __git_has_doubledash ()
868 local c=1
869 while [ $c -lt $cword ]; do
870 if [ "--" = "${words[c]}" ]; then
871 return 0
873 ((c++))
874 done
875 return 1
878 # Try to count non option arguments passed on the command line for the
879 # specified git command.
880 # When options are used, it is necessary to use the special -- option to
881 # tell the implementation were non option arguments begin.
882 # XXX this can not be improved, since options can appear everywhere, as
883 # an example:
884 # git mv x -n y
886 # __git_count_arguments requires 1 argument: the git command executed.
887 __git_count_arguments ()
889 local word i c=0
891 # Skip "git" (first argument)
892 for ((i=1; i < ${#words[@]}; i++)); do
893 word="${words[i]}"
895 case "$word" in
897 # Good; we can assume that the following are only non
898 # option arguments.
899 ((c = 0))
901 "$1")
902 # Skip the specified git command and discard git
903 # main options
904 ((c = 0))
907 ((c++))
909 esac
910 done
912 printf "%d" $c
915 __git_whitespacelist="nowarn warn error error-all fix"
917 _git_am ()
919 local dir="$(__gitdir)"
920 if [ -d "$dir"/rebase-apply ]; then
921 __gitcomp "--skip --continue --resolved --abort"
922 return
924 case "$cur" in
925 --whitespace=*)
926 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
927 return
929 --*)
930 __gitcomp "
931 --3way --committer-date-is-author-date --ignore-date
932 --ignore-whitespace --ignore-space-change
933 --interactive --keep --no-utf8 --signoff --utf8
934 --whitespace= --scissors
936 return
937 esac
938 COMPREPLY=()
941 _git_apply ()
943 case "$cur" in
944 --whitespace=*)
945 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
946 return
948 --*)
949 __gitcomp "
950 --stat --numstat --summary --check --index
951 --cached --index-info --reverse --reject --unidiff-zero
952 --apply --no-add --exclude=
953 --ignore-whitespace --ignore-space-change
954 --whitespace= --inaccurate-eof --verbose
956 return
957 esac
958 COMPREPLY=()
961 _git_add ()
963 case "$cur" in
964 --*)
965 __gitcomp "
966 --interactive --refresh --patch --update --dry-run
967 --ignore-errors --intent-to-add
969 return
970 esac
972 # XXX should we check for --update and --all options ?
973 __git_complete_index_file "--others --modified"
976 _git_archive ()
978 case "$cur" in
979 --format=*)
980 __gitcomp "$(git archive --list)" "" "${cur##--format=}"
981 return
983 --remote=*)
984 __gitcomp_nl "$(__git_remotes)" "" "${cur##--remote=}"
985 return
987 --*)
988 __gitcomp "
989 --format= --list --verbose
990 --prefix= --remote= --exec=
992 return
994 esac
995 __git_complete_file
998 _git_bisect ()
1000 __git_has_doubledash && return
1002 local subcommands="start bad good skip reset visualize replay log run"
1003 local subcommand="$(__git_find_on_cmdline "$subcommands")"
1004 if [ -z "$subcommand" ]; then
1005 if [ -f "$(__gitdir)"/BISECT_START ]; then
1006 __gitcomp "$subcommands"
1007 else
1008 __gitcomp "replay start"
1010 return
1013 case "$subcommand" in
1014 bad|good|reset|skip|start)
1015 __gitcomp_nl "$(__git_refs)"
1018 COMPREPLY=()
1020 esac
1023 _git_branch ()
1025 local i c=1 only_local_ref="n" has_r="n"
1027 while [ $c -lt $cword ]; do
1028 i="${words[c]}"
1029 case "$i" in
1030 -d|-m) only_local_ref="y" ;;
1031 -r) has_r="y" ;;
1032 esac
1033 ((c++))
1034 done
1036 case "$cur" in
1037 --set-upstream-to=*)
1038 __gitcomp "$(__git_refs)" "" "${cur##--set-upstream-to=}"
1040 --*)
1041 __gitcomp "
1042 --color --no-color --verbose --abbrev= --no-abbrev
1043 --track --no-track --contains --merged --no-merged
1044 --set-upstream-to= --edit-description --list
1045 --unset-upstream
1049 if [ $only_local_ref = "y" -a $has_r = "n" ]; then
1050 __gitcomp_nl "$(__git_heads)"
1051 else
1052 __gitcomp_nl "$(__git_refs)"
1055 esac
1058 _git_bundle ()
1060 local cmd="${words[2]}"
1061 case "$cword" in
1063 __gitcomp "create list-heads verify unbundle"
1066 # looking for a file
1069 case "$cmd" in
1070 create)
1071 __git_complete_revlist
1073 esac
1075 esac
1078 _git_checkout ()
1080 __git_has_doubledash && return
1082 case "$cur" in
1083 --conflict=*)
1084 __gitcomp "diff3 merge" "" "${cur##--conflict=}"
1086 --*)
1087 __gitcomp "
1088 --quiet --ours --theirs --track --no-track --merge
1089 --conflict= --orphan --patch
1093 # check if --track, --no-track, or --no-guess was specified
1094 # if so, disable DWIM mode
1095 local flags="--track --no-track --no-guess" track=1
1096 if [ -n "$(__git_find_on_cmdline "$flags")" ]; then
1097 track=''
1099 __gitcomp_nl "$(__git_refs '' $track)"
1101 esac
1104 _git_cherry ()
1106 __gitcomp "$(__git_refs)"
1109 _git_cherry_pick ()
1111 case "$cur" in
1112 --*)
1113 __gitcomp "--edit --no-commit"
1116 __gitcomp_nl "$(__git_refs)"
1118 esac
1121 _git_clean ()
1123 case "$cur" in
1124 --*)
1125 __gitcomp "--dry-run --quiet"
1126 return
1128 esac
1130 # XXX should we check for -x option ?
1131 __git_complete_index_file "--others"
1134 _git_clone ()
1136 case "$cur" in
1137 --*)
1138 __gitcomp "
1139 --local
1140 --no-hardlinks
1141 --shared
1142 --reference
1143 --quiet
1144 --no-checkout
1145 --bare
1146 --mirror
1147 --origin
1148 --upload-pack
1149 --template=
1150 --depth
1151 --single-branch
1152 --branch
1154 return
1156 esac
1157 COMPREPLY=()
1160 _git_commit ()
1162 case "$prev" in
1163 -c|-C)
1164 __gitcomp_nl "$(__git_refs)" "" "${cur}"
1165 return
1167 esac
1169 case "$cur" in
1170 --cleanup=*)
1171 __gitcomp "default strip verbatim whitespace
1172 " "" "${cur##--cleanup=}"
1173 return
1175 --reuse-message=*|--reedit-message=*|\
1176 --fixup=*|--squash=*)
1177 __gitcomp_nl "$(__git_refs)" "" "${cur#*=}"
1178 return
1180 --untracked-files=*)
1181 __gitcomp "all no normal" "" "${cur##--untracked-files=}"
1182 return
1184 --*)
1185 __gitcomp "
1186 --all --author= --signoff --verify --no-verify
1187 --edit --no-edit
1188 --amend --include --only --interactive
1189 --dry-run --reuse-message= --reedit-message=
1190 --reset-author --file= --message= --template=
1191 --cleanup= --untracked-files --untracked-files=
1192 --verbose --quiet --fixup= --squash=
1194 return
1195 esac
1197 if git rev-parse --verify --quiet HEAD >/dev/null; then
1198 __git_complete_diff_index_file "HEAD"
1199 else
1200 # This is the first commit
1201 __git_complete_index_file "--cached"
1205 _git_describe ()
1207 case "$cur" in
1208 --*)
1209 __gitcomp "
1210 --all --tags --contains --abbrev= --candidates=
1211 --exact-match --debug --long --match --always
1213 return
1214 esac
1215 __gitcomp_nl "$(__git_refs)"
1218 __git_diff_common_options="--stat --numstat --shortstat --summary
1219 --patch-with-stat --name-only --name-status --color
1220 --no-color --color-words --no-renames --check
1221 --full-index --binary --abbrev --diff-filter=
1222 --find-copies-harder
1223 --text --ignore-space-at-eol --ignore-space-change
1224 --ignore-all-space --exit-code --quiet --ext-diff
1225 --no-ext-diff
1226 --no-prefix --src-prefix= --dst-prefix=
1227 --inter-hunk-context=
1228 --patience
1229 --raw
1230 --dirstat --dirstat= --dirstat-by-file
1231 --dirstat-by-file= --cumulative
1234 _git_diff ()
1236 __git_has_doubledash && return
1238 case "$cur" in
1239 --*)
1240 __gitcomp "--cached --staged --pickaxe-all --pickaxe-regex
1241 --base --ours --theirs --no-index
1242 $__git_diff_common_options
1244 return
1246 esac
1247 __git_complete_revlist_file
1250 __git_mergetools_common="diffuse ecmerge emerge kdiff3 meld opendiff
1251 tkdiff vimdiff gvimdiff xxdiff araxis p4merge bc3 codecompare
1254 _git_difftool ()
1256 __git_has_doubledash && return
1258 case "$cur" in
1259 --tool=*)
1260 __gitcomp "$__git_mergetools_common kompare" "" "${cur##--tool=}"
1261 return
1263 --*)
1264 __gitcomp "--cached --staged --pickaxe-all --pickaxe-regex
1265 --base --ours --theirs
1266 --no-renames --diff-filter= --find-copies-harder
1267 --relative --ignore-submodules
1268 --tool="
1269 return
1271 esac
1272 __git_complete_file
1275 __git_fetch_options="
1276 --quiet --verbose --append --upload-pack --force --keep --depth=
1277 --tags --no-tags --all --prune --dry-run
1280 _git_fetch ()
1282 case "$cur" in
1283 --*)
1284 __gitcomp "$__git_fetch_options"
1285 return
1287 esac
1288 __git_complete_remote_or_refspec
1291 __git_format_patch_options="
1292 --stdout --attach --no-attach --thread --thread= --output-directory
1293 --numbered --start-number --numbered-files --keep-subject --signoff
1294 --signature --no-signature --in-reply-to= --cc= --full-index --binary
1295 --not --all --cover-letter --no-prefix --src-prefix= --dst-prefix=
1296 --inline --suffix= --ignore-if-in-upstream --subject-prefix=
1299 _git_format_patch ()
1301 case "$cur" in
1302 --thread=*)
1303 __gitcomp "
1304 deep shallow
1305 " "" "${cur##--thread=}"
1306 return
1308 --*)
1309 __gitcomp "$__git_format_patch_options"
1310 return
1312 esac
1313 __git_complete_revlist
1316 _git_fsck ()
1318 case "$cur" in
1319 --*)
1320 __gitcomp "
1321 --tags --root --unreachable --cache --no-reflogs --full
1322 --strict --verbose --lost-found
1324 return
1326 esac
1327 COMPREPLY=()
1330 _git_gc ()
1332 case "$cur" in
1333 --*)
1334 __gitcomp "--prune --aggressive"
1335 return
1337 esac
1338 COMPREPLY=()
1341 _git_gitk ()
1343 _gitk
1346 __git_match_ctag() {
1347 awk "/^${1////\\/}/ { print \$1 }" "$2"
1350 _git_grep ()
1352 __git_has_doubledash && return
1354 case "$cur" in
1355 --*)
1356 __gitcomp "
1357 --cached
1358 --text --ignore-case --word-regexp --invert-match
1359 --full-name --line-number
1360 --extended-regexp --basic-regexp --fixed-strings
1361 --perl-regexp
1362 --files-with-matches --name-only
1363 --files-without-match
1364 --max-depth
1365 --count
1366 --and --or --not --all-match
1368 return
1370 esac
1372 case "$cword,$prev" in
1373 2,*|*,-*)
1374 if test -r tags; then
1375 __gitcomp_nl "$(__git_match_ctag "$cur" tags)"
1376 return
1379 esac
1381 __gitcomp_nl "$(__git_refs)"
1384 _git_help ()
1386 case "$cur" in
1387 --*)
1388 __gitcomp "--all --info --man --web"
1389 return
1391 esac
1392 __git_compute_all_commands
1393 __gitcomp "$__git_all_commands $(__git_aliases)
1394 attributes cli core-tutorial cvs-migration
1395 diffcore gitk glossary hooks ignore modules
1396 namespaces repository-layout tutorial tutorial-2
1397 workflows
1401 _git_init ()
1403 case "$cur" in
1404 --shared=*)
1405 __gitcomp "
1406 false true umask group all world everybody
1407 " "" "${cur##--shared=}"
1408 return
1410 --*)
1411 __gitcomp "--quiet --bare --template= --shared --shared="
1412 return
1414 esac
1415 COMPREPLY=()
1418 _git_ls_files ()
1420 case "$cur" in
1421 --*)
1422 __gitcomp "--cached --deleted --modified --others --ignored
1423 --stage --directory --no-empty-directory --unmerged
1424 --killed --exclude= --exclude-from=
1425 --exclude-per-directory= --exclude-standard
1426 --error-unmatch --with-tree= --full-name
1427 --abbrev --ignored --exclude-per-directory
1429 return
1431 esac
1433 # XXX ignore options like --modified and always suggest all cached
1434 # files.
1435 __git_complete_index_file "--cached"
1438 _git_ls_remote ()
1440 __gitcomp_nl "$(__git_remotes)"
1443 _git_ls_tree ()
1445 __git_complete_file
1448 # Options that go well for log, shortlog and gitk
1449 __git_log_common_options="
1450 --not --all
1451 --branches --tags --remotes
1452 --first-parent --merges --no-merges
1453 --max-count=
1454 --max-age= --since= --after=
1455 --min-age= --until= --before=
1456 --min-parents= --max-parents=
1457 --no-min-parents --no-max-parents
1459 # Options that go well for log and gitk (not shortlog)
1460 __git_log_gitk_options="
1461 --dense --sparse --full-history
1462 --simplify-merges --simplify-by-decoration
1463 --left-right --notes --no-notes
1465 # Options that go well for log and shortlog (not gitk)
1466 __git_log_shortlog_options="
1467 --author= --committer= --grep=
1468 --all-match
1471 __git_log_pretty_formats="oneline short medium full fuller email raw format:"
1472 __git_log_date_formats="relative iso8601 rfc2822 short local default raw"
1474 _git_log ()
1476 __git_has_doubledash && return
1478 local g="$(git rev-parse --git-dir 2>/dev/null)"
1479 local merge=""
1480 if [ -f "$g/MERGE_HEAD" ]; then
1481 merge="--merge"
1483 case "$cur" in
1484 --pretty=*|--format=*)
1485 __gitcomp "$__git_log_pretty_formats $(__git_pretty_aliases)
1486 " "" "${cur#*=}"
1487 return
1489 --date=*)
1490 __gitcomp "$__git_log_date_formats" "" "${cur##--date=}"
1491 return
1493 --decorate=*)
1494 __gitcomp "long short" "" "${cur##--decorate=}"
1495 return
1497 --*)
1498 __gitcomp "
1499 $__git_log_common_options
1500 $__git_log_shortlog_options
1501 $__git_log_gitk_options
1502 --root --topo-order --date-order --reverse
1503 --follow --full-diff
1504 --abbrev-commit --abbrev=
1505 --relative-date --date=
1506 --pretty= --format= --oneline
1507 --cherry-pick
1508 --graph
1509 --decorate --decorate=
1510 --walk-reflogs
1511 --parents --children
1512 $merge
1513 $__git_diff_common_options
1514 --pickaxe-all --pickaxe-regex
1516 return
1518 esac
1519 __git_complete_revlist
1522 __git_merge_options="
1523 --no-commit --no-stat --log --no-log --squash --strategy
1524 --commit --stat --no-squash --ff --no-ff --ff-only --edit --no-edit
1527 _git_merge ()
1529 __git_complete_strategy && return
1531 case "$cur" in
1532 --*)
1533 __gitcomp "$__git_merge_options"
1534 return
1535 esac
1536 __gitcomp_nl "$(__git_refs)"
1539 _git_mergetool ()
1541 case "$cur" in
1542 --tool=*)
1543 __gitcomp "$__git_mergetools_common tortoisemerge" "" "${cur##--tool=}"
1544 return
1546 --*)
1547 __gitcomp "--tool="
1548 return
1550 esac
1551 COMPREPLY=()
1554 _git_merge_base ()
1556 __gitcomp_nl "$(__git_refs)"
1559 _git_mv ()
1561 case "$cur" in
1562 --*)
1563 __gitcomp "--dry-run"
1564 return
1566 esac
1568 if [ $(__git_count_arguments "mv") -gt 0 ]; then
1569 # We need to show both cached and untracked files (including
1570 # empty directories) since this may not be the last argument.
1571 __git_complete_index_file "--cached --others --directory"
1572 else
1573 __git_complete_index_file "--cached"
1577 _git_name_rev ()
1579 __gitcomp "--tags --all --stdin"
1582 _git_notes ()
1584 local subcommands='add append copy edit list prune remove show'
1585 local subcommand="$(__git_find_on_cmdline "$subcommands")"
1587 case "$subcommand,$cur" in
1588 ,--*)
1589 __gitcomp '--ref'
1592 case "$prev" in
1593 --ref)
1594 __gitcomp_nl "$(__git_refs)"
1597 __gitcomp "$subcommands --ref"
1599 esac
1601 add,--reuse-message=*|append,--reuse-message=*|\
1602 add,--reedit-message=*|append,--reedit-message=*)
1603 __gitcomp_nl "$(__git_refs)" "" "${cur#*=}"
1605 add,--*|append,--*)
1606 __gitcomp '--file= --message= --reedit-message=
1607 --reuse-message='
1609 copy,--*)
1610 __gitcomp '--stdin'
1612 prune,--*)
1613 __gitcomp '--dry-run --verbose'
1615 prune,*)
1618 case "$prev" in
1619 -m|-F)
1622 __gitcomp_nl "$(__git_refs)"
1624 esac
1626 esac
1629 _git_pull ()
1631 __git_complete_strategy && return
1633 case "$cur" in
1634 --*)
1635 __gitcomp "
1636 --rebase --no-rebase
1637 $__git_merge_options
1638 $__git_fetch_options
1640 return
1642 esac
1643 __git_complete_remote_or_refspec
1646 _git_push ()
1648 case "$prev" in
1649 --repo)
1650 __gitcomp_nl "$(__git_remotes)"
1651 return
1652 esac
1653 case "$cur" in
1654 --repo=*)
1655 __gitcomp_nl "$(__git_remotes)" "" "${cur##--repo=}"
1656 return
1658 --*)
1659 __gitcomp "
1660 --all --mirror --tags --dry-run --force --verbose
1661 --receive-pack= --repo= --set-upstream
1663 return
1665 esac
1666 __git_complete_remote_or_refspec
1669 _git_rebase ()
1671 local dir="$(__gitdir)"
1672 if [ -d "$dir"/rebase-apply ] || [ -d "$dir"/rebase-merge ]; then
1673 __gitcomp "--continue --skip --abort"
1674 return
1676 __git_complete_strategy && return
1677 case "$cur" in
1678 --whitespace=*)
1679 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
1680 return
1682 --*)
1683 __gitcomp "
1684 --onto --merge --strategy --interactive
1685 --preserve-merges --stat --no-stat
1686 --committer-date-is-author-date --ignore-date
1687 --ignore-whitespace --whitespace=
1688 --autosquash
1691 return
1692 esac
1693 __gitcomp_nl "$(__git_refs)"
1696 _git_reflog ()
1698 local subcommands="show delete expire"
1699 local subcommand="$(__git_find_on_cmdline "$subcommands")"
1701 if [ -z "$subcommand" ]; then
1702 __gitcomp "$subcommands"
1703 else
1704 __gitcomp_nl "$(__git_refs)"
1708 __git_send_email_confirm_options="always never auto cc compose"
1709 __git_send_email_suppresscc_options="author self cc bodycc sob cccmd body all"
1711 _git_send_email ()
1713 case "$cur" in
1714 --confirm=*)
1715 __gitcomp "
1716 $__git_send_email_confirm_options
1717 " "" "${cur##--confirm=}"
1718 return
1720 --suppress-cc=*)
1721 __gitcomp "
1722 $__git_send_email_suppresscc_options
1723 " "" "${cur##--suppress-cc=}"
1725 return
1727 --smtp-encryption=*)
1728 __gitcomp "ssl tls" "" "${cur##--smtp-encryption=}"
1729 return
1731 --thread=*)
1732 __gitcomp "
1733 deep shallow
1734 " "" "${cur##--thread=}"
1735 return
1737 --*)
1738 __gitcomp "--annotate --bcc --cc --cc-cmd --chain-reply-to
1739 --compose --confirm= --dry-run --envelope-sender
1740 --from --identity
1741 --in-reply-to --no-chain-reply-to --no-signed-off-by-cc
1742 --no-suppress-from --no-thread --quiet
1743 --signed-off-by-cc --smtp-pass --smtp-server
1744 --smtp-server-port --smtp-encryption= --smtp-user
1745 --subject --suppress-cc= --suppress-from --thread --to
1746 --validate --no-validate
1747 $__git_format_patch_options"
1748 return
1750 esac
1751 __git_complete_revlist
1754 _git_stage ()
1756 _git_add
1759 __git_config_get_set_variables ()
1761 local prevword word config_file= c=$cword
1762 while [ $c -gt 1 ]; do
1763 word="${words[c]}"
1764 case "$word" in
1765 --global|--system|--file=*)
1766 config_file="$word"
1767 break
1769 -f|--file)
1770 config_file="$word $prevword"
1771 break
1773 esac
1774 prevword=$word
1775 c=$((--c))
1776 done
1778 git --git-dir="$(__gitdir)" config $config_file --list 2>/dev/null |
1779 while read -r line
1781 case "$line" in
1782 *.*=*)
1783 echo "${line/=*/}"
1785 esac
1786 done
1789 _git_config ()
1791 case "$prev" in
1792 branch.*.remote)
1793 __gitcomp_nl "$(__git_remotes)"
1794 return
1796 branch.*.merge)
1797 __gitcomp_nl "$(__git_refs)"
1798 return
1800 remote.*.fetch)
1801 local remote="${prev#remote.}"
1802 remote="${remote%.fetch}"
1803 if [ -z "$cur" ]; then
1804 COMPREPLY=("refs/heads/")
1805 return
1807 __gitcomp_nl "$(__git_refs_remotes "$remote")"
1808 return
1810 remote.*.push)
1811 local remote="${prev#remote.}"
1812 remote="${remote%.push}"
1813 __gitcomp_nl "$(git --git-dir="$(__gitdir)" \
1814 for-each-ref --format='%(refname):%(refname)' \
1815 refs/heads)"
1816 return
1818 pull.twohead|pull.octopus)
1819 __git_compute_merge_strategies
1820 __gitcomp "$__git_merge_strategies"
1821 return
1823 color.branch|color.diff|color.interactive|\
1824 color.showbranch|color.status|color.ui)
1825 __gitcomp "always never auto"
1826 return
1828 color.pager)
1829 __gitcomp "false true"
1830 return
1832 color.*.*)
1833 __gitcomp "
1834 normal black red green yellow blue magenta cyan white
1835 bold dim ul blink reverse
1837 return
1839 help.format)
1840 __gitcomp "man info web html"
1841 return
1843 log.date)
1844 __gitcomp "$__git_log_date_formats"
1845 return
1847 sendemail.aliasesfiletype)
1848 __gitcomp "mutt mailrc pine elm gnus"
1849 return
1851 sendemail.confirm)
1852 __gitcomp "$__git_send_email_confirm_options"
1853 return
1855 sendemail.suppresscc)
1856 __gitcomp "$__git_send_email_suppresscc_options"
1857 return
1859 --get|--get-all|--unset|--unset-all)
1860 __gitcomp_nl "$(__git_config_get_set_variables)"
1861 return
1863 *.*)
1864 COMPREPLY=()
1865 return
1867 esac
1868 case "$cur" in
1869 --*)
1870 __gitcomp "
1871 --global --system --file=
1872 --list --replace-all
1873 --get --get-all --get-regexp
1874 --add --unset --unset-all
1875 --remove-section --rename-section
1877 return
1879 branch.*.*)
1880 local pfx="${cur%.*}." cur_="${cur##*.}"
1881 __gitcomp "remote merge mergeoptions rebase" "$pfx" "$cur_"
1882 return
1884 branch.*)
1885 local pfx="${cur%.*}." cur_="${cur#*.}"
1886 __gitcomp_nl "$(__git_heads)" "$pfx" "$cur_" "."
1887 return
1889 guitool.*.*)
1890 local pfx="${cur%.*}." cur_="${cur##*.}"
1891 __gitcomp "
1892 argprompt cmd confirm needsfile noconsole norescan
1893 prompt revprompt revunmerged title
1894 " "$pfx" "$cur_"
1895 return
1897 difftool.*.*)
1898 local pfx="${cur%.*}." cur_="${cur##*.}"
1899 __gitcomp "cmd path" "$pfx" "$cur_"
1900 return
1902 man.*.*)
1903 local pfx="${cur%.*}." cur_="${cur##*.}"
1904 __gitcomp "cmd path" "$pfx" "$cur_"
1905 return
1907 mergetool.*.*)
1908 local pfx="${cur%.*}." cur_="${cur##*.}"
1909 __gitcomp "cmd path trustExitCode" "$pfx" "$cur_"
1910 return
1912 pager.*)
1913 local pfx="${cur%.*}." cur_="${cur#*.}"
1914 __git_compute_all_commands
1915 __gitcomp_nl "$__git_all_commands" "$pfx" "$cur_"
1916 return
1918 remote.*.*)
1919 local pfx="${cur%.*}." cur_="${cur##*.}"
1920 __gitcomp "
1921 url proxy fetch push mirror skipDefaultUpdate
1922 receivepack uploadpack tagopt pushurl
1923 " "$pfx" "$cur_"
1924 return
1926 remote.*)
1927 local pfx="${cur%.*}." cur_="${cur#*.}"
1928 __gitcomp_nl "$(__git_remotes)" "$pfx" "$cur_" "."
1929 return
1931 url.*.*)
1932 local pfx="${cur%.*}." cur_="${cur##*.}"
1933 __gitcomp "insteadOf pushInsteadOf" "$pfx" "$cur_"
1934 return
1936 esac
1937 __gitcomp "
1938 add.ignoreErrors
1939 advice.commitBeforeMerge
1940 advice.detachedHead
1941 advice.implicitIdentity
1942 advice.pushNonFastForward
1943 advice.resolveConflict
1944 advice.statusHints
1945 alias.
1946 am.keepcr
1947 apply.ignorewhitespace
1948 apply.whitespace
1949 branch.autosetupmerge
1950 branch.autosetuprebase
1951 browser.
1952 clean.requireForce
1953 color.branch
1954 color.branch.current
1955 color.branch.local
1956 color.branch.plain
1957 color.branch.remote
1958 color.decorate.HEAD
1959 color.decorate.branch
1960 color.decorate.remoteBranch
1961 color.decorate.stash
1962 color.decorate.tag
1963 color.diff
1964 color.diff.commit
1965 color.diff.frag
1966 color.diff.func
1967 color.diff.meta
1968 color.diff.new
1969 color.diff.old
1970 color.diff.plain
1971 color.diff.whitespace
1972 color.grep
1973 color.grep.context
1974 color.grep.filename
1975 color.grep.function
1976 color.grep.linenumber
1977 color.grep.match
1978 color.grep.selected
1979 color.grep.separator
1980 color.interactive
1981 color.interactive.error
1982 color.interactive.header
1983 color.interactive.help
1984 color.interactive.prompt
1985 color.pager
1986 color.showbranch
1987 color.status
1988 color.status.added
1989 color.status.changed
1990 color.status.header
1991 color.status.nobranch
1992 color.status.untracked
1993 color.status.updated
1994 color.ui
1995 commit.status
1996 commit.template
1997 core.abbrev
1998 core.askpass
1999 core.attributesfile
2000 core.autocrlf
2001 core.bare
2002 core.bigFileThreshold
2003 core.compression
2004 core.createObject
2005 core.deltaBaseCacheLimit
2006 core.editor
2007 core.eol
2008 core.excludesfile
2009 core.fileMode
2010 core.fsyncobjectfiles
2011 core.gitProxy
2012 core.ignoreCygwinFSTricks
2013 core.ignoreStat
2014 core.ignorecase
2015 core.logAllRefUpdates
2016 core.loosecompression
2017 core.notesRef
2018 core.packedGitLimit
2019 core.packedGitWindowSize
2020 core.pager
2021 core.preferSymlinkRefs
2022 core.preloadindex
2023 core.quotepath
2024 core.repositoryFormatVersion
2025 core.safecrlf
2026 core.sharedRepository
2027 core.sparseCheckout
2028 core.symlinks
2029 core.trustctime
2030 core.warnAmbiguousRefs
2031 core.whitespace
2032 core.worktree
2033 diff.autorefreshindex
2034 diff.statGraphWidth
2035 diff.external
2036 diff.ignoreSubmodules
2037 diff.mnemonicprefix
2038 diff.noprefix
2039 diff.renameLimit
2040 diff.renames
2041 diff.suppressBlankEmpty
2042 diff.tool
2043 diff.wordRegex
2044 difftool.
2045 difftool.prompt
2046 fetch.recurseSubmodules
2047 fetch.unpackLimit
2048 format.attach
2049 format.cc
2050 format.headers
2051 format.numbered
2052 format.pretty
2053 format.signature
2054 format.signoff
2055 format.subjectprefix
2056 format.suffix
2057 format.thread
2058 format.to
2060 gc.aggressiveWindow
2061 gc.auto
2062 gc.autopacklimit
2063 gc.packrefs
2064 gc.pruneexpire
2065 gc.reflogexpire
2066 gc.reflogexpireunreachable
2067 gc.rerereresolved
2068 gc.rerereunresolved
2069 gitcvs.allbinary
2070 gitcvs.commitmsgannotation
2071 gitcvs.dbTableNamePrefix
2072 gitcvs.dbdriver
2073 gitcvs.dbname
2074 gitcvs.dbpass
2075 gitcvs.dbuser
2076 gitcvs.enabled
2077 gitcvs.logfile
2078 gitcvs.usecrlfattr
2079 guitool.
2080 gui.blamehistoryctx
2081 gui.commitmsgwidth
2082 gui.copyblamethreshold
2083 gui.diffcontext
2084 gui.encoding
2085 gui.fastcopyblame
2086 gui.matchtrackingbranch
2087 gui.newbranchtemplate
2088 gui.pruneduringfetch
2089 gui.spellingdictionary
2090 gui.trustmtime
2091 help.autocorrect
2092 help.browser
2093 help.format
2094 http.lowSpeedLimit
2095 http.lowSpeedTime
2096 http.maxRequests
2097 http.minSessions
2098 http.noEPSV
2099 http.postBuffer
2100 http.proxy
2101 http.sslCAInfo
2102 http.sslCAPath
2103 http.sslCert
2104 http.sslCertPasswordProtected
2105 http.sslKey
2106 http.sslVerify
2107 http.useragent
2108 i18n.commitEncoding
2109 i18n.logOutputEncoding
2110 imap.authMethod
2111 imap.folder
2112 imap.host
2113 imap.pass
2114 imap.port
2115 imap.preformattedHTML
2116 imap.sslverify
2117 imap.tunnel
2118 imap.user
2119 init.templatedir
2120 instaweb.browser
2121 instaweb.httpd
2122 instaweb.local
2123 instaweb.modulepath
2124 instaweb.port
2125 interactive.singlekey
2126 log.date
2127 log.decorate
2128 log.showroot
2129 mailmap.file
2130 man.
2131 man.viewer
2132 merge.
2133 merge.conflictstyle
2134 merge.log
2135 merge.renameLimit
2136 merge.renormalize
2137 merge.stat
2138 merge.tool
2139 merge.verbosity
2140 mergetool.
2141 mergetool.keepBackup
2142 mergetool.keepTemporaries
2143 mergetool.prompt
2144 notes.displayRef
2145 notes.rewrite.
2146 notes.rewrite.amend
2147 notes.rewrite.rebase
2148 notes.rewriteMode
2149 notes.rewriteRef
2150 pack.compression
2151 pack.deltaCacheLimit
2152 pack.deltaCacheSize
2153 pack.depth
2154 pack.indexVersion
2155 pack.packSizeLimit
2156 pack.threads
2157 pack.window
2158 pack.windowMemory
2159 pager.
2160 pretty.
2161 pull.octopus
2162 pull.twohead
2163 push.default
2164 rebase.autosquash
2165 rebase.stat
2166 receive.autogc
2167 receive.denyCurrentBranch
2168 receive.denyDeleteCurrent
2169 receive.denyDeletes
2170 receive.denyNonFastForwards
2171 receive.fsckObjects
2172 receive.unpackLimit
2173 receive.updateserverinfo
2174 remotes.
2175 repack.usedeltabaseoffset
2176 rerere.autoupdate
2177 rerere.enabled
2178 sendemail.
2179 sendemail.aliasesfile
2180 sendemail.aliasfiletype
2181 sendemail.bcc
2182 sendemail.cc
2183 sendemail.cccmd
2184 sendemail.chainreplyto
2185 sendemail.confirm
2186 sendemail.envelopesender
2187 sendemail.from
2188 sendemail.identity
2189 sendemail.multiedit
2190 sendemail.signedoffbycc
2191 sendemail.smtpdomain
2192 sendemail.smtpencryption
2193 sendemail.smtppass
2194 sendemail.smtpserver
2195 sendemail.smtpserveroption
2196 sendemail.smtpserverport
2197 sendemail.smtpuser
2198 sendemail.suppresscc
2199 sendemail.suppressfrom
2200 sendemail.thread
2201 sendemail.to
2202 sendemail.validate
2203 showbranch.default
2204 status.relativePaths
2205 status.showUntrackedFiles
2206 status.submodulesummary
2207 submodule.
2208 tar.umask
2209 transfer.unpackLimit
2210 url.
2211 user.email
2212 user.name
2213 user.signingkey
2214 web.browser
2215 branch. remote.
2219 _git_remote ()
2221 local subcommands="add rename remove set-head set-branches set-url show prune update"
2222 local subcommand="$(__git_find_on_cmdline "$subcommands")"
2223 if [ -z "$subcommand" ]; then
2224 __gitcomp "$subcommands"
2225 return
2228 case "$subcommand" in
2229 rename|remove|set-url|show|prune)
2230 __gitcomp_nl "$(__git_remotes)"
2232 set-head|set-branches)
2233 __git_complete_remote_or_refspec
2235 update)
2236 local i c='' IFS=$'\n'
2237 for i in $(git --git-dir="$(__gitdir)" config --get-regexp "remotes\..*" 2>/dev/null); do
2238 i="${i#remotes.}"
2239 c="$c ${i/ */}"
2240 done
2241 __gitcomp "$c"
2244 COMPREPLY=()
2246 esac
2249 _git_replace ()
2251 __gitcomp_nl "$(__git_refs)"
2254 _git_reset ()
2256 __git_has_doubledash && return
2258 case "$cur" in
2259 --*)
2260 __gitcomp "--merge --mixed --hard --soft --patch"
2261 return
2263 esac
2264 __gitcomp_nl "$(__git_refs)"
2267 _git_revert ()
2269 case "$cur" in
2270 --*)
2271 __gitcomp "--edit --mainline --no-edit --no-commit --signoff"
2272 return
2274 esac
2275 __gitcomp_nl "$(__git_refs)"
2278 _git_rm ()
2280 case "$cur" in
2281 --*)
2282 __gitcomp "--cached --dry-run --ignore-unmatch --quiet"
2283 return
2285 esac
2287 __git_complete_index_file "--cached"
2290 _git_shortlog ()
2292 __git_has_doubledash && return
2294 case "$cur" in
2295 --*)
2296 __gitcomp "
2297 $__git_log_common_options
2298 $__git_log_shortlog_options
2299 --numbered --summary
2301 return
2303 esac
2304 __git_complete_revlist
2307 _git_show ()
2309 __git_has_doubledash && return
2311 case "$cur" in
2312 --pretty=*|--format=*)
2313 __gitcomp "$__git_log_pretty_formats $(__git_pretty_aliases)
2314 " "" "${cur#*=}"
2315 return
2317 --*)
2318 __gitcomp "--pretty= --format= --abbrev-commit --oneline
2319 $__git_diff_common_options
2321 return
2323 esac
2324 __git_complete_file
2327 _git_show_branch ()
2329 case "$cur" in
2330 --*)
2331 __gitcomp "
2332 --all --remotes --topo-order --current --more=
2333 --list --independent --merge-base --no-name
2334 --color --no-color
2335 --sha1-name --sparse --topics --reflog
2337 return
2339 esac
2340 __git_complete_revlist
2343 _git_stash ()
2345 local save_opts='--keep-index --no-keep-index --quiet --patch'
2346 local subcommands='save list show apply clear drop pop create branch'
2347 local subcommand="$(__git_find_on_cmdline "$subcommands")"
2348 if [ -z "$subcommand" ]; then
2349 case "$cur" in
2350 --*)
2351 __gitcomp "$save_opts"
2354 if [ -z "$(__git_find_on_cmdline "$save_opts")" ]; then
2355 __gitcomp "$subcommands"
2356 else
2357 COMPREPLY=()
2360 esac
2361 else
2362 case "$subcommand,$cur" in
2363 save,--*)
2364 __gitcomp "$save_opts"
2366 apply,--*|pop,--*)
2367 __gitcomp "--index --quiet"
2369 show,--*|drop,--*|branch,--*)
2370 COMPREPLY=()
2372 show,*|apply,*|drop,*|pop,*|branch,*)
2373 __gitcomp_nl "$(git --git-dir="$(__gitdir)" stash list \
2374 | sed -n -e 's/:.*//p')"
2377 COMPREPLY=()
2379 esac
2383 _git_submodule ()
2385 __git_has_doubledash && return
2387 local subcommands="add status init update summary foreach sync"
2388 if [ -z "$(__git_find_on_cmdline "$subcommands")" ]; then
2389 case "$cur" in
2390 --*)
2391 __gitcomp "--quiet --cached"
2394 __gitcomp "$subcommands"
2396 esac
2397 return
2401 _git_svn ()
2403 local subcommands="
2404 init fetch clone rebase dcommit log find-rev
2405 set-tree commit-diff info create-ignore propget
2406 proplist show-ignore show-externals branch tag blame
2407 migrate mkdirs reset gc
2409 local subcommand="$(__git_find_on_cmdline "$subcommands")"
2410 if [ -z "$subcommand" ]; then
2411 __gitcomp "$subcommands"
2412 else
2413 local remote_opts="--username= --config-dir= --no-auth-cache"
2414 local fc_opts="
2415 --follow-parent --authors-file= --repack=
2416 --no-metadata --use-svm-props --use-svnsync-props
2417 --log-window-size= --no-checkout --quiet
2418 --repack-flags --use-log-author --localtime
2419 --ignore-paths= $remote_opts
2421 local init_opts="
2422 --template= --shared= --trunk= --tags=
2423 --branches= --stdlayout --minimize-url
2424 --no-metadata --use-svm-props --use-svnsync-props
2425 --rewrite-root= --prefix= --use-log-author
2426 --add-author-from $remote_opts
2428 local cmt_opts="
2429 --edit --rmdir --find-copies-harder --copy-similarity=
2432 case "$subcommand,$cur" in
2433 fetch,--*)
2434 __gitcomp "--revision= --fetch-all $fc_opts"
2436 clone,--*)
2437 __gitcomp "--revision= $fc_opts $init_opts"
2439 init,--*)
2440 __gitcomp "$init_opts"
2442 dcommit,--*)
2443 __gitcomp "
2444 --merge --strategy= --verbose --dry-run
2445 --fetch-all --no-rebase --commit-url
2446 --revision --interactive $cmt_opts $fc_opts
2449 set-tree,--*)
2450 __gitcomp "--stdin $cmt_opts $fc_opts"
2452 create-ignore,--*|propget,--*|proplist,--*|show-ignore,--*|\
2453 show-externals,--*|mkdirs,--*)
2454 __gitcomp "--revision="
2456 log,--*)
2457 __gitcomp "
2458 --limit= --revision= --verbose --incremental
2459 --oneline --show-commit --non-recursive
2460 --authors-file= --color
2463 rebase,--*)
2464 __gitcomp "
2465 --merge --verbose --strategy= --local
2466 --fetch-all --dry-run $fc_opts
2469 commit-diff,--*)
2470 __gitcomp "--message= --file= --revision= $cmt_opts"
2472 info,--*)
2473 __gitcomp "--url"
2475 branch,--*)
2476 __gitcomp "--dry-run --message --tag"
2478 tag,--*)
2479 __gitcomp "--dry-run --message"
2481 blame,--*)
2482 __gitcomp "--git-format"
2484 migrate,--*)
2485 __gitcomp "
2486 --config-dir= --ignore-paths= --minimize
2487 --no-auth-cache --username=
2490 reset,--*)
2491 __gitcomp "--revision= --parent"
2494 COMPREPLY=()
2496 esac
2500 _git_tag ()
2502 local i c=1 f=0
2503 while [ $c -lt $cword ]; do
2504 i="${words[c]}"
2505 case "$i" in
2506 -d|-v)
2507 __gitcomp_nl "$(__git_tags)"
2508 return
2513 esac
2514 ((c++))
2515 done
2517 case "$prev" in
2518 -m|-F)
2519 COMPREPLY=()
2521 -*|tag)
2522 if [ $f = 1 ]; then
2523 __gitcomp_nl "$(__git_tags)"
2524 else
2525 COMPREPLY=()
2529 __gitcomp_nl "$(__git_refs)"
2531 esac
2534 _git_whatchanged ()
2536 _git_log
2539 __git_main ()
2541 local i c=1 command __git_dir
2543 while [ $c -lt $cword ]; do
2544 i="${words[c]}"
2545 case "$i" in
2546 --git-dir=*) __git_dir="${i#--git-dir=}" ;;
2547 --bare) __git_dir="." ;;
2548 --help) command="help"; break ;;
2549 -c) c=$((++c)) ;;
2550 -*) ;;
2551 *) command="$i"; break ;;
2552 esac
2553 ((c++))
2554 done
2556 if [ -z "$command" ]; then
2557 case "$cur" in
2558 --*) __gitcomp "
2559 --paginate
2560 --no-pager
2561 --git-dir=
2562 --bare
2563 --version
2564 --exec-path
2565 --exec-path=
2566 --html-path
2567 --info-path
2568 --work-tree=
2569 --namespace=
2570 --no-replace-objects
2571 --help
2574 *) __git_compute_porcelain_commands
2575 __gitcomp "$__git_porcelain_commands $(__git_aliases)" ;;
2576 esac
2577 return
2580 local completion_func="_git_${command//-/_}"
2581 declare -f $completion_func >/dev/null && $completion_func && return
2583 local expansion=$(__git_aliased_command "$command")
2584 if [ -n "$expansion" ]; then
2585 completion_func="_git_${expansion//-/_}"
2586 declare -f $completion_func >/dev/null && $completion_func
2590 __gitk_main ()
2592 __git_has_doubledash && return
2594 local g="$(__gitdir)"
2595 local merge=""
2596 if [ -f "$g/MERGE_HEAD" ]; then
2597 merge="--merge"
2599 case "$cur" in
2600 --*)
2601 __gitcomp "
2602 $__git_log_common_options
2603 $__git_log_gitk_options
2604 $merge
2606 return
2608 esac
2609 __git_complete_revlist
2612 if [[ -n ${ZSH_VERSION-} ]]; then
2613 echo "WARNING: this script is deprecated, please see git-completion.zsh" 1>&2
2615 autoload -U +X compinit && compinit
2617 __gitcomp ()
2619 emulate -L zsh
2621 local cur_="${3-$cur}"
2623 case "$cur_" in
2624 --*=)
2627 local c IFS=$' \t\n'
2628 local -a array
2629 for c in ${=1}; do
2630 c="$c${4-}"
2631 case $c in
2632 --*=*|*.) ;;
2633 *) c="$c " ;;
2634 esac
2635 array+=("$c")
2636 done
2637 compset -P '*[=:]'
2638 compadd -Q -S '' -p "${2-}" -a -- array && _ret=0
2640 esac
2643 __gitcomp_nl ()
2645 emulate -L zsh
2647 local IFS=$'\n'
2648 compset -P '*[=:]'
2649 compadd -Q -S "${4- }" -p "${2-}" -- ${=1} && _ret=0
2652 __gitcomp_file ()
2654 emulate -L zsh
2656 local IFS=$'\n'
2657 compset -P '*[=:]'
2658 compadd -Q -p "${2-}" -f -- ${=1} && _ret=0
2661 __git_zsh_helper ()
2663 emulate -L ksh
2664 local cur cword prev
2665 cur=${words[CURRENT-1]}
2666 prev=${words[CURRENT-2]}
2667 let cword=CURRENT-1
2668 __${service}_main
2671 _git ()
2673 emulate -L zsh
2674 local _ret=1
2675 __git_zsh_helper
2676 let _ret && _default -S '' && _ret=0
2677 return _ret
2680 compdef _git git gitk
2681 return
2682 elif [[ -n ${BASH_VERSION-} ]]; then
2683 if ((${BASH_VERSINFO[0]} < 4)); then
2684 # compopt is not supported
2685 __git_index_file_list_filter ()
2687 __git_index_file_list_filter_compat
2692 __git_func_wrap ()
2694 local cur words cword prev
2695 _get_comp_words_by_ref -n =: cur words cword prev
2699 # Setup completion for certain functions defined above by setting common
2700 # variables and workarounds.
2701 # This is NOT a public function; use at your own risk.
2702 __git_complete ()
2704 local wrapper="__git_wrap${2}"
2705 eval "$wrapper () { __git_func_wrap $2 ; }"
2706 complete -o bashdefault -o default -o nospace -F $wrapper $1 2>/dev/null \
2707 || complete -o default -o nospace -F $wrapper $1
2710 # wrapper for backwards compatibility
2711 _git ()
2713 __git_wrap__git_main
2716 # wrapper for backwards compatibility
2717 _gitk ()
2719 __git_wrap__gitk_main
2722 __git_complete git __git_main
2723 __git_complete gitk __gitk_main
2725 # The following are necessary only for Cygwin, and only are needed
2726 # when the user has tab-completed the executable name and consequently
2727 # included the '.exe' suffix.
2729 if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
2730 __git_complete git.exe __git_main