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
29 *) COMP_WORDBREAKS
="$COMP_WORDBREAKS:"
32 # __gitdir accepts 0 or 1 arguments (i.e., location)
33 # returns location of .git repo
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
41 elif [ -n "${GIT_DIR-}" ]; then
42 test -d "${GIT_DIR-}" ||
return 1
44 elif [ -d .git
]; then
47 git rev-parse
--git-dir 2>/dev
/null
49 elif [ -d "$1/.git" ]; then
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)
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/
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
106 # The argument should be a collection of characters from the list of
107 # word completion separators (COMP_WORDBREAKS) to treat as ordinary
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]}"
128 if [ -z "$exclude" ]; then
129 words_
=("${COMP_WORDS[@]}")
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.
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
150 words_
[$j]=${words_[j]}${COMP_WORDS[i]}
151 if [ $i = $COMP_CWORD ]; then
154 if (($i < ${#COMP_WORDS[@]} - 1)); then
161 words_
[$j]=${words_[j]}${COMP_WORDS[i]}
162 if [ $i = $COMP_CWORD ]; then
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
176 __git_reassemble_comp_words_by_ref
"$exclude"
177 cur_
=${words_[cword_]}
178 while [ $# -gt 0 ]; do
184 prev
=${words_[$cword_-1]}
187 words
=("${words_[@]}")
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).
207 local cur_
="${3-$cur}"
215 COMPREPLY
=($
(compgen
-P "${2-}" \
216 -W "$(__gitcomp_1 "${1-}" "${4-}")" \
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
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
243 # 3: Generate possible completion matches for this word (optional).
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
()
262 while read -r path
; do
264 ?
*/*) echo "${path%%/*}/" ;;
270 __git_index_file_list_filter_bash
()
274 while read -r path
; do
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%%/*}" ;;
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
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"
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,
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
325 local dir
="$(__gitdir)" root
="${2-.}"
327 if [ -d "$dir" ]; then
328 __git_ls_files_helper
"$root" "$1" | __git_index_file_list_filter |
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
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 |
351 local dir
="$(__gitdir)"
352 if [ -d "$dir" ]; then
353 git
--git-dir="$dir" for-each-ref
--format='%(refname:short)' \
361 local dir
="$(__gitdir)"
362 if [ -d "$dir" ]; then
363 git
--git-dir="$dir" for-each-ref
--format='%(refname:short)' \
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
374 local i
hash dir
="$(__gitdir "${1-}")" track
="${2-}"
376 if [ -d "$dir" ]; then
384 for i
in HEAD FETCH_HEAD ORIG_HEAD MERGE_HEAD
; do
385 if [ -e "$dir/$i" ]; then echo $i; fi
387 format
="refname:short"
388 refs
="refs/tags refs/heads refs/remotes"
391 git
--git-dir="$dir" for-each-ref
--format="%($format)" \
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
398 git
--git-dir="$dir" for-each-ref
--shell --format="ref=%(refname:short)" \
400 while read -r entry
; do
403 if [[ "$ref" == "$cur"* ]]; then
406 done |
sort |
uniq -u
412 git ls-remote
"$dir" "$cur*" 2>/dev
/null | \
413 while read -r hash i
; do
421 git ls-remote
"$dir" HEAD ORIG_HEAD
'refs/tags/*' 'refs/heads/*' 'refs/remotes/*' 2>/dev
/null | \
422 while read -r hash i
; do
425 refs
/*) echo "${i#refs/*/}" ;;
433 # __git_refs2 requires 1 argument (to pass to __git_refs)
437 for i
in $
(__git_refs
"$1"); do
442 # __git_refs_remotes requires 1 argument (to pass to ls-remote)
443 __git_refs_remotes
()
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/}"
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
462 __git_list_merge_strategies
()
464 git merge
-s help 2>&1 |
465 sed -n -e '/[Aa]vailable strategies are: /,/^$/{
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
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"
508 case "$COMP_WORDBREAKS" in
510 *) pfx
="$ref:$pfx" ;;
513 __gitcomp_nl
"$(git --git-dir="$
(__gitdir
)" ls-tree "$ls" \
514 | sed '/^100... blob /{
530 pfx
="${cur_%...*}..."
532 __gitcomp_nl
"$(__git_refs)" "$pfx" "$cur_"
537 __gitcomp_nl
"$(__git_refs)" "$pfx" "$cur_"
540 __gitcomp_nl
"$(__git_refs)"
546 # __git_complete_index_file requires 1 argument: the options to pass to
548 __git_complete_index_file
()
550 local pfx cur_
="$cur"
558 __gitcomp_file
"$(__git_index_files "$1" "$pfx")" "$pfx" "$cur_"
561 __gitcomp_file
"$(__git_index_files "$1")" "" "$cur_"
566 # __git_complete_diff_index_file requires 1 argument: the id of a tree
568 __git_complete_diff_index_file
()
570 local pfx cur_
="$cur"
578 __gitcomp_file
"$(__git_diff_index_files "$1" "$pfx")" "$pfx" "$cur_"
581 __gitcomp_file
"$(__git_diff_index_files "$1")" "" "$cur_"
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
603 while [ $c -lt $cword ]; do
606 --mirror) [ "$cmd" = "push" ] && no_complete_refspec
=1 ;;
609 push
) no_complete_refspec
=1 ;;
618 *) remote
="$i"; break ;;
622 if [ -z "$remote" ]; then
623 __gitcomp_nl
"$(__git_remotes)"
626 if [ $no_complete_refspec = 1 ]; then
630 [ "$remote" = "." ] && remote
=
633 case "$COMP_WORDBREAKS" in
635 *) pfx
="${cur_%%:*}:" ;;
647 if [ $lhs = 1 ]; then
648 __gitcomp_nl
"$(__git_refs2 "$remote")" "$pfx" "$cur_"
650 __gitcomp_nl
"$(__git_refs)" "$pfx" "$cur_"
654 if [ $lhs = 1 ]; then
655 __gitcomp_nl
"$(__git_refs "$remote")" "$pfx" "$cur_"
657 __gitcomp_nl
"$(__git_refs)" "$pfx" "$cur_"
661 if [ $lhs = 1 ]; then
662 __gitcomp_nl
"$(__git_refs)" "$pfx" "$cur_"
664 __gitcomp_nl
"$(__git_refs "$remote")" "$pfx" "$cur_"
670 __git_complete_strategy
()
672 __git_compute_merge_strategies
675 __gitcomp
"$__git_merge_strategies"
680 __gitcomp
"$__git_merge_strategies" "" "${cur##--strategy=}"
687 __git_list_all_commands
()
690 for i
in $
(git
help -a|
egrep '^ [a-zA-Z0-9]')
693 *--*) : helper pattern
;;
700 __git_compute_all_commands
()
702 test -n "$__git_all_commands" ||
703 __git_all_commands
=$
(__git_list_all_commands
)
706 __git_list_porcelain_commands
()
709 __git_compute_all_commands
710 for i
in $__git_all_commands
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
;;
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
;;
752 pack-objects
) : plumbing
;;
753 pack-redundant
) : plumbing
;;
754 pack-refs
) : plumbing
;;
755 parse-remote
) : plumbing
;;
756 patch-id
) : plumbing
;;
757 peek-remote
) : plumbing
;;
759 prune-packed
) : plumbing
;;
760 quiltimport
) : import
;;
761 read-tree
) : plumbing
;;
762 receive-pack
) : plumbing
;;
763 remote-
*) : transport
;;
764 repo-config
) : deprecated
;;
766 rev-list
) : plumbing
;;
767 rev-parse
) : plumbing
;;
768 runstatus
) : plumbing
;;
769 sh-setup
) : internal
;;
771 show-ref
) : plumbing
;;
772 send-pack
) : plumbing
;;
773 show-index
) : plumbing
;;
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
;;
787 verify-pack
) : infrequent
;;
788 verify-tag
) : plumbing
;;
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
()
805 for i
in $
(git
--git-dir="$(__gitdir)" config
--get-regexp "pretty\..*" 2>/dev
/null
); do
818 for i
in $
(git
--git-dir="$(__gitdir)" config
--get-regexp "alias\..*" 2>/dev
/null
); do
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
839 \
!*) : shell
command alias ;;
841 *=*) : setting env
;;
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
856 for subcommand
in $1; do
857 if [ "$subcommand" = "$word" ]; then
866 __git_has_doubledash
()
869 while [ $c -lt $cword ]; do
870 if [ "--" = "${words[c]}" ]; then
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
886 # __git_count_arguments requires 1 argument: the git command executed.
887 __git_count_arguments
()
891 # Skip "git" (first argument)
892 for ((i
=1; i
< ${#words[@]}; i
++)); do
897 # Good; we can assume that the following are only non
902 # Skip the specified git command and discard git
915 __git_whitespacelist
="nowarn warn error error-all fix"
919 local dir
="$(__gitdir)"
920 if [ -d "$dir"/rebase-apply
]; then
921 __gitcomp
"--skip --continue --resolved --abort"
926 __gitcomp
"$__git_whitespacelist" "" "${cur##--whitespace=}"
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
945 __gitcomp
"$__git_whitespacelist" "" "${cur##--whitespace=}"
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
966 --interactive --refresh --patch --update --dry-run
967 --ignore-errors --intent-to-add
972 # XXX should we check for --update and --all options ?
973 __git_complete_index_file
"--others --modified"
980 __gitcomp
"$(git archive --list)" "" "${cur##--format=}"
984 __gitcomp_nl
"$(__git_remotes)" "" "${cur##--remote=}"
989 --format= --list --verbose
990 --prefix= --remote= --exec=
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"
1008 __gitcomp
"replay start"
1013 case "$subcommand" in
1014 bad|good|
reset|skip|start
)
1015 __gitcomp_nl
"$(__git_refs)"
1025 local i c
=1 only_local_ref
="n" has_r
="n"
1027 while [ $c -lt $cword ]; do
1030 -d|
-m) only_local_ref
="y" ;;
1037 --set-upstream-to=*)
1038 __gitcomp
"$(__git_refs)" "" "${cur##--set-upstream-to=}"
1042 --color --no-color --verbose --abbrev= --no-abbrev
1043 --track --no-track --contains --merged --no-merged
1044 --set-upstream-to= --edit-description --list
1049 if [ $only_local_ref = "y" -a $has_r = "n" ]; then
1050 __gitcomp_nl
"$(__git_heads)"
1052 __gitcomp_nl
"$(__git_refs)"
1060 local cmd
="${words[2]}"
1063 __gitcomp
"create list-heads verify unbundle"
1066 # looking for a file
1071 __git_complete_revlist
1080 __git_has_doubledash
&& return
1084 __gitcomp
"diff3 merge" "" "${cur##--conflict=}"
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
1099 __gitcomp_nl
"$(__git_refs '' $track)"
1106 __gitcomp
"$(__git_refs)"
1113 __gitcomp
"--edit --no-commit"
1116 __gitcomp_nl
"$(__git_refs)"
1125 __gitcomp
"--dry-run --quiet"
1130 # XXX should we check for -x option ?
1131 __git_complete_index_file
"--others"
1164 __gitcomp_nl
"$(__git_refs)" "" "${cur}"
1171 __gitcomp
"default strip verbatim whitespace
1172 " "" "${cur##--cleanup=}"
1175 --reuse-message=*|
--reedit-message=*|\
1176 --fixup=*|
--squash=*)
1177 __gitcomp_nl
"$(__git_refs)" "" "${cur#*=}"
1180 --untracked-files=*)
1181 __gitcomp
"all no normal" "" "${cur##--untracked-files=}"
1186 --all --author= --signoff --verify --no-verify
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=
1197 if git rev-parse
--verify --quiet HEAD
>/dev
/null
; then
1198 __git_complete_diff_index_file
"HEAD"
1200 # This is the first commit
1201 __git_complete_index_file
"--cached"
1210 --all --tags --contains --abbrev= --candidates=
1211 --exact-match --debug --long --match --always
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
1226 --no-prefix --src-prefix= --dst-prefix=
1227 --inter-hunk-context=
1230 --dirstat --dirstat= --dirstat-by-file
1231 --dirstat-by-file= --cumulative
1236 __git_has_doubledash
&& return
1240 __gitcomp
"--cached --staged --pickaxe-all --pickaxe-regex
1241 --base --ours --theirs --no-index
1242 $__git_diff_common_options
1247 __git_complete_revlist_file
1250 __git_mergetools_common
="diffuse ecmerge emerge kdiff3 meld opendiff
1251 tkdiff vimdiff gvimdiff xxdiff araxis p4merge bc3 codecompare
1256 __git_has_doubledash
&& return
1260 __gitcomp
"$__git_mergetools_common kompare" "" "${cur##--tool=}"
1264 __gitcomp
"--cached --staged --pickaxe-all --pickaxe-regex
1265 --base --ours --theirs
1266 --no-renames --diff-filter= --find-copies-harder
1267 --relative --ignore-submodules
1275 __git_fetch_options
="
1276 --quiet --verbose --append --upload-pack --force --keep --depth=
1277 --tags --no-tags --all --prune --dry-run
1284 __gitcomp
"$__git_fetch_options"
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
()
1305 " "" "${cur##--thread=}"
1309 __gitcomp
"$__git_format_patch_options"
1313 __git_complete_revlist
1321 --tags --root --unreachable --cache --no-reflogs --full
1322 --strict --verbose --lost-found
1334 __gitcomp
"--prune --aggressive"
1346 __git_match_ctag
() {
1347 awk "/^${1////\\/}/ { print \$1 }" "$2"
1352 __git_has_doubledash
&& return
1358 --text --ignore-case --word-regexp --invert-match
1359 --full-name --line-number
1360 --extended-regexp --basic-regexp --fixed-strings
1362 --files-with-matches --name-only
1363 --files-without-match
1366 --and --or --not --all-match
1372 case "$cword,$prev" in
1374 if test -r tags
; then
1375 __gitcomp_nl
"$(__git_match_ctag "$cur" tags)"
1381 __gitcomp_nl
"$(__git_refs)"
1388 __gitcomp
"--all --info --man --web"
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
1406 false true umask group all world everybody
1407 " "" "${cur##--shared=}"
1411 __gitcomp
"--quiet --bare --template= --shared --shared="
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
1433 # XXX ignore options like --modified and always suggest all cached
1435 __git_complete_index_file
"--cached"
1440 __gitcomp_nl
"$(__git_remotes)"
1448 # Options that go well for log, shortlog and gitk
1449 __git_log_common_options
="
1451 --branches --tags --remotes
1452 --first-parent --merges --no-merges
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=
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"
1476 __git_has_doubledash
&& return
1478 local g
="$(git rev-parse --git-dir 2>/dev/null)"
1480 if [ -f "$g/MERGE_HEAD" ]; then
1484 --pretty=*|
--format=*)
1485 __gitcomp
"$__git_log_pretty_formats $(__git_pretty_aliases)
1490 __gitcomp
"$__git_log_date_formats" "" "${cur##--date=}"
1494 __gitcomp
"long short" "" "${cur##--decorate=}"
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
1509 --decorate --decorate=
1511 --parents --children
1513 $__git_diff_common_options
1514 --pickaxe-all --pickaxe-regex
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
1529 __git_complete_strategy
&& return
1533 __gitcomp
"$__git_merge_options"
1536 __gitcomp_nl
"$(__git_refs)"
1543 __gitcomp
"$__git_mergetools_common tortoisemerge" "" "${cur##--tool=}"
1556 __gitcomp_nl
"$(__git_refs)"
1563 __gitcomp
"--dry-run"
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"
1573 __git_complete_index_file
"--cached"
1579 __gitcomp
"--tags --all --stdin"
1584 local subcommands
='add append copy edit list prune remove show'
1585 local subcommand
="$(__git_find_on_cmdline "$subcommands")"
1587 case "$subcommand,$cur" in
1594 __gitcomp_nl
"$(__git_refs)"
1597 __gitcomp
"$subcommands --ref"
1601 add
,--reuse-message=*|append
,--reuse-message=*|\
1602 add
,--reedit-message=*|append
,--reedit-message=*)
1603 __gitcomp_nl
"$(__git_refs)" "" "${cur#*=}"
1606 __gitcomp
'--file= --message= --reedit-message=
1613 __gitcomp
'--dry-run --verbose'
1622 __gitcomp_nl
"$(__git_refs)"
1631 __git_complete_strategy
&& return
1636 --rebase --no-rebase
1637 $__git_merge_options
1638 $__git_fetch_options
1643 __git_complete_remote_or_refspec
1650 __gitcomp_nl
"$(__git_remotes)"
1655 __gitcomp_nl
"$(__git_remotes)" "" "${cur##--repo=}"
1660 --all --mirror --tags --dry-run --force --verbose
1661 --receive-pack= --repo= --set-upstream
1666 __git_complete_remote_or_refspec
1671 local dir
="$(__gitdir)"
1672 if [ -d "$dir"/rebase-apply
] ||
[ -d "$dir"/rebase-merge
]; then
1673 __gitcomp
"--continue --skip --abort"
1676 __git_complete_strategy
&& return
1679 __gitcomp
"$__git_whitespacelist" "" "${cur##--whitespace=}"
1684 --onto --merge --strategy --interactive
1685 --preserve-merges --stat --no-stat
1686 --committer-date-is-author-date --ignore-date
1687 --ignore-whitespace --whitespace=
1693 __gitcomp_nl
"$(__git_refs)"
1698 local subcommands
="show delete expire"
1699 local subcommand
="$(__git_find_on_cmdline "$subcommands")"
1701 if [ -z "$subcommand" ]; then
1702 __gitcomp
"$subcommands"
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"
1716 $__git_send_email_confirm_options
1717 " "" "${cur##--confirm=}"
1722 $__git_send_email_suppresscc_options
1723 " "" "${cur##--suppress-cc=}"
1727 --smtp-encryption=*)
1728 __gitcomp
"ssl tls" "" "${cur##--smtp-encryption=}"
1734 " "" "${cur##--thread=}"
1738 __gitcomp
"--annotate --bcc --cc --cc-cmd --chain-reply-to
1739 --compose --confirm= --dry-run --envelope-sender
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"
1751 __git_complete_revlist
1759 __git_config_get_set_variables
()
1761 local prevword word config_file
= c
=$cword
1762 while [ $c -gt 1 ]; do
1765 --global|
--system|
--file=*)
1770 config_file
="$word $prevword"
1778 git
--git-dir="$(__gitdir)" config
$config_file --list 2>/dev
/null |
1793 __gitcomp_nl
"$(__git_remotes)"
1797 __gitcomp_nl
"$(__git_refs)"
1801 local remote
="${prev#remote.}"
1802 remote
="${remote%.fetch}"
1803 if [ -z "$cur" ]; then
1804 COMPREPLY
=("refs/heads/")
1807 __gitcomp_nl
"$(__git_refs_remotes "$remote")"
1811 local remote
="${prev#remote.}"
1812 remote
="${remote%.push}"
1813 __gitcomp_nl
"$(git --git-dir="$
(__gitdir
)" \
1814 for-each-ref --format='%(refname):%(refname)' \
1818 pull.twohead|pull.octopus
)
1819 __git_compute_merge_strategies
1820 __gitcomp
"$__git_merge_strategies"
1823 color.branch|color.
diff|color.interactive|\
1824 color.showbranch|color.status|color.ui
)
1825 __gitcomp
"always never auto"
1829 __gitcomp
"false true"
1834 normal black red green yellow blue magenta cyan white
1835 bold dim ul blink reverse
1840 __gitcomp
"man info web html"
1844 __gitcomp
"$__git_log_date_formats"
1847 sendemail.aliasesfiletype
)
1848 __gitcomp
"mutt mailrc pine elm gnus"
1852 __gitcomp
"$__git_send_email_confirm_options"
1855 sendemail.suppresscc
)
1856 __gitcomp
"$__git_send_email_suppresscc_options"
1859 --get|
--get-all|
--unset|
--unset-all)
1860 __gitcomp_nl
"$(__git_config_get_set_variables)"
1871 --global --system --file=
1872 --list --replace-all
1873 --get --get-all --get-regexp
1874 --add --unset --unset-all
1875 --remove-section --rename-section
1880 local pfx
="${cur%.*}." cur_
="${cur##*.}"
1881 __gitcomp
"remote merge mergeoptions rebase" "$pfx" "$cur_"
1885 local pfx
="${cur%.*}." cur_
="${cur#*.}"
1886 __gitcomp_nl
"$(__git_heads)" "$pfx" "$cur_" "."
1890 local pfx
="${cur%.*}." cur_
="${cur##*.}"
1892 argprompt cmd confirm needsfile noconsole norescan
1893 prompt revprompt revunmerged title
1898 local pfx
="${cur%.*}." cur_
="${cur##*.}"
1899 __gitcomp
"cmd path" "$pfx" "$cur_"
1903 local pfx
="${cur%.*}." cur_
="${cur##*.}"
1904 __gitcomp
"cmd path" "$pfx" "$cur_"
1908 local pfx
="${cur%.*}." cur_
="${cur##*.}"
1909 __gitcomp
"cmd path trustExitCode" "$pfx" "$cur_"
1913 local pfx
="${cur%.*}." cur_
="${cur#*.}"
1914 __git_compute_all_commands
1915 __gitcomp_nl
"$__git_all_commands" "$pfx" "$cur_"
1919 local pfx
="${cur%.*}." cur_
="${cur##*.}"
1921 url proxy fetch push mirror skipDefaultUpdate
1922 receivepack uploadpack tagopt pushurl
1927 local pfx
="${cur%.*}." cur_
="${cur#*.}"
1928 __gitcomp_nl
"$(__git_remotes)" "$pfx" "$cur_" "."
1932 local pfx
="${cur%.*}." cur_
="${cur##*.}"
1933 __gitcomp
"insteadOf pushInsteadOf" "$pfx" "$cur_"
1939 advice.commitBeforeMerge
1941 advice.implicitIdentity
1942 advice.pushNonFastForward
1943 advice.resolveConflict
1947 apply.ignorewhitespace
1949 branch.autosetupmerge
1950 branch.autosetuprebase
1954 color.branch.current
1959 color.decorate.branch
1960 color.decorate.remoteBranch
1961 color.decorate.stash
1971 color.diff.whitespace
1976 color.grep.linenumber
1979 color.grep.separator
1981 color.interactive.error
1982 color.interactive.header
1983 color.interactive.help
1984 color.interactive.prompt
1989 color.status.changed
1991 color.status.nobranch
1992 color.status.untracked
1993 color.status.updated
2002 core.bigFileThreshold
2005 core.deltaBaseCacheLimit
2010 core.fsyncobjectfiles
2012 core.ignoreCygwinFSTricks
2015 core.logAllRefUpdates
2016 core.loosecompression
2019 core.packedGitWindowSize
2021 core.preferSymlinkRefs
2024 core.repositoryFormatVersion
2026 core.sharedRepository
2030 core.warnAmbiguousRefs
2033 diff.autorefreshindex
2036 diff.ignoreSubmodules
2041 diff.suppressBlankEmpty
2046 fetch.recurseSubmodules
2055 format.subjectprefix
2066 gc.reflogexpireunreachable
2070 gitcvs.commitmsgannotation
2071 gitcvs.dbTableNamePrefix
2082 gui.copyblamethreshold
2086 gui.matchtrackingbranch
2087 gui.newbranchtemplate
2088 gui.pruneduringfetch
2089 gui.spellingdictionary
2104 http.sslCertPasswordProtected
2109 i18n.logOutputEncoding
2115 imap.preformattedHTML
2125 interactive.singlekey
2141 mergetool.keepBackup
2142 mergetool.keepTemporaries
2147 notes.rewrite.rebase
2151 pack.deltaCacheLimit
2167 receive.denyCurrentBranch
2168 receive.denyDeleteCurrent
2170 receive.denyNonFastForwards
2173 receive.updateserverinfo
2175 repack.usedeltabaseoffset
2179 sendemail.aliasesfile
2180 sendemail.aliasfiletype
2184 sendemail.chainreplyto
2186 sendemail.envelopesender
2190 sendemail.signedoffbycc
2191 sendemail.smtpdomain
2192 sendemail.smtpencryption
2194 sendemail.smtpserver
2195 sendemail.smtpserveroption
2196 sendemail.smtpserverport
2198 sendemail.suppresscc
2199 sendemail.suppressfrom
2204 status.relativePaths
2205 status.showUntrackedFiles
2206 status.submodulesummary
2209 transfer.unpackLimit
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"
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
2236 local i c
='' IFS
=$
'\n'
2237 for i
in $
(git
--git-dir="$(__gitdir)" config
--get-regexp "remotes\..*" 2>/dev
/null
); do
2251 __gitcomp_nl
"$(__git_refs)"
2256 __git_has_doubledash
&& return
2260 __gitcomp
"--merge --mixed --hard --soft --patch"
2264 __gitcomp_nl
"$(__git_refs)"
2271 __gitcomp
"--edit --mainline --no-edit --no-commit --signoff"
2275 __gitcomp_nl
"$(__git_refs)"
2282 __gitcomp
"--cached --dry-run --ignore-unmatch --quiet"
2287 __git_complete_index_file
"--cached"
2292 __git_has_doubledash
&& return
2297 $__git_log_common_options
2298 $__git_log_shortlog_options
2299 --numbered --summary
2304 __git_complete_revlist
2309 __git_has_doubledash
&& return
2312 --pretty=*|
--format=*)
2313 __gitcomp
"$__git_log_pretty_formats $(__git_pretty_aliases)
2318 __gitcomp
"--pretty= --format= --abbrev-commit --oneline
2319 $__git_diff_common_options
2332 --all --remotes --topo-order --current --more=
2333 --list --independent --merge-base --no-name
2335 --sha1-name --sparse --topics --reflog
2340 __git_complete_revlist
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
2351 __gitcomp
"$save_opts"
2354 if [ -z "$(__git_find_on_cmdline "$save_opts")" ]; then
2355 __gitcomp
"$subcommands"
2362 case "$subcommand,$cur" in
2364 __gitcomp
"$save_opts"
2367 __gitcomp
"--index --quiet"
2369 show
,--*|drop
,--*|branch
,--*)
2372 show
,*|apply
,*|drop
,*|pop
,*|branch
,*)
2373 __gitcomp_nl
"$(git --git-dir="$
(__gitdir
)" stash list \
2374 | sed -n -e 's/:.*//p')"
2385 __git_has_doubledash
&& return
2387 local subcommands
="add status init update summary foreach sync"
2388 if [ -z "$(__git_find_on_cmdline "$subcommands")" ]; then
2391 __gitcomp
"--quiet --cached"
2394 __gitcomp
"$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"
2413 local remote_opts
="--username= --config-dir= --no-auth-cache"
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
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
2429 --edit --rmdir --find-copies-harder --copy-similarity=
2432 case "$subcommand,$cur" in
2434 __gitcomp
"--revision= --fetch-all $fc_opts"
2437 __gitcomp
"--revision= $fc_opts $init_opts"
2440 __gitcomp
"$init_opts"
2444 --merge --strategy= --verbose --dry-run
2445 --fetch-all --no-rebase --commit-url
2446 --revision --interactive $cmt_opts $fc_opts
2450 __gitcomp
"--stdin $cmt_opts $fc_opts"
2452 create-ignore
,--*|propget
,--*|proplist
,--*|show-ignore
,--*|\
2453 show-externals
,--*|mkdirs
,--*)
2454 __gitcomp
"--revision="
2458 --limit= --revision= --verbose --incremental
2459 --oneline --show-commit --non-recursive
2460 --authors-file= --color
2465 --merge --verbose --strategy= --local
2466 --fetch-all --dry-run $fc_opts
2470 __gitcomp
"--message= --file= --revision= $cmt_opts"
2476 __gitcomp
"--dry-run --message --tag"
2479 __gitcomp
"--dry-run --message"
2482 __gitcomp
"--git-format"
2486 --config-dir= --ignore-paths= --minimize
2487 --no-auth-cache --username=
2491 __gitcomp
"--revision= --parent"
2503 while [ $c -lt $cword ]; do
2507 __gitcomp_nl
"$(__git_tags)"
2523 __gitcomp_nl
"$(__git_tags)"
2529 __gitcomp_nl
"$(__git_refs)"
2541 local i c
=1 command __git_dir
2543 while [ $c -lt $cword ]; do
2546 --git-dir=*) __git_dir
="${i#--git-dir=}" ;;
2547 --bare) __git_dir
="." ;;
2548 --help) command="help"; break ;;
2551 *) command="$i"; break ;;
2556 if [ -z "$command" ]; then
2570 --no-replace-objects
2574 *) __git_compute_porcelain_commands
2575 __gitcomp
"$__git_porcelain_commands $(__git_aliases)" ;;
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
2592 __git_has_doubledash
&& return
2594 local g
="$(__gitdir)"
2596 if [ -f "$g/MERGE_HEAD" ]; then
2602 $__git_log_common_options
2603 $__git_log_gitk_options
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
2621 local cur_
="${3-$cur}"
2627 local c IFS
=$
' \t\n'
2638 compadd
-Q -S '' -p "${2-}" -a -- array
&& _ret
=0
2649 compadd
-Q -S "${4- }" -p "${2-}" -- ${=1} && _ret=0
2658 compadd -Q -p "${2-}" -f -- ${=1} && _ret=0
2664 local cur cword prev
2665 cur=${words[CURRENT-1]}
2666 prev=${words[CURRENT-2]}
2676 let _ret && _default -S '' && _ret=0
2680 compdef _git git gitk
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
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.
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
2713 __git_wrap__git_main
2716 # wrapper for backwards compatibility
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