bash: add missing 'git merge' options
[alt-git.git] / contrib / completion / git-completion.bash
blob0bb768f1c10494128fce8ecd496efed4cfb9c211
1 #!bash
3 # bash completion support for core Git.
5 # Copyright (C) 2006,2007 Shawn O. Pearce <spearce@spearce.org>
6 # Conceptually based on gitcompletion (http://gitweb.hawaga.org.uk/).
7 # Distributed under the GNU General Public License, version 2.0.
9 # The contained completion routines provide support for completing:
11 # *) local and remote branch names
12 # *) local and remote tag names
13 # *) .git/remotes file names
14 # *) git 'subcommands'
15 # *) tree paths within 'ref:path/to/file' expressions
16 # *) common --long-options
18 # To use these routines:
20 # 1) Copy this file to somewhere (e.g. ~/.git-completion.sh).
21 # 2) Added the following line to your .bashrc:
22 # source ~/.git-completion.sh
24 # 3) You may want to make sure the git executable is available
25 # in your PATH before this script is sourced, as some caching
26 # is performed while the script loads. If git isn't found
27 # at source time then all lookups will be done on demand,
28 # which may be slightly slower.
30 # 4) Consider changing your PS1 to also show the current branch:
31 # PS1='[\u@\h \W$(__git_ps1 " (%s)")]\$ '
33 # The argument to __git_ps1 will be displayed only if you
34 # are currently in a git repository. The %s token will be
35 # the name of the current branch.
37 # In addition, if you set GIT_PS1_SHOWDIRTYSTATE to a nonempty
38 # value, unstaged (*) and staged (+) changes will be shown next
39 # to the branch name. You can configure this per-repository
40 # with the bash.showDirtyState variable, which defaults to true
41 # once GIT_PS1_SHOWDIRTYSTATE is enabled.
43 # To submit patches:
45 # *) Read Documentation/SubmittingPatches
46 # *) Send all patches to the current maintainer:
48 # "Shawn O. Pearce" <spearce@spearce.org>
50 # *) Always CC the Git mailing list:
52 # git@vger.kernel.org
55 case "$COMP_WORDBREAKS" in
56 *:*) : great ;;
57 *) COMP_WORDBREAKS="$COMP_WORDBREAKS:"
58 esac
60 # __gitdir accepts 0 or 1 arguments (i.e., location)
61 # returns location of .git repo
62 __gitdir ()
64 if [ -z "${1-}" ]; then
65 if [ -n "$__git_dir" ]; then
66 echo "$__git_dir"
67 elif [ -d .git ]; then
68 echo .git
69 else
70 git rev-parse --git-dir 2>/dev/null
72 elif [ -d "$1/.git" ]; then
73 echo "$1/.git"
74 else
75 echo "$1"
79 # __git_ps1 accepts 0 or 1 arguments (i.e., format string)
80 # returns text to add to bash PS1 prompt (includes branch name)
81 __git_ps1 ()
83 local g="$(git rev-parse --git-dir 2>/dev/null)"
84 if [ -n "$g" ]; then
85 local r
86 local b
87 if [ -d "$g/rebase-apply" ]
88 then
89 if test -f "$g/rebase-apply/rebasing"
90 then
91 r="|REBASE"
92 elif test -f "$g/rebase-apply/applying"
93 then
94 r="|AM"
95 else
96 r="|AM/REBASE"
98 b="$(git symbolic-ref HEAD 2>/dev/null)"
99 elif [ -f "$g/rebase-merge/interactive" ]
100 then
101 r="|REBASE-i"
102 b="$(cat "$g/rebase-merge/head-name")"
103 elif [ -d "$g/rebase-merge" ]
104 then
105 r="|REBASE-m"
106 b="$(cat "$g/rebase-merge/head-name")"
107 elif [ -f "$g/MERGE_HEAD" ]
108 then
109 r="|MERGING"
110 b="$(git symbolic-ref HEAD 2>/dev/null)"
111 else
112 if [ -f "$g/BISECT_LOG" ]
113 then
114 r="|BISECTING"
116 if ! b="$(git symbolic-ref HEAD 2>/dev/null)"
117 then
118 if ! b="$(git describe --exact-match HEAD 2>/dev/null)"
119 then
120 b="$(cut -c1-7 "$g/HEAD")..."
125 local w
126 local i
128 if test -n "${GIT_PS1_SHOWDIRTYSTATE-}"; then
129 if test "$(git config --bool bash.showDirtyState)" != "false"; then
130 git diff --no-ext-diff --ignore-submodules \
131 --quiet --exit-code || w="*"
132 if git rev-parse --quiet --verify HEAD >/dev/null; then
133 git diff-index --cached --quiet \
134 --ignore-submodules HEAD -- || i="+"
135 else
136 i="#"
141 if [ -n "${1-}" ]; then
142 printf "$1" "${b##refs/heads/}$w$i$r"
143 else
144 printf " (%s)" "${b##refs/heads/}$w$i$r"
149 # __gitcomp_1 requires 2 arguments
150 __gitcomp_1 ()
152 local c IFS=' '$'\t'$'\n'
153 for c in $1; do
154 case "$c$2" in
155 --*=*) printf %s$'\n' "$c$2" ;;
156 *.) printf %s$'\n' "$c$2" ;;
157 *) printf %s$'\n' "$c$2 " ;;
158 esac
159 done
162 # __gitcomp accepts 1, 2, 3, or 4 arguments
163 # generates completion reply with compgen
164 __gitcomp ()
166 local cur="${COMP_WORDS[COMP_CWORD]}"
167 if [ $# -gt 2 ]; then
168 cur="$3"
170 case "$cur" in
171 --*=)
172 COMPREPLY=()
175 local IFS=$'\n'
176 COMPREPLY=($(compgen -P "${2-}" \
177 -W "$(__gitcomp_1 "${1-}" "${4-}")" \
178 -- "$cur"))
180 esac
183 # __git_heads accepts 0 or 1 arguments (to pass to __gitdir)
184 __git_heads ()
186 local cmd i is_hash=y dir="$(__gitdir "${1-}")"
187 if [ -d "$dir" ]; then
188 git --git-dir="$dir" for-each-ref --format='%(refname:short)' \
189 refs/heads
190 return
192 for i in $(git ls-remote "${1-}" 2>/dev/null); do
193 case "$is_hash,$i" in
194 y,*) is_hash=n ;;
195 n,*^{}) is_hash=y ;;
196 n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;
197 n,*) is_hash=y; echo "$i" ;;
198 esac
199 done
202 # __git_tags accepts 0 or 1 arguments (to pass to __gitdir)
203 __git_tags ()
205 local cmd i is_hash=y dir="$(__gitdir "${1-}")"
206 if [ -d "$dir" ]; then
207 git --git-dir="$dir" for-each-ref --format='%(refname:short)' \
208 refs/tags
209 return
211 for i in $(git ls-remote "${1-}" 2>/dev/null); do
212 case "$is_hash,$i" in
213 y,*) is_hash=n ;;
214 n,*^{}) is_hash=y ;;
215 n,refs/tags/*) is_hash=y; echo "${i#refs/tags/}" ;;
216 n,*) is_hash=y; echo "$i" ;;
217 esac
218 done
221 # __git_refs accepts 0 or 1 arguments (to pass to __gitdir)
222 __git_refs ()
224 local i is_hash=y dir="$(__gitdir "${1-}")"
225 local cur="${COMP_WORDS[COMP_CWORD]}" format refs
226 if [ -d "$dir" ]; then
227 case "$cur" in
228 refs|refs/*)
229 format="refname"
230 refs="${cur%/*}"
233 if [ -e "$dir/HEAD" ]; then echo HEAD; fi
234 format="refname:short"
235 refs="refs/tags refs/heads refs/remotes"
237 esac
238 git --git-dir="$dir" for-each-ref --format="%($format)" \
239 $refs
240 return
242 for i in $(git ls-remote "$dir" 2>/dev/null); do
243 case "$is_hash,$i" in
244 y,*) is_hash=n ;;
245 n,*^{}) is_hash=y ;;
246 n,refs/tags/*) is_hash=y; echo "${i#refs/tags/}" ;;
247 n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;
248 n,refs/remotes/*) is_hash=y; echo "${i#refs/remotes/}" ;;
249 n,*) is_hash=y; echo "$i" ;;
250 esac
251 done
254 # __git_refs2 requires 1 argument (to pass to __git_refs)
255 __git_refs2 ()
257 local i
258 for i in $(__git_refs "$1"); do
259 echo "$i:$i"
260 done
263 # __git_refs_remotes requires 1 argument (to pass to ls-remote)
264 __git_refs_remotes ()
266 local cmd i is_hash=y
267 for i in $(git ls-remote "$1" 2>/dev/null); do
268 case "$is_hash,$i" in
269 n,refs/heads/*)
270 is_hash=y
271 echo "$i:refs/remotes/$1/${i#refs/heads/}"
273 y,*) is_hash=n ;;
274 n,*^{}) is_hash=y ;;
275 n,refs/tags/*) is_hash=y;;
276 n,*) is_hash=y; ;;
277 esac
278 done
281 __git_remotes ()
283 local i ngoff IFS=$'\n' d="$(__gitdir)"
284 shopt -q nullglob || ngoff=1
285 shopt -s nullglob
286 for i in "$d/remotes"/*; do
287 echo ${i#$d/remotes/}
288 done
289 [ "$ngoff" ] && shopt -u nullglob
290 for i in $(git --git-dir="$d" config --list); do
291 case "$i" in
292 remote.*.url=*)
293 i="${i#remote.}"
294 echo "${i/.url=*/}"
296 esac
297 done
300 __git_merge_strategies ()
302 if [ -n "$__git_merge_strategylist" ]; then
303 echo "$__git_merge_strategylist"
304 return
306 git merge -s help 2>&1 |
307 sed -n -e '/[Aa]vailable strategies are: /,/^$/{
308 s/\.$//
309 s/.*://
310 s/^[ ]*//
311 s/[ ]*$//
315 __git_merge_strategylist=
316 __git_merge_strategylist=$(__git_merge_strategies 2>/dev/null)
318 __git_complete_file ()
320 local pfx ls ref cur="${COMP_WORDS[COMP_CWORD]}"
321 case "$cur" in
322 ?*:*)
323 ref="${cur%%:*}"
324 cur="${cur#*:}"
325 case "$cur" in
326 ?*/*)
327 pfx="${cur%/*}"
328 cur="${cur##*/}"
329 ls="$ref:$pfx"
330 pfx="$pfx/"
333 ls="$ref"
335 esac
337 case "$COMP_WORDBREAKS" in
338 *:*) : great ;;
339 *) pfx="$ref:$pfx" ;;
340 esac
342 local IFS=$'\n'
343 COMPREPLY=($(compgen -P "$pfx" \
344 -W "$(git --git-dir="$(__gitdir)" ls-tree "$ls" \
345 | sed '/^100... blob /{
346 s,^.* ,,
347 s,$, ,
349 /^120000 blob /{
350 s,^.* ,,
351 s,$, ,
353 /^040000 tree /{
354 s,^.* ,,
355 s,$,/,
357 s/^.* //')" \
358 -- "$cur"))
361 __gitcomp "$(__git_refs)"
363 esac
366 __git_complete_revlist ()
368 local pfx cur="${COMP_WORDS[COMP_CWORD]}"
369 case "$cur" in
370 *...*)
371 pfx="${cur%...*}..."
372 cur="${cur#*...}"
373 __gitcomp "$(__git_refs)" "$pfx" "$cur"
375 *..*)
376 pfx="${cur%..*}.."
377 cur="${cur#*..}"
378 __gitcomp "$(__git_refs)" "$pfx" "$cur"
381 __gitcomp "$(__git_refs)"
383 esac
386 __git_all_commands ()
388 if [ -n "$__git_all_commandlist" ]; then
389 echo "$__git_all_commandlist"
390 return
392 local i IFS=" "$'\n'
393 for i in $(git help -a|egrep '^ ')
395 case $i in
396 *--*) : helper pattern;;
397 *) echo $i;;
398 esac
399 done
401 __git_all_commandlist=
402 __git_all_commandlist="$(__git_all_commands 2>/dev/null)"
404 __git_porcelain_commands ()
406 if [ -n "$__git_porcelain_commandlist" ]; then
407 echo "$__git_porcelain_commandlist"
408 return
410 local i IFS=" "$'\n'
411 for i in "help" $(__git_all_commands)
413 case $i in
414 *--*) : helper pattern;;
415 applymbox) : ask gittus;;
416 applypatch) : ask gittus;;
417 archimport) : import;;
418 cat-file) : plumbing;;
419 check-attr) : plumbing;;
420 check-ref-format) : plumbing;;
421 checkout-index) : plumbing;;
422 commit-tree) : plumbing;;
423 count-objects) : infrequent;;
424 cvsexportcommit) : export;;
425 cvsimport) : import;;
426 cvsserver) : daemon;;
427 daemon) : daemon;;
428 diff-files) : plumbing;;
429 diff-index) : plumbing;;
430 diff-tree) : plumbing;;
431 fast-import) : import;;
432 fast-export) : export;;
433 fsck-objects) : plumbing;;
434 fetch-pack) : plumbing;;
435 fmt-merge-msg) : plumbing;;
436 for-each-ref) : plumbing;;
437 hash-object) : plumbing;;
438 http-*) : transport;;
439 index-pack) : plumbing;;
440 init-db) : deprecated;;
441 local-fetch) : plumbing;;
442 lost-found) : infrequent;;
443 ls-files) : plumbing;;
444 ls-remote) : plumbing;;
445 ls-tree) : plumbing;;
446 mailinfo) : plumbing;;
447 mailsplit) : plumbing;;
448 merge-*) : plumbing;;
449 mktree) : plumbing;;
450 mktag) : plumbing;;
451 pack-objects) : plumbing;;
452 pack-redundant) : plumbing;;
453 pack-refs) : plumbing;;
454 parse-remote) : plumbing;;
455 patch-id) : plumbing;;
456 peek-remote) : plumbing;;
457 prune) : plumbing;;
458 prune-packed) : plumbing;;
459 quiltimport) : import;;
460 read-tree) : plumbing;;
461 receive-pack) : plumbing;;
462 reflog) : plumbing;;
463 repo-config) : deprecated;;
464 rerere) : plumbing;;
465 rev-list) : plumbing;;
466 rev-parse) : plumbing;;
467 runstatus) : plumbing;;
468 sh-setup) : internal;;
469 shell) : daemon;;
470 show-ref) : plumbing;;
471 send-pack) : plumbing;;
472 show-index) : plumbing;;
473 ssh-*) : transport;;
474 stripspace) : plumbing;;
475 symbolic-ref) : plumbing;;
476 tar-tree) : deprecated;;
477 unpack-file) : plumbing;;
478 unpack-objects) : plumbing;;
479 update-index) : plumbing;;
480 update-ref) : plumbing;;
481 update-server-info) : daemon;;
482 upload-archive) : plumbing;;
483 upload-pack) : plumbing;;
484 write-tree) : plumbing;;
485 var) : infrequent;;
486 verify-pack) : infrequent;;
487 verify-tag) : plumbing;;
488 *) echo $i;;
489 esac
490 done
492 __git_porcelain_commandlist=
493 __git_porcelain_commandlist="$(__git_porcelain_commands 2>/dev/null)"
495 __git_aliases ()
497 local i IFS=$'\n'
498 for i in $(git --git-dir="$(__gitdir)" config --list); do
499 case "$i" in
500 alias.*)
501 i="${i#alias.}"
502 echo "${i/=*/}"
504 esac
505 done
508 # __git_aliased_command requires 1 argument
509 __git_aliased_command ()
511 local word cmdline=$(git --git-dir="$(__gitdir)" \
512 config --get "alias.$1")
513 for word in $cmdline; do
514 if [ "${word##-*}" ]; then
515 echo $word
516 return
518 done
521 # __git_find_subcommand requires 1 argument
522 __git_find_subcommand ()
524 local word subcommand c=1
526 while [ $c -lt $COMP_CWORD ]; do
527 word="${COMP_WORDS[c]}"
528 for subcommand in $1; do
529 if [ "$subcommand" = "$word" ]; then
530 echo "$subcommand"
531 return
533 done
534 c=$((++c))
535 done
538 __git_has_doubledash ()
540 local c=1
541 while [ $c -lt $COMP_CWORD ]; do
542 if [ "--" = "${COMP_WORDS[c]}" ]; then
543 return 0
545 c=$((++c))
546 done
547 return 1
550 __git_whitespacelist="nowarn warn error error-all fix"
552 _git_am ()
554 local cur="${COMP_WORDS[COMP_CWORD]}" dir="$(__gitdir)"
555 if [ -d "$dir"/rebase-apply ]; then
556 __gitcomp "--skip --resolved --abort"
557 return
559 case "$cur" in
560 --whitespace=*)
561 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
562 return
564 --*)
565 __gitcomp "
566 --signoff --utf8 --binary --3way --interactive
567 --whitespace=
569 return
570 esac
571 COMPREPLY=()
574 _git_apply ()
576 local cur="${COMP_WORDS[COMP_CWORD]}"
577 case "$cur" in
578 --whitespace=*)
579 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
580 return
582 --*)
583 __gitcomp "
584 --stat --numstat --summary --check --index
585 --cached --index-info --reverse --reject --unidiff-zero
586 --apply --no-add --exclude=
587 --whitespace= --inaccurate-eof --verbose
589 return
590 esac
591 COMPREPLY=()
594 _git_add ()
596 __git_has_doubledash && return
598 local cur="${COMP_WORDS[COMP_CWORD]}"
599 case "$cur" in
600 --*)
601 __gitcomp "
602 --interactive --refresh --patch --update --dry-run
603 --ignore-errors --intent-to-add
605 return
606 esac
607 COMPREPLY=()
610 _git_archive ()
612 local cur="${COMP_WORDS[COMP_CWORD]}"
613 case "$cur" in
614 --format=*)
615 __gitcomp "$(git archive --list)" "" "${cur##--format=}"
616 return
618 --remote=*)
619 __gitcomp "$(__git_remotes)" "" "${cur##--remote=}"
620 return
622 --*)
623 __gitcomp "
624 --format= --list --verbose
625 --prefix= --remote= --exec=
627 return
629 esac
630 __git_complete_file
633 _git_bisect ()
635 __git_has_doubledash && return
637 local subcommands="start bad good skip reset visualize replay log run"
638 local subcommand="$(__git_find_subcommand "$subcommands")"
639 if [ -z "$subcommand" ]; then
640 __gitcomp "$subcommands"
641 return
644 case "$subcommand" in
645 bad|good|reset|skip)
646 __gitcomp "$(__git_refs)"
649 COMPREPLY=()
651 esac
654 _git_branch ()
656 local i c=1 only_local_ref="n" has_r="n"
658 while [ $c -lt $COMP_CWORD ]; do
659 i="${COMP_WORDS[c]}"
660 case "$i" in
661 -d|-m) only_local_ref="y" ;;
662 -r) has_r="y" ;;
663 esac
664 c=$((++c))
665 done
667 case "${COMP_WORDS[COMP_CWORD]}" in
668 --*)
669 __gitcomp "
670 --color --no-color --verbose --abbrev= --no-abbrev
671 --track --no-track --contains --merged --no-merged
675 if [ $only_local_ref = "y" -a $has_r = "n" ]; then
676 __gitcomp "$(__git_heads)"
677 else
678 __gitcomp "$(__git_refs)"
681 esac
684 _git_bundle ()
686 local cmd="${COMP_WORDS[2]}"
687 case "$COMP_CWORD" in
689 __gitcomp "create list-heads verify unbundle"
692 # looking for a file
695 case "$cmd" in
696 create)
697 __git_complete_revlist
699 esac
701 esac
704 _git_checkout ()
706 __git_has_doubledash && return
708 __gitcomp "$(__git_refs)"
711 _git_cherry ()
713 __gitcomp "$(__git_refs)"
716 _git_cherry_pick ()
718 local cur="${COMP_WORDS[COMP_CWORD]}"
719 case "$cur" in
720 --*)
721 __gitcomp "--edit --no-commit"
724 __gitcomp "$(__git_refs)"
726 esac
729 _git_clean ()
731 __git_has_doubledash && return
733 local cur="${COMP_WORDS[COMP_CWORD]}"
734 case "$cur" in
735 --*)
736 __gitcomp "--dry-run --quiet"
737 return
739 esac
740 COMPREPLY=()
743 _git_clone ()
745 local cur="${COMP_WORDS[COMP_CWORD]}"
746 case "$cur" in
747 --*)
748 __gitcomp "
749 --local
750 --no-hardlinks
751 --shared
752 --reference
753 --quiet
754 --no-checkout
755 --bare
756 --mirror
757 --origin
758 --upload-pack
759 --template=
760 --depth
762 return
764 esac
765 COMPREPLY=()
768 _git_commit ()
770 __git_has_doubledash && return
772 local cur="${COMP_WORDS[COMP_CWORD]}"
773 case "$cur" in
774 --*)
775 __gitcomp "
776 --all --author= --signoff --verify --no-verify
777 --edit --amend --include --only --interactive
779 return
780 esac
781 COMPREPLY=()
784 _git_describe ()
786 local cur="${COMP_WORDS[COMP_CWORD]}"
787 case "$cur" in
788 --*)
789 __gitcomp "
790 --all --tags --contains --abbrev= --candidates=
791 --exact-match --debug --long --match --always
793 return
794 esac
795 __gitcomp "$(__git_refs)"
798 __git_diff_common_options="--stat --numstat --shortstat --summary
799 --patch-with-stat --name-only --name-status --color
800 --no-color --color-words --no-renames --check
801 --full-index --binary --abbrev --diff-filter=
802 --find-copies-harder
803 --text --ignore-space-at-eol --ignore-space-change
804 --ignore-all-space --exit-code --quiet --ext-diff
805 --no-ext-diff
806 --no-prefix --src-prefix= --dst-prefix=
807 --inter-hunk-context=
808 --patience
809 --raw
812 _git_diff ()
814 __git_has_doubledash && return
816 local cur="${COMP_WORDS[COMP_CWORD]}"
817 case "$cur" in
818 --*)
819 __gitcomp "--cached --pickaxe-all --pickaxe-regex
820 --base --ours --theirs
821 $__git_diff_common_options
823 return
825 esac
826 __git_complete_file
829 _git_fetch ()
831 local cur="${COMP_WORDS[COMP_CWORD]}"
833 if [ "$COMP_CWORD" = 2 ]; then
834 __gitcomp "$(__git_remotes)"
835 else
836 case "$cur" in
837 *:*)
838 local pfx=""
839 case "$COMP_WORDBREAKS" in
840 *:*) : great ;;
841 *) pfx="${cur%%:*}:" ;;
842 esac
843 __gitcomp "$(__git_refs)" "$pfx" "${cur#*:}"
846 __gitcomp "$(__git_refs2 "${COMP_WORDS[2]}")"
848 esac
852 _git_format_patch ()
854 local cur="${COMP_WORDS[COMP_CWORD]}"
855 case "$cur" in
856 --*)
857 __gitcomp "
858 --stdout --attach --thread
859 --output-directory
860 --numbered --start-number
861 --numbered-files
862 --keep-subject
863 --signoff
864 --in-reply-to=
865 --full-index --binary
866 --not --all
867 --cover-letter
868 --no-prefix --src-prefix= --dst-prefix=
869 --inline --suffix= --ignore-if-in-upstream
870 --subject-prefix=
872 return
874 esac
875 __git_complete_revlist
878 _git_gc ()
880 local cur="${COMP_WORDS[COMP_CWORD]}"
881 case "$cur" in
882 --*)
883 __gitcomp "--prune --aggressive"
884 return
886 esac
887 COMPREPLY=()
890 _git_grep ()
892 __git_has_doubledash && return
894 local cur="${COMP_WORDS[COMP_CWORD]}"
895 case "$cur" in
896 --*)
897 __gitcomp "
898 --cached
899 --text --ignore-case --word-regexp --invert-match
900 --full-name
901 --extended-regexp --basic-regexp --fixed-strings
902 --files-with-matches --name-only
903 --files-without-match
904 --count
905 --and --or --not --all-match
907 return
909 esac
910 COMPREPLY=()
913 _git_help ()
915 local cur="${COMP_WORDS[COMP_CWORD]}"
916 case "$cur" in
917 --*)
918 __gitcomp "--all --info --man --web"
919 return
921 esac
922 __gitcomp "$(__git_all_commands)
923 attributes cli core-tutorial cvs-migration
924 diffcore gitk glossary hooks ignore modules
925 repository-layout tutorial tutorial-2
926 workflows
930 _git_init ()
932 local cur="${COMP_WORDS[COMP_CWORD]}"
933 case "$cur" in
934 --shared=*)
935 __gitcomp "
936 false true umask group all world everybody
937 " "" "${cur##--shared=}"
938 return
940 --*)
941 __gitcomp "--quiet --bare --template= --shared --shared="
942 return
944 esac
945 COMPREPLY=()
948 _git_ls_files ()
950 __git_has_doubledash && return
952 local cur="${COMP_WORDS[COMP_CWORD]}"
953 case "$cur" in
954 --*)
955 __gitcomp "--cached --deleted --modified --others --ignored
956 --stage --directory --no-empty-directory --unmerged
957 --killed --exclude= --exclude-from=
958 --exclude-per-directory= --exclude-standard
959 --error-unmatch --with-tree= --full-name
960 --abbrev --ignored --exclude-per-directory
962 return
964 esac
965 COMPREPLY=()
968 _git_ls_remote ()
970 __gitcomp "$(__git_remotes)"
973 _git_ls_tree ()
975 __git_complete_file
978 __git_log_pretty_formats="oneline short medium full fuller email raw format:"
980 _git_log ()
982 __git_has_doubledash && return
984 local cur="${COMP_WORDS[COMP_CWORD]}"
985 case "$cur" in
986 --pretty=*)
987 __gitcomp "$__git_log_pretty_formats
988 " "" "${cur##--pretty=}"
989 return
991 --date=*)
992 __gitcomp "
993 relative iso8601 rfc2822 short local default
994 " "" "${cur##--date=}"
995 return
997 --*)
998 __gitcomp "
999 --max-count= --max-age= --since= --after=
1000 --min-age= --before= --until=
1001 --root --topo-order --date-order --reverse
1002 --no-merges --follow
1003 --abbrev-commit --abbrev=
1004 --relative-date --date=
1005 --author= --committer= --grep=
1006 --all-match
1007 --pretty=
1008 --not --all
1009 --left-right --cherry-pick
1010 --graph
1011 --decorate
1012 --walk-reflogs
1013 --parents --children --full-history
1014 --merge
1015 $__git_diff_common_options
1016 --pickaxe-all --pickaxe-regex
1018 return
1020 esac
1021 __git_complete_revlist
1024 _git_merge ()
1026 local cur="${COMP_WORDS[COMP_CWORD]}"
1027 case "${COMP_WORDS[COMP_CWORD-1]}" in
1028 -s|--strategy)
1029 __gitcomp "$(__git_merge_strategies)"
1030 return
1031 esac
1032 case "$cur" in
1033 --strategy=*)
1034 __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
1035 return
1037 --*)
1038 __gitcomp "
1039 --no-commit --no-stat --log --no-log --squash --strategy
1040 --commit --stat --no-squash --ff --no-ff
1042 return
1043 esac
1044 __gitcomp "$(__git_refs)"
1047 _git_mergetool ()
1049 local cur="${COMP_WORDS[COMP_CWORD]}"
1050 case "$cur" in
1051 --tool=*)
1052 __gitcomp "
1053 kdiff3 tkdiff meld xxdiff emerge
1054 vimdiff gvimdiff ecmerge opendiff
1055 " "" "${cur##--tool=}"
1056 return
1058 --*)
1059 __gitcomp "--tool="
1060 return
1062 esac
1063 COMPREPLY=()
1066 _git_merge_base ()
1068 __gitcomp "$(__git_refs)"
1071 _git_mv ()
1073 local cur="${COMP_WORDS[COMP_CWORD]}"
1074 case "$cur" in
1075 --*)
1076 __gitcomp "--dry-run"
1077 return
1079 esac
1080 COMPREPLY=()
1083 _git_name_rev ()
1085 __gitcomp "--tags --all --stdin"
1088 _git_pull ()
1090 local cur="${COMP_WORDS[COMP_CWORD]}"
1092 if [ "$COMP_CWORD" = 2 ]; then
1093 __gitcomp "$(__git_remotes)"
1094 else
1095 __gitcomp "$(__git_refs "${COMP_WORDS[2]}")"
1099 _git_push ()
1101 local cur="${COMP_WORDS[COMP_CWORD]}"
1103 if [ "$COMP_CWORD" = 2 ]; then
1104 __gitcomp "$(__git_remotes)"
1105 else
1106 case "$cur" in
1107 *:*)
1108 local pfx=""
1109 case "$COMP_WORDBREAKS" in
1110 *:*) : great ;;
1111 *) pfx="${cur%%:*}:" ;;
1112 esac
1114 __gitcomp "$(__git_refs "${COMP_WORDS[2]}")" "$pfx" "${cur#*:}"
1117 __gitcomp "$(__git_refs)" + "${cur#+}"
1120 __gitcomp "$(__git_refs)"
1122 esac
1126 _git_rebase ()
1128 local cur="${COMP_WORDS[COMP_CWORD]}" dir="$(__gitdir)"
1129 if [ -d "$dir"/rebase-apply ] || [ -d "$dir"/rebase-merge ]; then
1130 __gitcomp "--continue --skip --abort"
1131 return
1133 case "${COMP_WORDS[COMP_CWORD-1]}" in
1134 -s|--strategy)
1135 __gitcomp "$(__git_merge_strategies)"
1136 return
1137 esac
1138 case "$cur" in
1139 --strategy=*)
1140 __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
1141 return
1143 --*)
1144 __gitcomp "--onto --merge --strategy --interactive"
1145 return
1146 esac
1147 __gitcomp "$(__git_refs)"
1150 _git_send_email ()
1152 local cur="${COMP_WORDS[COMP_CWORD]}"
1153 case "$cur" in
1154 --*)
1155 __gitcomp "--bcc --cc --cc-cmd --chain-reply-to --compose
1156 --dry-run --envelope-sender --from --identity
1157 --in-reply-to --no-chain-reply-to --no-signed-off-by-cc
1158 --no-suppress-from --no-thread --quiet
1159 --signed-off-by-cc --smtp-pass --smtp-server
1160 --smtp-server-port --smtp-ssl --smtp-user --subject
1161 --suppress-cc --suppress-from --thread --to
1162 --validate --no-validate"
1163 return
1165 esac
1166 COMPREPLY=()
1169 _git_config ()
1171 local cur="${COMP_WORDS[COMP_CWORD]}"
1172 local prv="${COMP_WORDS[COMP_CWORD-1]}"
1173 case "$prv" in
1174 branch.*.remote)
1175 __gitcomp "$(__git_remotes)"
1176 return
1178 branch.*.merge)
1179 __gitcomp "$(__git_refs)"
1180 return
1182 remote.*.fetch)
1183 local remote="${prv#remote.}"
1184 remote="${remote%.fetch}"
1185 __gitcomp "$(__git_refs_remotes "$remote")"
1186 return
1188 remote.*.push)
1189 local remote="${prv#remote.}"
1190 remote="${remote%.push}"
1191 __gitcomp "$(git --git-dir="$(__gitdir)" \
1192 for-each-ref --format='%(refname):%(refname)' \
1193 refs/heads)"
1194 return
1196 pull.twohead|pull.octopus)
1197 __gitcomp "$(__git_merge_strategies)"
1198 return
1200 color.branch|color.diff|color.interactive|color.status|color.ui)
1201 __gitcomp "always never auto"
1202 return
1204 color.pager)
1205 __gitcomp "false true"
1206 return
1208 color.*.*)
1209 __gitcomp "
1210 normal black red green yellow blue magenta cyan white
1211 bold dim ul blink reverse
1213 return
1215 *.*)
1216 COMPREPLY=()
1217 return
1219 esac
1220 case "$cur" in
1221 --*)
1222 __gitcomp "
1223 --global --system --file=
1224 --list --replace-all
1225 --get --get-all --get-regexp
1226 --add --unset --unset-all
1227 --remove-section --rename-section
1229 return
1231 branch.*.*)
1232 local pfx="${cur%.*}."
1233 cur="${cur##*.}"
1234 __gitcomp "remote merge mergeoptions" "$pfx" "$cur"
1235 return
1237 branch.*)
1238 local pfx="${cur%.*}."
1239 cur="${cur#*.}"
1240 __gitcomp "$(__git_heads)" "$pfx" "$cur" "."
1241 return
1243 remote.*.*)
1244 local pfx="${cur%.*}."
1245 cur="${cur##*.}"
1246 __gitcomp "
1247 url proxy fetch push mirror skipDefaultUpdate
1248 receivepack uploadpack tagopt
1249 " "$pfx" "$cur"
1250 return
1252 remote.*)
1253 local pfx="${cur%.*}."
1254 cur="${cur#*.}"
1255 __gitcomp "$(__git_remotes)" "$pfx" "$cur" "."
1256 return
1258 esac
1259 __gitcomp "
1260 apply.whitespace
1261 branch.autosetupmerge
1262 branch.autosetuprebase
1263 clean.requireForce
1264 color.branch
1265 color.branch.current
1266 color.branch.local
1267 color.branch.plain
1268 color.branch.remote
1269 color.diff
1270 color.diff.commit
1271 color.diff.frag
1272 color.diff.meta
1273 color.diff.new
1274 color.diff.old
1275 color.diff.plain
1276 color.diff.whitespace
1277 color.interactive
1278 color.interactive.header
1279 color.interactive.help
1280 color.interactive.prompt
1281 color.pager
1282 color.status
1283 color.status.added
1284 color.status.changed
1285 color.status.header
1286 color.status.nobranch
1287 color.status.untracked
1288 color.status.updated
1289 color.ui
1290 commit.template
1291 core.autocrlf
1292 core.bare
1293 core.compression
1294 core.deltaBaseCacheLimit
1295 core.editor
1296 core.excludesfile
1297 core.fileMode
1298 core.fsyncobjectfiles
1299 core.gitProxy
1300 core.ignoreCygwinFSTricks
1301 core.ignoreStat
1302 core.logAllRefUpdates
1303 core.loosecompression
1304 core.packedGitLimit
1305 core.packedGitWindowSize
1306 core.pager
1307 core.preferSymlinkRefs
1308 core.preloadindex
1309 core.quotepath
1310 core.repositoryFormatVersion
1311 core.safecrlf
1312 core.sharedRepository
1313 core.symlinks
1314 core.trustctime
1315 core.warnAmbiguousRefs
1316 core.whitespace
1317 core.worktree
1318 diff.autorefreshindex
1319 diff.external
1320 diff.mnemonicprefix
1321 diff.renameLimit
1322 diff.renameLimit.
1323 diff.renames
1324 fetch.unpackLimit
1325 format.headers
1326 format.numbered
1327 format.pretty
1328 format.suffix
1329 gc.aggressiveWindow
1330 gc.auto
1331 gc.autopacklimit
1332 gc.packrefs
1333 gc.pruneexpire
1334 gc.reflogexpire
1335 gc.reflogexpireunreachable
1336 gc.rerereresolved
1337 gc.rerereunresolved
1338 gitcvs.allbinary
1339 gitcvs.dbTableNamePrefix
1340 gitcvs.dbdriver
1341 gitcvs.dbname
1342 gitcvs.dbpass
1343 gitcvs.dbuser
1344 gitcvs.enabled
1345 gitcvs.logfile
1346 gitcvs.usecrlfattr
1347 gui.blamehistoryctx
1348 gui.commitmsgwidth
1349 gui.copyblamethreshold
1350 gui.diffcontext
1351 gui.encoding
1352 gui.fastcopyblame
1353 gui.matchtrackingbranch
1354 gui.newbranchtemplate
1355 gui.pruneduringfetch
1356 gui.spellingdictionary
1357 gui.trustmtime
1358 help.autocorrect
1359 help.browser
1360 help.format
1361 http.lowSpeedLimit
1362 http.lowSpeedTime
1363 http.maxRequests
1364 http.noEPSV
1365 http.proxy
1366 http.sslCAInfo
1367 http.sslCAPath
1368 http.sslCert
1369 http.sslKey
1370 http.sslVerify
1371 i18n.commitEncoding
1372 i18n.logOutputEncoding
1373 instaweb.browser
1374 instaweb.httpd
1375 instaweb.local
1376 instaweb.modulepath
1377 instaweb.port
1378 log.date
1379 log.showroot
1380 man.viewer
1381 merge.conflictstyle
1382 merge.log
1383 merge.renameLimit
1384 merge.stat
1385 merge.tool
1386 merge.verbosity
1387 mergetool.keepBackup
1388 pack.compression
1389 pack.deltaCacheLimit
1390 pack.deltaCacheSize
1391 pack.depth
1392 pack.indexVersion
1393 pack.packSizeLimit
1394 pack.threads
1395 pack.window
1396 pack.windowMemory
1397 pull.octopus
1398 pull.twohead
1399 receive.denyCurrentBranch
1400 receive.denyDeletes
1401 receive.denyNonFastForwards
1402 receive.fsckObjects
1403 receive.unpackLimit
1404 repack.usedeltabaseoffset
1405 rerere.autoupdate
1406 rerere.enabled
1407 showbranch.default
1408 status.relativePaths
1409 status.showUntrackedFiles
1410 tar.umask
1411 transfer.unpackLimit
1412 user.email
1413 user.name
1414 user.signingkey
1415 web.browser
1416 branch. remote.
1420 _git_remote ()
1422 local subcommands="add rename rm show prune update"
1423 local subcommand="$(__git_find_subcommand "$subcommands")"
1424 if [ -z "$subcommand" ]; then
1425 __gitcomp "$subcommands"
1426 return
1429 case "$subcommand" in
1430 rename|rm|show|prune)
1431 __gitcomp "$(__git_remotes)"
1433 update)
1434 local i c='' IFS=$'\n'
1435 for i in $(git --git-dir="$(__gitdir)" config --list); do
1436 case "$i" in
1437 remotes.*)
1438 i="${i#remotes.}"
1439 c="$c ${i/=*/}"
1441 esac
1442 done
1443 __gitcomp "$c"
1446 COMPREPLY=()
1448 esac
1451 _git_reset ()
1453 __git_has_doubledash && return
1455 local cur="${COMP_WORDS[COMP_CWORD]}"
1456 case "$cur" in
1457 --*)
1458 __gitcomp "--merge --mixed --hard --soft"
1459 return
1461 esac
1462 __gitcomp "$(__git_refs)"
1465 _git_revert ()
1467 local cur="${COMP_WORDS[COMP_CWORD]}"
1468 case "$cur" in
1469 --*)
1470 __gitcomp "--edit --mainline --no-edit --no-commit --signoff"
1471 return
1473 esac
1474 __gitcomp "$(__git_refs)"
1477 _git_rm ()
1479 __git_has_doubledash && return
1481 local cur="${COMP_WORDS[COMP_CWORD]}"
1482 case "$cur" in
1483 --*)
1484 __gitcomp "--cached --dry-run --ignore-unmatch --quiet"
1485 return
1487 esac
1488 COMPREPLY=()
1491 _git_shortlog ()
1493 __git_has_doubledash && return
1495 local cur="${COMP_WORDS[COMP_CWORD]}"
1496 case "$cur" in
1497 --*)
1498 __gitcomp "
1499 --max-count= --max-age= --since= --after=
1500 --min-age= --before= --until=
1501 --no-merges
1502 --author= --committer= --grep=
1503 --all-match
1504 --not --all
1505 --numbered --summary
1507 return
1509 esac
1510 __git_complete_revlist
1513 _git_show ()
1515 __git_has_doubledash && return
1517 local cur="${COMP_WORDS[COMP_CWORD]}"
1518 case "$cur" in
1519 --pretty=*)
1520 __gitcomp "$__git_log_pretty_formats
1521 " "" "${cur##--pretty=}"
1522 return
1524 --*)
1525 __gitcomp "--pretty=
1526 $__git_diff_common_options
1528 return
1530 esac
1531 __git_complete_file
1534 _git_show_branch ()
1536 local cur="${COMP_WORDS[COMP_CWORD]}"
1537 case "$cur" in
1538 --*)
1539 __gitcomp "
1540 --all --remotes --topo-order --current --more=
1541 --list --independent --merge-base --no-name
1542 --sha1-name --topics --reflog
1544 return
1546 esac
1547 __git_complete_revlist
1550 _git_stash ()
1552 local subcommands='save list show apply clear drop pop create branch'
1553 local subcommand="$(__git_find_subcommand "$subcommands")"
1554 if [ -z "$subcommand" ]; then
1555 __gitcomp "$subcommands"
1556 else
1557 local cur="${COMP_WORDS[COMP_CWORD]}"
1558 case "$subcommand,$cur" in
1559 save,--*)
1560 __gitcomp "--keep-index"
1562 apply,--*)
1563 __gitcomp "--index"
1565 show,--*|drop,--*|pop,--*|branch,--*)
1566 COMPREPLY=()
1568 show,*|apply,*|drop,*|pop,*|branch,*)
1569 __gitcomp "$(git --git-dir="$(__gitdir)" stash list \
1570 | sed -n -e 's/:.*//p')"
1573 COMPREPLY=()
1575 esac
1579 _git_submodule ()
1581 __git_has_doubledash && return
1583 local subcommands="add status init update summary foreach sync"
1584 if [ -z "$(__git_find_subcommand "$subcommands")" ]; then
1585 local cur="${COMP_WORDS[COMP_CWORD]}"
1586 case "$cur" in
1587 --*)
1588 __gitcomp "--quiet --cached"
1591 __gitcomp "$subcommands"
1593 esac
1594 return
1598 _git_svn ()
1600 local subcommands="
1601 init fetch clone rebase dcommit log find-rev
1602 set-tree commit-diff info create-ignore propget
1603 proplist show-ignore show-externals
1605 local subcommand="$(__git_find_subcommand "$subcommands")"
1606 if [ -z "$subcommand" ]; then
1607 __gitcomp "$subcommands"
1608 else
1609 local remote_opts="--username= --config-dir= --no-auth-cache"
1610 local fc_opts="
1611 --follow-parent --authors-file= --repack=
1612 --no-metadata --use-svm-props --use-svnsync-props
1613 --log-window-size= --no-checkout --quiet
1614 --repack-flags --use-log-author --localtime $remote_opts
1616 local init_opts="
1617 --template= --shared= --trunk= --tags=
1618 --branches= --stdlayout --minimize-url
1619 --no-metadata --use-svm-props --use-svnsync-props
1620 --rewrite-root= $remote_opts
1622 local cmt_opts="
1623 --edit --rmdir --find-copies-harder --copy-similarity=
1626 local cur="${COMP_WORDS[COMP_CWORD]}"
1627 case "$subcommand,$cur" in
1628 fetch,--*)
1629 __gitcomp "--revision= --fetch-all $fc_opts"
1631 clone,--*)
1632 __gitcomp "--revision= $fc_opts $init_opts"
1634 init,--*)
1635 __gitcomp "$init_opts"
1637 dcommit,--*)
1638 __gitcomp "
1639 --merge --strategy= --verbose --dry-run
1640 --fetch-all --no-rebase $cmt_opts $fc_opts
1643 set-tree,--*)
1644 __gitcomp "--stdin $cmt_opts $fc_opts"
1646 create-ignore,--*|propget,--*|proplist,--*|show-ignore,--*|\
1647 show-externals,--*)
1648 __gitcomp "--revision="
1650 log,--*)
1651 __gitcomp "
1652 --limit= --revision= --verbose --incremental
1653 --oneline --show-commit --non-recursive
1654 --authors-file=
1657 rebase,--*)
1658 __gitcomp "
1659 --merge --verbose --strategy= --local
1660 --fetch-all $fc_opts
1663 commit-diff,--*)
1664 __gitcomp "--message= --file= --revision= $cmt_opts"
1666 info,--*)
1667 __gitcomp "--url"
1670 COMPREPLY=()
1672 esac
1676 _git_tag ()
1678 local i c=1 f=0
1679 while [ $c -lt $COMP_CWORD ]; do
1680 i="${COMP_WORDS[c]}"
1681 case "$i" in
1682 -d|-v)
1683 __gitcomp "$(__git_tags)"
1684 return
1689 esac
1690 c=$((++c))
1691 done
1693 case "${COMP_WORDS[COMP_CWORD-1]}" in
1694 -m|-F)
1695 COMPREPLY=()
1697 -*|tag)
1698 if [ $f = 1 ]; then
1699 __gitcomp "$(__git_tags)"
1700 else
1701 COMPREPLY=()
1705 __gitcomp "$(__git_refs)"
1707 esac
1710 _git ()
1712 local i c=1 command __git_dir
1714 while [ $c -lt $COMP_CWORD ]; do
1715 i="${COMP_WORDS[c]}"
1716 case "$i" in
1717 --git-dir=*) __git_dir="${i#--git-dir=}" ;;
1718 --bare) __git_dir="." ;;
1719 --version|-p|--paginate) ;;
1720 --help) command="help"; break ;;
1721 *) command="$i"; break ;;
1722 esac
1723 c=$((++c))
1724 done
1726 if [ -z "$command" ]; then
1727 case "${COMP_WORDS[COMP_CWORD]}" in
1728 --*) __gitcomp "
1729 --paginate
1730 --no-pager
1731 --git-dir=
1732 --bare
1733 --version
1734 --exec-path
1735 --work-tree=
1736 --help
1739 *) __gitcomp "$(__git_porcelain_commands) $(__git_aliases)" ;;
1740 esac
1741 return
1744 local expansion=$(__git_aliased_command "$command")
1745 [ "$expansion" ] && command="$expansion"
1747 case "$command" in
1748 am) _git_am ;;
1749 add) _git_add ;;
1750 apply) _git_apply ;;
1751 archive) _git_archive ;;
1752 bisect) _git_bisect ;;
1753 bundle) _git_bundle ;;
1754 branch) _git_branch ;;
1755 checkout) _git_checkout ;;
1756 cherry) _git_cherry ;;
1757 cherry-pick) _git_cherry_pick ;;
1758 clean) _git_clean ;;
1759 clone) _git_clone ;;
1760 commit) _git_commit ;;
1761 config) _git_config ;;
1762 describe) _git_describe ;;
1763 diff) _git_diff ;;
1764 fetch) _git_fetch ;;
1765 format-patch) _git_format_patch ;;
1766 gc) _git_gc ;;
1767 grep) _git_grep ;;
1768 help) _git_help ;;
1769 init) _git_init ;;
1770 log) _git_log ;;
1771 ls-files) _git_ls_files ;;
1772 ls-remote) _git_ls_remote ;;
1773 ls-tree) _git_ls_tree ;;
1774 merge) _git_merge;;
1775 mergetool) _git_mergetool;;
1776 merge-base) _git_merge_base ;;
1777 mv) _git_mv ;;
1778 name-rev) _git_name_rev ;;
1779 pull) _git_pull ;;
1780 push) _git_push ;;
1781 rebase) _git_rebase ;;
1782 remote) _git_remote ;;
1783 reset) _git_reset ;;
1784 revert) _git_revert ;;
1785 rm) _git_rm ;;
1786 send-email) _git_send_email ;;
1787 shortlog) _git_shortlog ;;
1788 show) _git_show ;;
1789 show-branch) _git_show_branch ;;
1790 stash) _git_stash ;;
1791 stage) _git_add ;;
1792 submodule) _git_submodule ;;
1793 svn) _git_svn ;;
1794 tag) _git_tag ;;
1795 whatchanged) _git_log ;;
1796 *) COMPREPLY=() ;;
1797 esac
1800 _gitk ()
1802 __git_has_doubledash && return
1804 local cur="${COMP_WORDS[COMP_CWORD]}"
1805 local g="$(git rev-parse --git-dir 2>/dev/null)"
1806 local merge=""
1807 if [ -f $g/MERGE_HEAD ]; then
1808 merge="--merge"
1810 case "$cur" in
1811 --*)
1812 __gitcomp "--not --all $merge"
1813 return
1815 esac
1816 __git_complete_revlist
1819 complete -o bashdefault -o default -o nospace -F _git git 2>/dev/null \
1820 || complete -o default -o nospace -F _git git
1821 complete -o bashdefault -o default -o nospace -F _gitk gitk 2>/dev/null \
1822 || complete -o default -o nospace -F _gitk gitk
1824 # The following are necessary only for Cygwin, and only are needed
1825 # when the user has tab-completed the executable name and consequently
1826 # included the '.exe' suffix.
1828 if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
1829 complete -o bashdefault -o default -o nospace -F _git git.exe 2>/dev/null \
1830 || complete -o default -o nospace -F _git git.exe