git-completion.bash: provide completion for 'show-branch'
[git/spearce.git] / contrib / completion / git-completion.bash
blob3b049348c3a4ed1b9c1f08340b023ac4597e5f4f
2 # bash completion support for core Git.
4 # Copyright (C) 2006,2007 Shawn O. Pearce <spearce@spearce.org>
5 # Conceptually based on gitcompletion (http://gitweb.hawaga.org.uk/).
6 # Distributed under the GNU General Public License, version 2.0.
8 # The contained completion routines provide support for completing:
10 # *) local and remote branch names
11 # *) local and remote tag names
12 # *) .git/remotes file names
13 # *) git 'subcommands'
14 # *) tree paths within 'ref:path/to/file' expressions
15 # *) common --long-options
17 # To use these routines:
19 # 1) Copy this file to somewhere (e.g. ~/.git-completion.sh).
20 # 2) Added the following line to your .bashrc:
21 # source ~/.git-completion.sh
23 # 3) You may want to make sure the git executable is available
24 # in your PATH before this script is sourced, as some caching
25 # is performed while the script loads. If git isn't found
26 # at source time then all lookups will be done on demand,
27 # which may be slightly slower.
29 # 4) Consider changing your PS1 to also show the current branch:
30 # PS1='[\u@\h \W$(__git_ps1 " (%s)")]\$ '
32 # The argument to __git_ps1 will be displayed only if you
33 # are currently in a git repository. The %s token will be
34 # the name of the current branch.
36 # To submit patches:
38 # *) Read Documentation/SubmittingPatches
39 # *) Send all patches to the current maintainer:
41 # "Shawn O. Pearce" <spearce@spearce.org>
43 # *) Always CC the Git mailing list:
45 # git@vger.kernel.org
48 case "$COMP_WORDBREAKS" in
49 *:*) : great ;;
50 *) COMP_WORDBREAKS="$COMP_WORDBREAKS:"
51 esac
53 __gitdir ()
55 if [ -z "$1" ]; then
56 if [ -n "$__git_dir" ]; then
57 echo "$__git_dir"
58 elif [ -d .git ]; then
59 echo .git
60 else
61 git rev-parse --git-dir 2>/dev/null
63 elif [ -d "$1/.git" ]; then
64 echo "$1/.git"
65 else
66 echo "$1"
70 __git_ps1 ()
72 local g="$(git rev-parse --git-dir 2>/dev/null)"
73 if [ -n "$g" ]; then
74 local r
75 local b
76 if [ -d "$g/rebase-apply" ]
77 then
78 if test -f "$g/rebase-apply/rebasing"
79 then
80 r="|REBASE"
81 elif test -f "$g/rebase-apply/applying"
82 then
83 r="|AM"
84 else
85 r="|AM/REBASE"
87 b="$(git symbolic-ref HEAD 2>/dev/null)"
88 elif [ -f "$g/rebase-merge/interactive" ]
89 then
90 r="|REBASE-i"
91 b="$(cat "$g/rebase-merge/head-name")"
92 elif [ -d "$g/rebase-merge" ]
93 then
94 r="|REBASE-m"
95 b="$(cat "$g/rebase-merge/head-name")"
96 elif [ -f "$g/MERGE_HEAD" ]
97 then
98 r="|MERGING"
99 b="$(git symbolic-ref HEAD 2>/dev/null)"
100 else
101 if [ -f "$g/BISECT_LOG" ]
102 then
103 r="|BISECTING"
105 if ! b="$(git symbolic-ref HEAD 2>/dev/null)"
106 then
107 if ! b="$(git describe --exact-match HEAD 2>/dev/null)"
108 then
109 b="$(cut -c1-7 "$g/HEAD")..."
114 if [ -n "$1" ]; then
115 printf "$1" "${b##refs/heads/}$r"
116 else
117 printf " (%s)" "${b##refs/heads/}$r"
122 __gitcomp_1 ()
124 local c IFS=' '$'\t'$'\n'
125 for c in $1; do
126 case "$c$2" in
127 --*=*) printf %s$'\n' "$c$2" ;;
128 *.) printf %s$'\n' "$c$2" ;;
129 *) printf %s$'\n' "$c$2 " ;;
130 esac
131 done
134 __gitcomp ()
136 local cur="${COMP_WORDS[COMP_CWORD]}"
137 if [ $# -gt 2 ]; then
138 cur="$3"
140 case "$cur" in
141 --*=)
142 COMPREPLY=()
145 local IFS=$'\n'
146 COMPREPLY=($(compgen -P "$2" \
147 -W "$(__gitcomp_1 "$1" "$4")" \
148 -- "$cur"))
150 esac
153 __git_heads ()
155 local cmd i is_hash=y dir="$(__gitdir "$1")"
156 if [ -d "$dir" ]; then
157 for i in $(git --git-dir="$dir" \
158 for-each-ref --format='%(refname)' \
159 refs/heads ); do
160 echo "${i#refs/heads/}"
161 done
162 return
164 for i in $(git ls-remote "$1" 2>/dev/null); do
165 case "$is_hash,$i" in
166 y,*) is_hash=n ;;
167 n,*^{}) is_hash=y ;;
168 n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;
169 n,*) is_hash=y; echo "$i" ;;
170 esac
171 done
174 __git_tags ()
176 local cmd i is_hash=y dir="$(__gitdir "$1")"
177 if [ -d "$dir" ]; then
178 for i in $(git --git-dir="$dir" \
179 for-each-ref --format='%(refname)' \
180 refs/tags ); do
181 echo "${i#refs/tags/}"
182 done
183 return
185 for i in $(git ls-remote "$1" 2>/dev/null); do
186 case "$is_hash,$i" in
187 y,*) is_hash=n ;;
188 n,*^{}) is_hash=y ;;
189 n,refs/tags/*) is_hash=y; echo "${i#refs/tags/}" ;;
190 n,*) is_hash=y; echo "$i" ;;
191 esac
192 done
195 __git_refs ()
197 local cmd i is_hash=y dir="$(__gitdir "$1")"
198 if [ -d "$dir" ]; then
199 if [ -e "$dir/HEAD" ]; then echo HEAD; fi
200 for i in $(git --git-dir="$dir" \
201 for-each-ref --format='%(refname)' \
202 refs/tags refs/heads refs/remotes); do
203 case "$i" in
204 refs/tags/*) echo "${i#refs/tags/}" ;;
205 refs/heads/*) echo "${i#refs/heads/}" ;;
206 refs/remotes/*) echo "${i#refs/remotes/}" ;;
207 *) echo "$i" ;;
208 esac
209 done
210 return
212 for i in $(git ls-remote "$dir" 2>/dev/null); do
213 case "$is_hash,$i" in
214 y,*) is_hash=n ;;
215 n,*^{}) is_hash=y ;;
216 n,refs/tags/*) is_hash=y; echo "${i#refs/tags/}" ;;
217 n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;
218 n,refs/remotes/*) is_hash=y; echo "${i#refs/remotes/}" ;;
219 n,*) is_hash=y; echo "$i" ;;
220 esac
221 done
224 __git_refs2 ()
226 local i
227 for i in $(__git_refs "$1"); do
228 echo "$i:$i"
229 done
232 __git_refs_remotes ()
234 local cmd i is_hash=y
235 for i in $(git ls-remote "$1" 2>/dev/null); do
236 case "$is_hash,$i" in
237 n,refs/heads/*)
238 is_hash=y
239 echo "$i:refs/remotes/$1/${i#refs/heads/}"
241 y,*) is_hash=n ;;
242 n,*^{}) is_hash=y ;;
243 n,refs/tags/*) is_hash=y;;
244 n,*) is_hash=y; ;;
245 esac
246 done
249 __git_remotes ()
251 local i ngoff IFS=$'\n' d="$(__gitdir)"
252 shopt -q nullglob || ngoff=1
253 shopt -s nullglob
254 for i in "$d/remotes"/*; do
255 echo ${i#$d/remotes/}
256 done
257 [ "$ngoff" ] && shopt -u nullglob
258 for i in $(git --git-dir="$d" config --list); do
259 case "$i" in
260 remote.*.url=*)
261 i="${i#remote.}"
262 echo "${i/.url=*/}"
264 esac
265 done
268 __git_merge_strategies ()
270 if [ -n "$__git_merge_strategylist" ]; then
271 echo "$__git_merge_strategylist"
272 return
274 sed -n "/^all_strategies='/{
275 s/^all_strategies='//
276 s/'//
279 }" "$(git --exec-path)/git-merge"
281 __git_merge_strategylist=
282 __git_merge_strategylist="$(__git_merge_strategies 2>/dev/null)"
284 __git_complete_file ()
286 local pfx ls ref cur="${COMP_WORDS[COMP_CWORD]}"
287 case "$cur" in
288 ?*:*)
289 ref="${cur%%:*}"
290 cur="${cur#*:}"
291 case "$cur" in
292 ?*/*)
293 pfx="${cur%/*}"
294 cur="${cur##*/}"
295 ls="$ref:$pfx"
296 pfx="$pfx/"
299 ls="$ref"
301 esac
303 case "$COMP_WORDBREAKS" in
304 *:*) : great ;;
305 *) pfx="$ref:$pfx" ;;
306 esac
308 local IFS=$'\n'
309 COMPREPLY=($(compgen -P "$pfx" \
310 -W "$(git --git-dir="$(__gitdir)" ls-tree "$ls" \
311 | sed '/^100... blob /{
312 s,^.* ,,
313 s,$, ,
315 /^120000 blob /{
316 s,^.* ,,
317 s,$, ,
319 /^040000 tree /{
320 s,^.* ,,
321 s,$,/,
323 s/^.* //')" \
324 -- "$cur"))
327 __gitcomp "$(__git_refs)"
329 esac
332 __git_complete_revlist ()
334 local pfx cur="${COMP_WORDS[COMP_CWORD]}"
335 case "$cur" in
336 *...*)
337 pfx="${cur%...*}..."
338 cur="${cur#*...}"
339 __gitcomp "$(__git_refs)" "$pfx" "$cur"
341 *..*)
342 pfx="${cur%..*}.."
343 cur="${cur#*..}"
344 __gitcomp "$(__git_refs)" "$pfx" "$cur"
347 __gitcomp "$(__git_refs)"
349 esac
352 __git_commands ()
354 if [ -n "$__git_commandlist" ]; then
355 echo "$__git_commandlist"
356 return
358 local i IFS=" "$'\n'
359 for i in $(git help -a|egrep '^ ')
361 case $i in
362 *--*) : helper pattern;;
363 applymbox) : ask gittus;;
364 applypatch) : ask gittus;;
365 archimport) : import;;
366 cat-file) : plumbing;;
367 check-attr) : plumbing;;
368 check-ref-format) : plumbing;;
369 commit-tree) : plumbing;;
370 cvsexportcommit) : export;;
371 cvsimport) : import;;
372 cvsserver) : daemon;;
373 daemon) : daemon;;
374 diff-files) : plumbing;;
375 diff-index) : plumbing;;
376 diff-tree) : plumbing;;
377 fast-import) : import;;
378 fsck-objects) : plumbing;;
379 fetch-pack) : plumbing;;
380 fmt-merge-msg) : plumbing;;
381 for-each-ref) : plumbing;;
382 hash-object) : plumbing;;
383 http-*) : transport;;
384 index-pack) : plumbing;;
385 init-db) : deprecated;;
386 local-fetch) : plumbing;;
387 mailinfo) : plumbing;;
388 mailsplit) : plumbing;;
389 merge-*) : plumbing;;
390 mktree) : plumbing;;
391 mktag) : plumbing;;
392 pack-objects) : plumbing;;
393 pack-redundant) : plumbing;;
394 pack-refs) : plumbing;;
395 parse-remote) : plumbing;;
396 patch-id) : plumbing;;
397 peek-remote) : plumbing;;
398 prune) : plumbing;;
399 prune-packed) : plumbing;;
400 quiltimport) : import;;
401 read-tree) : plumbing;;
402 receive-pack) : plumbing;;
403 reflog) : plumbing;;
404 repo-config) : deprecated;;
405 rerere) : plumbing;;
406 rev-list) : plumbing;;
407 rev-parse) : plumbing;;
408 runstatus) : plumbing;;
409 sh-setup) : internal;;
410 shell) : daemon;;
411 send-pack) : plumbing;;
412 show-index) : plumbing;;
413 ssh-*) : transport;;
414 stripspace) : plumbing;;
415 symbolic-ref) : plumbing;;
416 tar-tree) : deprecated;;
417 unpack-file) : plumbing;;
418 unpack-objects) : plumbing;;
419 update-index) : plumbing;;
420 update-ref) : plumbing;;
421 update-server-info) : daemon;;
422 upload-archive) : plumbing;;
423 upload-pack) : plumbing;;
424 write-tree) : plumbing;;
425 verify-tag) : plumbing;;
426 *) echo $i;;
427 esac
428 done
430 __git_commandlist=
431 __git_commandlist="$(__git_commands 2>/dev/null)"
433 __git_aliases ()
435 local i IFS=$'\n'
436 for i in $(git --git-dir="$(__gitdir)" config --list); do
437 case "$i" in
438 alias.*)
439 i="${i#alias.}"
440 echo "${i/=*/}"
442 esac
443 done
446 __git_aliased_command ()
448 local word cmdline=$(git --git-dir="$(__gitdir)" \
449 config --get "alias.$1")
450 for word in $cmdline; do
451 if [ "${word##-*}" ]; then
452 echo $word
453 return
455 done
458 __git_find_subcommand ()
460 local word subcommand c=1
462 while [ $c -lt $COMP_CWORD ]; do
463 word="${COMP_WORDS[c]}"
464 for subcommand in $1; do
465 if [ "$subcommand" = "$word" ]; then
466 echo "$subcommand"
467 return
469 done
470 c=$((++c))
471 done
474 __git_has_doubledash ()
476 local c=1
477 while [ $c -lt $COMP_CWORD ]; do
478 if [ "--" = "${COMP_WORDS[c]}" ]; then
479 return 0
481 c=$((++c))
482 done
483 return 1
486 __git_whitespacelist="nowarn warn error error-all strip"
488 _git_am ()
490 local cur="${COMP_WORDS[COMP_CWORD]}" dir="$(__gitdir)"
491 if [ -d "$dir"/rebase-apply ]; then
492 __gitcomp "--skip --resolved --abort"
493 return
495 case "$cur" in
496 --whitespace=*)
497 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
498 return
500 --*)
501 __gitcomp "
502 --signoff --utf8 --binary --3way --interactive
503 --whitespace=
505 return
506 esac
507 COMPREPLY=()
510 _git_apply ()
512 local cur="${COMP_WORDS[COMP_CWORD]}"
513 case "$cur" in
514 --whitespace=*)
515 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
516 return
518 --*)
519 __gitcomp "
520 --stat --numstat --summary --check --index
521 --cached --index-info --reverse --reject --unidiff-zero
522 --apply --no-add --exclude=
523 --whitespace= --inaccurate-eof --verbose
525 return
526 esac
527 COMPREPLY=()
530 _git_add ()
532 __git_has_doubledash && return
534 local cur="${COMP_WORDS[COMP_CWORD]}"
535 case "$cur" in
536 --*)
537 __gitcomp "
538 --interactive --refresh --patch --update --dry-run
539 --ignore-errors
541 return
542 esac
543 COMPREPLY=()
546 _git_bisect ()
548 __git_has_doubledash && return
550 local subcommands="start bad good skip reset visualize replay log run"
551 local subcommand="$(__git_find_subcommand "$subcommands")"
552 if [ -z "$subcommand" ]; then
553 __gitcomp "$subcommands"
554 return
557 case "$subcommand" in
558 bad|good|reset|skip)
559 __gitcomp "$(__git_refs)"
562 COMPREPLY=()
564 esac
567 _git_branch ()
569 local i c=1 only_local_ref="n" has_r="n"
571 while [ $c -lt $COMP_CWORD ]; do
572 i="${COMP_WORDS[c]}"
573 case "$i" in
574 -d|-m) only_local_ref="y" ;;
575 -r) has_r="y" ;;
576 esac
577 c=$((++c))
578 done
580 case "${COMP_WORDS[COMP_CWORD]}" in
581 --*=*) COMPREPLY=() ;;
582 --*)
583 __gitcomp "
584 --color --no-color --verbose --abbrev= --no-abbrev
585 --track --no-track --contains --merged --no-merged
589 if [ $only_local_ref = "y" -a $has_r = "n" ]; then
590 __gitcomp "$(__git_heads)"
591 else
592 __gitcomp "$(__git_refs)"
595 esac
598 _git_bundle ()
600 local mycword="$COMP_CWORD"
601 case "${COMP_WORDS[0]}" in
602 git)
603 local cmd="${COMP_WORDS[2]}"
604 mycword="$((mycword-1))"
606 git-bundle*)
607 local cmd="${COMP_WORDS[1]}"
609 esac
610 case "$mycword" in
612 __gitcomp "create list-heads verify unbundle"
615 # looking for a file
618 case "$cmd" in
619 create)
620 __git_complete_revlist
622 esac
624 esac
627 _git_checkout ()
629 __gitcomp "$(__git_refs)"
632 _git_cherry ()
634 __gitcomp "$(__git_refs)"
637 _git_cherry_pick ()
639 local cur="${COMP_WORDS[COMP_CWORD]}"
640 case "$cur" in
641 --*)
642 __gitcomp "--edit --no-commit"
645 __gitcomp "$(__git_refs)"
647 esac
650 _git_commit ()
652 __git_has_doubledash && return
654 local cur="${COMP_WORDS[COMP_CWORD]}"
655 case "$cur" in
656 --*)
657 __gitcomp "
658 --all --author= --signoff --verify --no-verify
659 --edit --amend --include --only
661 return
662 esac
663 COMPREPLY=()
666 _git_describe ()
668 __gitcomp "$(__git_refs)"
671 _git_diff ()
673 __git_has_doubledash && return
675 local cur="${COMP_WORDS[COMP_CWORD]}"
676 case "$cur" in
677 --*)
678 __gitcomp "--cached --stat --numstat --shortstat --summary
679 --patch-with-stat --name-only --name-status --color
680 --no-color --color-words --no-renames --check
681 --full-index --binary --abbrev --diff-filter
682 --find-copies-harder --pickaxe-all --pickaxe-regex
683 --text --ignore-space-at-eol --ignore-space-change
684 --ignore-all-space --exit-code --quiet --ext-diff
685 --no-ext-diff
686 --no-prefix --src-prefix= --dst-prefix=
687 --base --ours --theirs
689 return
691 esac
692 __git_complete_file
695 _git_diff_tree ()
697 __gitcomp "$(__git_refs)"
700 _git_fetch ()
702 local cur="${COMP_WORDS[COMP_CWORD]}"
704 case "${COMP_WORDS[0]},$COMP_CWORD" in
705 git-fetch*,1)
706 __gitcomp "$(__git_remotes)"
708 git,2)
709 __gitcomp "$(__git_remotes)"
712 case "$cur" in
713 *:*)
714 local pfx=""
715 case "$COMP_WORDBREAKS" in
716 *:*) : great ;;
717 *) pfx="${cur%%:*}:" ;;
718 esac
719 __gitcomp "$(__git_refs)" "$pfx" "${cur#*:}"
722 local remote
723 case "${COMP_WORDS[0]}" in
724 git-fetch) remote="${COMP_WORDS[1]}" ;;
725 git) remote="${COMP_WORDS[2]}" ;;
726 esac
727 __gitcomp "$(__git_refs2 "$remote")"
729 esac
731 esac
734 _git_format_patch ()
736 local cur="${COMP_WORDS[COMP_CWORD]}"
737 case "$cur" in
738 --*)
739 __gitcomp "
740 --stdout --attach --thread
741 --output-directory
742 --numbered --start-number
743 --numbered-files
744 --keep-subject
745 --signoff
746 --in-reply-to=
747 --full-index --binary
748 --not --all
749 --cover-letter
750 --no-prefix --src-prefix= --dst-prefix=
752 return
754 esac
755 __git_complete_revlist
758 _git_gc ()
760 local cur="${COMP_WORDS[COMP_CWORD]}"
761 case "$cur" in
762 --*)
763 __gitcomp "--prune --aggressive"
764 return
766 esac
767 COMPREPLY=()
770 _git_ls_remote ()
772 __gitcomp "$(__git_remotes)"
775 _git_ls_tree ()
777 __git_complete_file
780 _git_log ()
782 __git_has_doubledash && return
784 local cur="${COMP_WORDS[COMP_CWORD]}"
785 case "$cur" in
786 --pretty=*)
787 __gitcomp "
788 oneline short medium full fuller email raw
789 " "" "${cur##--pretty=}"
790 return
792 --date=*)
793 __gitcomp "
794 relative iso8601 rfc2822 short local default
795 " "" "${cur##--date=}"
796 return
798 --*)
799 __gitcomp "
800 --max-count= --max-age= --since= --after=
801 --min-age= --before= --until=
802 --root --topo-order --date-order --reverse
803 --no-merges --follow
804 --abbrev-commit --abbrev=
805 --relative-date --date=
806 --author= --committer= --grep=
807 --all-match
808 --pretty= --name-status --name-only --raw
809 --not --all
810 --left-right --cherry-pick
811 --graph
812 --stat --numstat --shortstat
813 --decorate --diff-filter=
814 --color-words --walk-reflogs
816 return
818 esac
819 __git_complete_revlist
822 _git_merge ()
824 local cur="${COMP_WORDS[COMP_CWORD]}"
825 case "${COMP_WORDS[COMP_CWORD-1]}" in
826 -s|--strategy)
827 __gitcomp "$(__git_merge_strategies)"
828 return
829 esac
830 case "$cur" in
831 --strategy=*)
832 __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
833 return
835 --*)
836 __gitcomp "
837 --no-commit --no-stat --log --no-log --squash --strategy
839 return
840 esac
841 __gitcomp "$(__git_refs)"
844 _git_merge_base ()
846 __gitcomp "$(__git_refs)"
849 _git_name_rev ()
851 __gitcomp "--tags --all --stdin"
854 _git_pull ()
856 local cur="${COMP_WORDS[COMP_CWORD]}"
858 case "${COMP_WORDS[0]},$COMP_CWORD" in
859 git-pull*,1)
860 __gitcomp "$(__git_remotes)"
862 git,2)
863 __gitcomp "$(__git_remotes)"
866 local remote
867 case "${COMP_WORDS[0]}" in
868 git-pull) remote="${COMP_WORDS[1]}" ;;
869 git) remote="${COMP_WORDS[2]}" ;;
870 esac
871 __gitcomp "$(__git_refs "$remote")"
873 esac
876 _git_push ()
878 local cur="${COMP_WORDS[COMP_CWORD]}"
880 case "${COMP_WORDS[0]},$COMP_CWORD" in
881 git-push*,1)
882 __gitcomp "$(__git_remotes)"
884 git,2)
885 __gitcomp "$(__git_remotes)"
888 case "$cur" in
889 *:*)
890 local remote
891 case "${COMP_WORDS[0]}" in
892 git-push) remote="${COMP_WORDS[1]}" ;;
893 git) remote="${COMP_WORDS[2]}" ;;
894 esac
896 local pfx=""
897 case "$COMP_WORDBREAKS" in
898 *:*) : great ;;
899 *) pfx="${cur%%:*}:" ;;
900 esac
902 __gitcomp "$(__git_refs "$remote")" "$pfx" "${cur#*:}"
905 __gitcomp "$(__git_refs)" + "${cur#+}"
908 __gitcomp "$(__git_refs)"
910 esac
912 esac
915 _git_rebase ()
917 local cur="${COMP_WORDS[COMP_CWORD]}" dir="$(__gitdir)"
918 if [ -d "$dir"/rebase-apply ] || [ -d "$dir"/rebase-merge ]; then
919 __gitcomp "--continue --skip --abort"
920 return
922 case "${COMP_WORDS[COMP_CWORD-1]}" in
923 -s|--strategy)
924 __gitcomp "$(__git_merge_strategies)"
925 return
926 esac
927 case "$cur" in
928 --strategy=*)
929 __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
930 return
932 --*)
933 __gitcomp "--onto --merge --strategy --interactive"
934 return
935 esac
936 __gitcomp "$(__git_refs)"
939 _git_send_email ()
941 local cur="${COMP_WORDS[COMP_CWORD]}"
942 case "$cur" in
943 --*)
944 __gitcomp "--bcc --cc --cc-cmd --chain-reply-to --compose
945 --dry-run --envelope-sender --from --identity
946 --in-reply-to --no-chain-reply-to --no-signed-off-by-cc
947 --no-suppress-from --no-thread --quiet
948 --signed-off-by-cc --smtp-pass --smtp-server
949 --smtp-server-port --smtp-ssl --smtp-user --subject
950 --suppress-cc --suppress-from --thread --to"
951 return
953 esac
954 COMPREPLY=()
957 _git_config ()
959 local cur="${COMP_WORDS[COMP_CWORD]}"
960 local prv="${COMP_WORDS[COMP_CWORD-1]}"
961 case "$prv" in
962 branch.*.remote)
963 __gitcomp "$(__git_remotes)"
964 return
966 branch.*.merge)
967 __gitcomp "$(__git_refs)"
968 return
970 remote.*.fetch)
971 local remote="${prv#remote.}"
972 remote="${remote%.fetch}"
973 __gitcomp "$(__git_refs_remotes "$remote")"
974 return
976 remote.*.push)
977 local remote="${prv#remote.}"
978 remote="${remote%.push}"
979 __gitcomp "$(git --git-dir="$(__gitdir)" \
980 for-each-ref --format='%(refname):%(refname)' \
981 refs/heads)"
982 return
984 pull.twohead|pull.octopus)
985 __gitcomp "$(__git_merge_strategies)"
986 return
988 color.branch|color.diff|color.status)
989 __gitcomp "always never auto"
990 return
992 color.*.*)
993 __gitcomp "
994 black red green yellow blue magenta cyan white
995 bold dim ul blink reverse
997 return
999 *.*)
1000 COMPREPLY=()
1001 return
1003 esac
1004 case "$cur" in
1005 --*)
1006 __gitcomp "
1007 --global --system --file=
1008 --list --replace-all
1009 --get --get-all --get-regexp
1010 --add --unset --unset-all
1011 --remove-section --rename-section
1013 return
1015 branch.*.*)
1016 local pfx="${cur%.*}."
1017 cur="${cur##*.}"
1018 __gitcomp "remote merge" "$pfx" "$cur"
1019 return
1021 branch.*)
1022 local pfx="${cur%.*}."
1023 cur="${cur#*.}"
1024 __gitcomp "$(__git_heads)" "$pfx" "$cur" "."
1025 return
1027 remote.*.*)
1028 local pfx="${cur%.*}."
1029 cur="${cur##*.}"
1030 __gitcomp "
1031 url fetch push skipDefaultUpdate
1032 receivepack uploadpack tagopt
1033 " "$pfx" "$cur"
1034 return
1036 remote.*)
1037 local pfx="${cur%.*}."
1038 cur="${cur#*.}"
1039 __gitcomp "$(__git_remotes)" "$pfx" "$cur" "."
1040 return
1042 esac
1043 __gitcomp "
1044 apply.whitespace
1045 core.fileMode
1046 core.gitProxy
1047 core.ignoreStat
1048 core.preferSymlinkRefs
1049 core.logAllRefUpdates
1050 core.loosecompression
1051 core.repositoryFormatVersion
1052 core.sharedRepository
1053 core.warnAmbiguousRefs
1054 core.compression
1055 core.packedGitWindowSize
1056 core.packedGitLimit
1057 clean.requireForce
1058 color.branch
1059 color.branch.current
1060 color.branch.local
1061 color.branch.remote
1062 color.branch.plain
1063 color.diff
1064 color.diff.plain
1065 color.diff.meta
1066 color.diff.frag
1067 color.diff.old
1068 color.diff.new
1069 color.diff.commit
1070 color.diff.whitespace
1071 color.pager
1072 color.status
1073 color.status.header
1074 color.status.added
1075 color.status.changed
1076 color.status.untracked
1077 diff.renameLimit
1078 diff.renames
1079 fetch.unpackLimit
1080 format.headers
1081 format.subjectprefix
1082 gitcvs.enabled
1083 gitcvs.logfile
1084 gitcvs.allbinary
1085 gitcvs.dbname gitcvs.dbdriver gitcvs.dbuser gitcvs.dbpass
1086 gitcvs.dbtablenameprefix
1087 gc.packrefs
1088 gc.reflogexpire
1089 gc.reflogexpireunreachable
1090 gc.rerereresolved
1091 gc.rerereunresolved
1092 http.sslVerify
1093 http.sslCert
1094 http.sslKey
1095 http.sslCAInfo
1096 http.sslCAPath
1097 http.maxRequests
1098 http.lowSpeedLimit
1099 http.lowSpeedTime
1100 http.noEPSV
1101 i18n.commitEncoding
1102 i18n.logOutputEncoding
1103 log.showroot
1104 merge.tool
1105 merge.summary
1106 merge.verbosity
1107 pack.window
1108 pack.depth
1109 pack.windowMemory
1110 pack.compression
1111 pack.deltaCacheSize
1112 pack.deltaCacheLimit
1113 pull.octopus
1114 pull.twohead
1115 repack.useDeltaBaseOffset
1116 showbranch.default
1117 tar.umask
1118 transfer.unpackLimit
1119 receive.unpackLimit
1120 receive.denyNonFastForwards
1121 user.name
1122 user.email
1123 user.signingkey
1124 branch. remote.
1128 _git_remote ()
1130 local subcommands="add rm show prune update"
1131 local subcommand="$(__git_find_subcommand "$subcommands")"
1132 if [ -z "$subcommand" ]; then
1133 __gitcomp "$subcommands"
1134 return
1137 case "$subcommand" in
1138 rm|show|prune)
1139 __gitcomp "$(__git_remotes)"
1141 update)
1142 local i c='' IFS=$'\n'
1143 for i in $(git --git-dir="$(__gitdir)" config --list); do
1144 case "$i" in
1145 remotes.*)
1146 i="${i#remotes.}"
1147 c="$c ${i/=*/}"
1149 esac
1150 done
1151 __gitcomp "$c"
1154 COMPREPLY=()
1156 esac
1159 _git_reset ()
1161 __git_has_doubledash && return
1163 local cur="${COMP_WORDS[COMP_CWORD]}"
1164 case "$cur" in
1165 --*)
1166 __gitcomp "--mixed --hard --soft"
1167 return
1169 esac
1170 __gitcomp "$(__git_refs)"
1173 _git_rm ()
1175 __git_has_doubledash && return
1177 local cur="${COMP_WORDS[COMP_CWORD]}"
1178 case "$cur" in
1179 --*)
1180 __gitcomp "--cached --dry-run --ignore-unmatch --quiet"
1181 return
1183 esac
1184 COMPREPLY=()
1187 _git_shortlog ()
1189 __git_has_doubledash && return
1191 local cur="${COMP_WORDS[COMP_CWORD]}"
1192 case "$cur" in
1193 --*)
1194 __gitcomp "
1195 --max-count= --max-age= --since= --after=
1196 --min-age= --before= --until=
1197 --no-merges
1198 --author= --committer= --grep=
1199 --all-match
1200 --not --all
1201 --numbered --summary
1203 return
1205 esac
1206 __git_complete_revlist
1209 _git_show ()
1211 local cur="${COMP_WORDS[COMP_CWORD]}"
1212 case "$cur" in
1213 --pretty=*)
1214 __gitcomp "
1215 oneline short medium full fuller email raw
1216 " "" "${cur##--pretty=}"
1217 return
1219 --*)
1220 __gitcomp "--pretty="
1221 return
1223 esac
1224 __git_complete_file
1227 _git_show_branch ()
1229 local cur="${COMP_WORDS[COMP_CWORD]}"
1230 case "$cur" in
1231 --*)
1232 __gitcomp "
1233 --all --remotes --topo-order --current --more=
1234 --list --independent --merge-base --no-name
1235 --sha1-name --topics --reflog
1237 return
1239 esac
1240 __git_complete_revlist
1243 _git_stash ()
1245 local subcommands='save list show apply clear drop pop create'
1246 local subcommand="$(__git_find_subcommand "$subcommands")"
1247 if [ -z "$subcommand" ]; then
1248 __gitcomp "$subcommands"
1249 else
1250 local cur="${COMP_WORDS[COMP_CWORD]}"
1251 case "$subcommand,$cur" in
1252 save,--*)
1253 __gitcomp "--keep-index"
1256 COMPREPLY=()
1258 esac
1262 _git_submodule ()
1264 __git_has_doubledash && return
1266 local subcommands="add status init update"
1267 if [ -z "$(__git_find_subcommand "$subcommands")" ]; then
1268 local cur="${COMP_WORDS[COMP_CWORD]}"
1269 case "$cur" in
1270 --*)
1271 __gitcomp "--quiet --cached"
1274 __gitcomp "$subcommands"
1276 esac
1277 return
1281 _git_svn ()
1283 local subcommands="
1284 init fetch clone rebase dcommit log find-rev
1285 set-tree commit-diff info create-ignore propget
1286 proplist show-ignore show-externals
1288 local subcommand="$(__git_find_subcommand "$subcommands")"
1289 if [ -z "$subcommand" ]; then
1290 __gitcomp "$subcommands"
1291 else
1292 local remote_opts="--username= --config-dir= --no-auth-cache"
1293 local fc_opts="
1294 --follow-parent --authors-file= --repack=
1295 --no-metadata --use-svm-props --use-svnsync-props
1296 --log-window-size= --no-checkout --quiet
1297 --repack-flags --user-log-author $remote_opts
1299 local init_opts="
1300 --template= --shared= --trunk= --tags=
1301 --branches= --stdlayout --minimize-url
1302 --no-metadata --use-svm-props --use-svnsync-props
1303 --rewrite-root= $remote_opts
1305 local cmt_opts="
1306 --edit --rmdir --find-copies-harder --copy-similarity=
1309 local cur="${COMP_WORDS[COMP_CWORD]}"
1310 case "$subcommand,$cur" in
1311 fetch,--*)
1312 __gitcomp "--revision= --fetch-all $fc_opts"
1314 clone,--*)
1315 __gitcomp "--revision= $fc_opts $init_opts"
1317 init,--*)
1318 __gitcomp "$init_opts"
1320 dcommit,--*)
1321 __gitcomp "
1322 --merge --strategy= --verbose --dry-run
1323 --fetch-all --no-rebase $cmt_opts $fc_opts
1326 set-tree,--*)
1327 __gitcomp "--stdin $cmt_opts $fc_opts"
1329 create-ignore,--*|propget,--*|proplist,--*|show-ignore,--*|\
1330 show-externals,--*)
1331 __gitcomp "--revision="
1333 log,--*)
1334 __gitcomp "
1335 --limit= --revision= --verbose --incremental
1336 --oneline --show-commit --non-recursive
1337 --authors-file=
1340 rebase,--*)
1341 __gitcomp "
1342 --merge --verbose --strategy= --local
1343 --fetch-all $fc_opts
1346 commit-diff,--*)
1347 __gitcomp "--message= --file= --revision= $cmt_opts"
1349 info,--*)
1350 __gitcomp "--url"
1353 COMPREPLY=()
1355 esac
1359 _git_tag ()
1361 local i c=1 f=0
1362 while [ $c -lt $COMP_CWORD ]; do
1363 i="${COMP_WORDS[c]}"
1364 case "$i" in
1365 -d|-v)
1366 __gitcomp "$(__git_tags)"
1367 return
1372 esac
1373 c=$((++c))
1374 done
1376 case "${COMP_WORDS[COMP_CWORD-1]}" in
1377 -m|-F)
1378 COMPREPLY=()
1380 -*|tag|git-tag)
1381 if [ $f = 1 ]; then
1382 __gitcomp "$(__git_tags)"
1383 else
1384 COMPREPLY=()
1388 __gitcomp "$(__git_refs)"
1390 esac
1393 _git ()
1395 local i c=1 command __git_dir
1397 while [ $c -lt $COMP_CWORD ]; do
1398 i="${COMP_WORDS[c]}"
1399 case "$i" in
1400 --git-dir=*) __git_dir="${i#--git-dir=}" ;;
1401 --bare) __git_dir="." ;;
1402 --version|--help|-p|--paginate) ;;
1403 *) command="$i"; break ;;
1404 esac
1405 c=$((++c))
1406 done
1408 if [ -z "$command" ]; then
1409 case "${COMP_WORDS[COMP_CWORD]}" in
1410 --*=*) COMPREPLY=() ;;
1411 --*) __gitcomp "
1412 --paginate
1413 --no-pager
1414 --git-dir=
1415 --bare
1416 --version
1417 --exec-path
1418 --work-tree=
1419 --help
1422 *) __gitcomp "$(__git_commands) $(__git_aliases)" ;;
1423 esac
1424 return
1427 local expansion=$(__git_aliased_command "$command")
1428 [ "$expansion" ] && command="$expansion"
1430 case "$command" in
1431 am) _git_am ;;
1432 add) _git_add ;;
1433 apply) _git_apply ;;
1434 bisect) _git_bisect ;;
1435 bundle) _git_bundle ;;
1436 branch) _git_branch ;;
1437 checkout) _git_checkout ;;
1438 cherry) _git_cherry ;;
1439 cherry-pick) _git_cherry_pick ;;
1440 commit) _git_commit ;;
1441 config) _git_config ;;
1442 describe) _git_describe ;;
1443 diff) _git_diff ;;
1444 fetch) _git_fetch ;;
1445 format-patch) _git_format_patch ;;
1446 gc) _git_gc ;;
1447 log) _git_log ;;
1448 ls-remote) _git_ls_remote ;;
1449 ls-tree) _git_ls_tree ;;
1450 merge) _git_merge;;
1451 merge-base) _git_merge_base ;;
1452 name-rev) _git_name_rev ;;
1453 pull) _git_pull ;;
1454 push) _git_push ;;
1455 rebase) _git_rebase ;;
1456 remote) _git_remote ;;
1457 reset) _git_reset ;;
1458 rm) _git_rm ;;
1459 send-email) _git_send_email ;;
1460 shortlog) _git_shortlog ;;
1461 show) _git_show ;;
1462 show-branch) _git_show_branch ;;
1463 stash) _git_stash ;;
1464 submodule) _git_submodule ;;
1465 svn) _git_svn ;;
1466 tag) _git_tag ;;
1467 whatchanged) _git_log ;;
1468 *) COMPREPLY=() ;;
1469 esac
1472 _gitk ()
1474 __git_has_doubledash && return
1476 local cur="${COMP_WORDS[COMP_CWORD]}"
1477 local g="$(git rev-parse --git-dir 2>/dev/null)"
1478 local merge=""
1479 if [ -f $g/MERGE_HEAD ]; then
1480 merge="--merge"
1482 case "$cur" in
1483 --*)
1484 __gitcomp "--not --all $merge"
1485 return
1487 esac
1488 __git_complete_revlist
1491 complete -o default -o nospace -F _git git
1492 complete -o default -o nospace -F _gitk gitk
1494 # The following are necessary only for Cygwin, and only are needed
1495 # when the user has tab-completed the executable name and consequently
1496 # included the '.exe' suffix.
1498 if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
1499 complete -o default -o nospace -F _git git.exe