bash: offer only paths after '--'
[git.git] / contrib / completion / git-completion.bash
blobcff28a88afe3262705acc3d9b47e97be65dbb8d1
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 __gitdir ()
50 if [ -z "$1" ]; then
51 if [ -n "$__git_dir" ]; then
52 echo "$__git_dir"
53 elif [ -d .git ]; then
54 echo .git
55 else
56 git rev-parse --git-dir 2>/dev/null
58 elif [ -d "$1/.git" ]; then
59 echo "$1/.git"
60 else
61 echo "$1"
65 __git_ps1 ()
67 local g="$(git rev-parse --git-dir 2>/dev/null)"
68 if [ -n "$g" ]; then
69 local r
70 local b
71 if [ -d "$g/../.dotest" ]
72 then
73 if test -f "$g/../.dotest/rebasing"
74 then
75 r="|REBASE"
76 elif test -f "$g/../.dotest/applying"
77 then
78 r="|AM"
79 else
80 r="|AM/REBASE"
82 b="$(git symbolic-ref HEAD 2>/dev/null)"
83 elif [ -f "$g/.dotest-merge/interactive" ]
84 then
85 r="|REBASE-i"
86 b="$(cat "$g/.dotest-merge/head-name")"
87 elif [ -d "$g/.dotest-merge" ]
88 then
89 r="|REBASE-m"
90 b="$(cat "$g/.dotest-merge/head-name")"
91 elif [ -f "$g/MERGE_HEAD" ]
92 then
93 r="|MERGING"
94 b="$(git symbolic-ref HEAD 2>/dev/null)"
95 else
96 if [ -f "$g/BISECT_LOG" ]
97 then
98 r="|BISECTING"
100 if ! b="$(git symbolic-ref HEAD 2>/dev/null)"
101 then
102 if ! b="$(git describe --exact-match HEAD 2>/dev/null)"
103 then
104 b="$(cut -c1-7 "$g/HEAD")..."
109 if [ -n "$1" ]; then
110 printf "$1" "${b##refs/heads/}$r"
111 else
112 printf " (%s)" "${b##refs/heads/}$r"
117 __gitcomp ()
119 local all c s=$'\n' IFS=' '$'\t'$'\n'
120 local cur="${COMP_WORDS[COMP_CWORD]}"
121 if [ $# -gt 2 ]; then
122 cur="$3"
124 case "$cur" in
125 --*=)
126 COMPREPLY=()
127 return
130 for c in $1; do
131 case "$c$4" in
132 --*=*) all="$all$c$4$s" ;;
133 *.) all="$all$c$4$s" ;;
134 *) all="$all$c$4 $s" ;;
135 esac
136 done
138 esac
139 IFS=$s
140 COMPREPLY=($(compgen -P "$2" -W "$all" -- "$cur"))
141 return
144 __git_heads ()
146 local cmd i is_hash=y dir="$(__gitdir "$1")"
147 if [ -d "$dir" ]; then
148 for i in $(git --git-dir="$dir" \
149 for-each-ref --format='%(refname)' \
150 refs/heads ); do
151 echo "${i#refs/heads/}"
152 done
153 return
155 for i in $(git ls-remote "$1" 2>/dev/null); do
156 case "$is_hash,$i" in
157 y,*) is_hash=n ;;
158 n,*^{}) is_hash=y ;;
159 n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;
160 n,*) is_hash=y; echo "$i" ;;
161 esac
162 done
165 __git_tags ()
167 local cmd i is_hash=y dir="$(__gitdir "$1")"
168 if [ -d "$dir" ]; then
169 for i in $(git --git-dir="$dir" \
170 for-each-ref --format='%(refname)' \
171 refs/tags ); do
172 echo "${i#refs/tags/}"
173 done
174 return
176 for i in $(git ls-remote "$1" 2>/dev/null); do
177 case "$is_hash,$i" in
178 y,*) is_hash=n ;;
179 n,*^{}) is_hash=y ;;
180 n,refs/tags/*) is_hash=y; echo "${i#refs/tags/}" ;;
181 n,*) is_hash=y; echo "$i" ;;
182 esac
183 done
186 __git_refs ()
188 local cmd i is_hash=y dir="$(__gitdir "$1")"
189 if [ -d "$dir" ]; then
190 if [ -e "$dir/HEAD" ]; then echo HEAD; fi
191 for i in $(git --git-dir="$dir" \
192 for-each-ref --format='%(refname)' \
193 refs/tags refs/heads refs/remotes); do
194 case "$i" in
195 refs/tags/*) echo "${i#refs/tags/}" ;;
196 refs/heads/*) echo "${i#refs/heads/}" ;;
197 refs/remotes/*) echo "${i#refs/remotes/}" ;;
198 *) echo "$i" ;;
199 esac
200 done
201 return
203 for i in $(git ls-remote "$dir" 2>/dev/null); do
204 case "$is_hash,$i" in
205 y,*) is_hash=n ;;
206 n,*^{}) is_hash=y ;;
207 n,refs/tags/*) is_hash=y; echo "${i#refs/tags/}" ;;
208 n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;
209 n,refs/remotes/*) is_hash=y; echo "${i#refs/remotes/}" ;;
210 n,*) is_hash=y; echo "$i" ;;
211 esac
212 done
215 __git_refs2 ()
217 local i
218 for i in $(__git_refs "$1"); do
219 echo "$i:$i"
220 done
223 __git_refs_remotes ()
225 local cmd i is_hash=y
226 for i in $(git ls-remote "$1" 2>/dev/null); do
227 case "$is_hash,$i" in
228 n,refs/heads/*)
229 is_hash=y
230 echo "$i:refs/remotes/$1/${i#refs/heads/}"
232 y,*) is_hash=n ;;
233 n,*^{}) is_hash=y ;;
234 n,refs/tags/*) is_hash=y;;
235 n,*) is_hash=y; ;;
236 esac
237 done
240 __git_remotes ()
242 local i ngoff IFS=$'\n' d="$(__gitdir)"
243 shopt -q nullglob || ngoff=1
244 shopt -s nullglob
245 for i in "$d/remotes"/*; do
246 echo ${i#$d/remotes/}
247 done
248 [ "$ngoff" ] && shopt -u nullglob
249 for i in $(git --git-dir="$d" config --list); do
250 case "$i" in
251 remote.*.url=*)
252 i="${i#remote.}"
253 echo "${i/.url=*/}"
255 esac
256 done
259 __git_merge_strategies ()
261 if [ -n "$__git_merge_strategylist" ]; then
262 echo "$__git_merge_strategylist"
263 return
265 sed -n "/^all_strategies='/{
266 s/^all_strategies='//
267 s/'//
270 }" "$(git --exec-path)/git-merge"
272 __git_merge_strategylist=
273 __git_merge_strategylist="$(__git_merge_strategies 2>/dev/null)"
275 __git_complete_file ()
277 local pfx ls ref cur="${COMP_WORDS[COMP_CWORD]}"
278 case "$cur" in
279 ?*:*)
280 ref="${cur%%:*}"
281 cur="${cur#*:}"
282 case "$cur" in
283 ?*/*)
284 pfx="${cur%/*}"
285 cur="${cur##*/}"
286 ls="$ref:$pfx"
287 pfx="$pfx/"
290 ls="$ref"
292 esac
293 COMPREPLY=($(compgen -P "$pfx" \
294 -W "$(git --git-dir="$(__gitdir)" ls-tree "$ls" \
295 | sed '/^100... blob /s,^.* ,,
296 /^040000 tree /{
297 s,^.* ,,
298 s,$,/,
300 s/^.* //')" \
301 -- "$cur"))
304 __gitcomp "$(__git_refs)"
306 esac
309 __git_complete_revlist ()
311 local pfx cur="${COMP_WORDS[COMP_CWORD]}"
312 case "$cur" in
313 *...*)
314 pfx="${cur%...*}..."
315 cur="${cur#*...}"
316 __gitcomp "$(__git_refs)" "$pfx" "$cur"
318 *..*)
319 pfx="${cur%..*}.."
320 cur="${cur#*..}"
321 __gitcomp "$(__git_refs)" "$pfx" "$cur"
324 __gitcomp "$cur."
327 __gitcomp "$(__git_refs)"
329 esac
332 __git_commands ()
334 if [ -n "$__git_commandlist" ]; then
335 echo "$__git_commandlist"
336 return
338 local i IFS=" "$'\n'
339 for i in $(git help -a|egrep '^ ')
341 case $i in
342 *--*) : helper pattern;;
343 applymbox) : ask gittus;;
344 applypatch) : ask gittus;;
345 archimport) : import;;
346 cat-file) : plumbing;;
347 check-attr) : plumbing;;
348 check-ref-format) : plumbing;;
349 commit-tree) : plumbing;;
350 cvsexportcommit) : export;;
351 cvsimport) : import;;
352 cvsserver) : daemon;;
353 daemon) : daemon;;
354 diff-files) : plumbing;;
355 diff-index) : plumbing;;
356 diff-tree) : plumbing;;
357 fast-import) : import;;
358 fsck-objects) : plumbing;;
359 fetch-pack) : plumbing;;
360 fmt-merge-msg) : plumbing;;
361 for-each-ref) : plumbing;;
362 hash-object) : plumbing;;
363 http-*) : transport;;
364 index-pack) : plumbing;;
365 init-db) : deprecated;;
366 local-fetch) : plumbing;;
367 mailinfo) : plumbing;;
368 mailsplit) : plumbing;;
369 merge-*) : plumbing;;
370 mktree) : plumbing;;
371 mktag) : plumbing;;
372 pack-objects) : plumbing;;
373 pack-redundant) : plumbing;;
374 pack-refs) : plumbing;;
375 parse-remote) : plumbing;;
376 patch-id) : plumbing;;
377 peek-remote) : plumbing;;
378 prune) : plumbing;;
379 prune-packed) : plumbing;;
380 quiltimport) : import;;
381 read-tree) : plumbing;;
382 receive-pack) : plumbing;;
383 reflog) : plumbing;;
384 repo-config) : deprecated;;
385 rerere) : plumbing;;
386 rev-list) : plumbing;;
387 rev-parse) : plumbing;;
388 runstatus) : plumbing;;
389 sh-setup) : internal;;
390 shell) : daemon;;
391 send-pack) : plumbing;;
392 show-index) : plumbing;;
393 ssh-*) : transport;;
394 stripspace) : plumbing;;
395 symbolic-ref) : plumbing;;
396 tar-tree) : deprecated;;
397 unpack-file) : plumbing;;
398 unpack-objects) : plumbing;;
399 update-index) : plumbing;;
400 update-ref) : plumbing;;
401 update-server-info) : daemon;;
402 upload-archive) : plumbing;;
403 upload-pack) : plumbing;;
404 write-tree) : plumbing;;
405 verify-tag) : plumbing;;
406 *) echo $i;;
407 esac
408 done
410 __git_commandlist=
411 __git_commandlist="$(__git_commands 2>/dev/null)"
413 __git_aliases ()
415 local i IFS=$'\n'
416 for i in $(git --git-dir="$(__gitdir)" config --list); do
417 case "$i" in
418 alias.*)
419 i="${i#alias.}"
420 echo "${i/=*/}"
422 esac
423 done
426 __git_aliased_command ()
428 local word cmdline=$(git --git-dir="$(__gitdir)" \
429 config --get "alias.$1")
430 for word in $cmdline; do
431 if [ "${word##-*}" ]; then
432 echo $word
433 return
435 done
438 __git_find_subcommand ()
440 local word subcommand c=1
442 while [ $c -lt $COMP_CWORD ]; do
443 word="${COMP_WORDS[c]}"
444 for subcommand in $1; do
445 if [ "$subcommand" = "$word" ]; then
446 echo "$subcommand"
447 return
449 done
450 c=$((++c))
451 done
454 __git_has_doubledash ()
456 local c=1
457 while [ $c -lt $COMP_CWORD ]; do
458 if [ "--" = "${COMP_WORDS[c]}" ]; then
459 return 0
461 c=$((++c))
462 done
463 return 1
466 __git_whitespacelist="nowarn warn error error-all strip"
468 _git_am ()
470 local cur="${COMP_WORDS[COMP_CWORD]}"
471 if [ -d .dotest ]; then
472 __gitcomp "--skip --resolved"
473 return
475 case "$cur" in
476 --whitespace=*)
477 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
478 return
480 --*)
481 __gitcomp "
482 --signoff --utf8 --binary --3way --interactive
483 --whitespace=
485 return
486 esac
487 COMPREPLY=()
490 _git_apply ()
492 local cur="${COMP_WORDS[COMP_CWORD]}"
493 case "$cur" in
494 --whitespace=*)
495 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
496 return
498 --*)
499 __gitcomp "
500 --stat --numstat --summary --check --index
501 --cached --index-info --reverse --reject --unidiff-zero
502 --apply --no-add --exclude=
503 --whitespace= --inaccurate-eof --verbose
505 return
506 esac
507 COMPREPLY=()
510 _git_add ()
512 __git_has_doubledash && return
514 local cur="${COMP_WORDS[COMP_CWORD]}"
515 case "$cur" in
516 --*)
517 __gitcomp "
518 --interactive --refresh --patch --update --dry-run
519 --ignore-errors
521 return
522 esac
523 COMPREPLY=()
526 _git_bisect ()
528 __git_has_doubledash && return
530 local subcommands="start bad good reset visualize replay log"
531 local subcommand="$(__git_find_subcommand "$subcommands")"
532 if [ -z "$subcommand" ]; then
533 __gitcomp "$subcommands"
534 return
537 case "$subcommand" in
538 bad|good|reset)
539 __gitcomp "$(__git_refs)"
542 COMPREPLY=()
544 esac
547 _git_branch ()
549 local i c=1 only_local_ref="n" has_r="n"
551 while [ $c -lt $COMP_CWORD ]; do
552 i="${COMP_WORDS[c]}"
553 case "$i" in
554 -d|-m) only_local_ref="y" ;;
555 -r) has_r="y" ;;
556 esac
557 c=$((++c))
558 done
560 case "${COMP_WORDS[COMP_CWORD]}" in
561 --*=*) COMPREPLY=() ;;
562 --*)
563 __gitcomp "
564 --color --no-color --verbose --abbrev= --no-abbrev
565 --track --no-track
569 if [ $only_local_ref = "y" -a $has_r = "n" ]; then
570 __gitcomp "$(__git_heads)"
571 else
572 __gitcomp "$(__git_refs)"
575 esac
578 _git_bundle ()
580 local mycword="$COMP_CWORD"
581 case "${COMP_WORDS[0]}" in
582 git)
583 local cmd="${COMP_WORDS[2]}"
584 mycword="$((mycword-1))"
586 git-bundle*)
587 local cmd="${COMP_WORDS[1]}"
589 esac
590 case "$mycword" in
592 __gitcomp "create list-heads verify unbundle"
595 # looking for a file
598 case "$cmd" in
599 create)
600 __git_complete_revlist
602 esac
604 esac
607 _git_checkout ()
609 __gitcomp "$(__git_refs)"
612 _git_cherry ()
614 __gitcomp "$(__git_refs)"
617 _git_cherry_pick ()
619 local cur="${COMP_WORDS[COMP_CWORD]}"
620 case "$cur" in
621 --*)
622 __gitcomp "--edit --no-commit"
625 __gitcomp "$(__git_refs)"
627 esac
630 _git_commit ()
632 __git_has_doubledash && return
634 local cur="${COMP_WORDS[COMP_CWORD]}"
635 case "$cur" in
636 --*)
637 __gitcomp "
638 --all --author= --signoff --verify --no-verify
639 --edit --amend --include --only
641 return
642 esac
643 COMPREPLY=()
646 _git_describe ()
648 __gitcomp "$(__git_refs)"
651 _git_diff ()
653 __git_has_doubledash && return
655 local cur="${COMP_WORDS[COMP_CWORD]}"
656 case "$cur" in
657 --*)
658 __gitcomp "--cached --stat --numstat --shortstat --summary
659 --patch-with-stat --name-only --name-status --color
660 --no-color --color-words --no-renames --check
661 --full-index --binary --abbrev --diff-filter
662 --find-copies-harder --pickaxe-all --pickaxe-regex
663 --text --ignore-space-at-eol --ignore-space-change
664 --ignore-all-space --exit-code --quiet --ext-diff
665 --no-ext-diff
666 --no-prefix --src-prefix= --dst-prefix=
667 --base --ours --theirs
669 return
671 esac
672 __git_complete_file
675 _git_diff_tree ()
677 __gitcomp "$(__git_refs)"
680 _git_fetch ()
682 local cur="${COMP_WORDS[COMP_CWORD]}"
684 case "${COMP_WORDS[0]},$COMP_CWORD" in
685 git-fetch*,1)
686 __gitcomp "$(__git_remotes)"
688 git,2)
689 __gitcomp "$(__git_remotes)"
692 case "$cur" in
693 *:*)
694 __gitcomp "$(__git_refs)" "" "${cur#*:}"
697 local remote
698 case "${COMP_WORDS[0]}" in
699 git-fetch) remote="${COMP_WORDS[1]}" ;;
700 git) remote="${COMP_WORDS[2]}" ;;
701 esac
702 __gitcomp "$(__git_refs2 "$remote")"
704 esac
706 esac
709 _git_format_patch ()
711 local cur="${COMP_WORDS[COMP_CWORD]}"
712 case "$cur" in
713 --*)
714 __gitcomp "
715 --stdout --attach --thread
716 --output-directory
717 --numbered --start-number
718 --numbered-files
719 --keep-subject
720 --signoff
721 --in-reply-to=
722 --full-index --binary
723 --not --all
724 --cover-letter
725 --no-prefix --src-prefix= --dst-prefix=
727 return
729 esac
730 __git_complete_revlist
733 _git_gc ()
735 local cur="${COMP_WORDS[COMP_CWORD]}"
736 case "$cur" in
737 --*)
738 __gitcomp "--prune --aggressive"
739 return
741 esac
742 COMPREPLY=()
745 _git_ls_remote ()
747 __gitcomp "$(__git_remotes)"
750 _git_ls_tree ()
752 __git_complete_file
755 _git_log ()
757 __git_has_doubledash && return
759 local cur="${COMP_WORDS[COMP_CWORD]}"
760 case "$cur" in
761 --pretty=*)
762 __gitcomp "
763 oneline short medium full fuller email raw
764 " "" "${cur##--pretty=}"
765 return
767 --date=*)
768 __gitcomp "
769 relative iso8601 rfc2822 short local default
770 " "" "${cur##--date=}"
771 return
773 --*)
774 __gitcomp "
775 --max-count= --max-age= --since= --after=
776 --min-age= --before= --until=
777 --root --topo-order --date-order --reverse
778 --no-merges --follow
779 --abbrev-commit --abbrev=
780 --relative-date --date=
781 --author= --committer= --grep=
782 --all-match
783 --pretty= --name-status --name-only --raw
784 --not --all
785 --left-right --cherry-pick
786 --graph
788 return
790 esac
791 __git_complete_revlist
794 _git_merge ()
796 local cur="${COMP_WORDS[COMP_CWORD]}"
797 case "${COMP_WORDS[COMP_CWORD-1]}" in
798 -s|--strategy)
799 __gitcomp "$(__git_merge_strategies)"
800 return
801 esac
802 case "$cur" in
803 --strategy=*)
804 __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
805 return
807 --*)
808 __gitcomp "
809 --no-commit --no-stat --log --no-log --squash --strategy
811 return
812 esac
813 __gitcomp "$(__git_refs)"
816 _git_merge_base ()
818 __gitcomp "$(__git_refs)"
821 _git_name_rev ()
823 __gitcomp "--tags --all --stdin"
826 _git_pull ()
828 local cur="${COMP_WORDS[COMP_CWORD]}"
830 case "${COMP_WORDS[0]},$COMP_CWORD" in
831 git-pull*,1)
832 __gitcomp "$(__git_remotes)"
834 git,2)
835 __gitcomp "$(__git_remotes)"
838 local remote
839 case "${COMP_WORDS[0]}" in
840 git-pull) remote="${COMP_WORDS[1]}" ;;
841 git) remote="${COMP_WORDS[2]}" ;;
842 esac
843 __gitcomp "$(__git_refs "$remote")"
845 esac
848 _git_push ()
850 local cur="${COMP_WORDS[COMP_CWORD]}"
852 case "${COMP_WORDS[0]},$COMP_CWORD" in
853 git-push*,1)
854 __gitcomp "$(__git_remotes)"
856 git,2)
857 __gitcomp "$(__git_remotes)"
860 case "$cur" in
861 *:*)
862 local remote
863 case "${COMP_WORDS[0]}" in
864 git-push) remote="${COMP_WORDS[1]}" ;;
865 git) remote="${COMP_WORDS[2]}" ;;
866 esac
867 __gitcomp "$(__git_refs "$remote")" "" "${cur#*:}"
870 __gitcomp "$(__git_refs)" + "${cur#+}"
873 __gitcomp "$(__git_refs)"
875 esac
877 esac
880 _git_rebase ()
882 local cur="${COMP_WORDS[COMP_CWORD]}" dir="$(__gitdir)"
883 if [ -d .dotest ] || [ -d "$dir"/.dotest-merge ]; then
884 __gitcomp "--continue --skip --abort"
885 return
887 case "${COMP_WORDS[COMP_CWORD-1]}" in
888 -s|--strategy)
889 __gitcomp "$(__git_merge_strategies)"
890 return
891 esac
892 case "$cur" in
893 --strategy=*)
894 __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
895 return
897 --*)
898 __gitcomp "--onto --merge --strategy --interactive"
899 return
900 esac
901 __gitcomp "$(__git_refs)"
904 _git_config ()
906 local cur="${COMP_WORDS[COMP_CWORD]}"
907 local prv="${COMP_WORDS[COMP_CWORD-1]}"
908 case "$prv" in
909 branch.*.remote)
910 __gitcomp "$(__git_remotes)"
911 return
913 branch.*.merge)
914 __gitcomp "$(__git_refs)"
915 return
917 remote.*.fetch)
918 local remote="${prv#remote.}"
919 remote="${remote%.fetch}"
920 __gitcomp "$(__git_refs_remotes "$remote")"
921 return
923 remote.*.push)
924 local remote="${prv#remote.}"
925 remote="${remote%.push}"
926 __gitcomp "$(git --git-dir="$(__gitdir)" \
927 for-each-ref --format='%(refname):%(refname)' \
928 refs/heads)"
929 return
931 pull.twohead|pull.octopus)
932 __gitcomp "$(__git_merge_strategies)"
933 return
935 color.branch|color.diff|color.status)
936 __gitcomp "always never auto"
937 return
939 color.*.*)
940 __gitcomp "
941 black red green yellow blue magenta cyan white
942 bold dim ul blink reverse
944 return
946 *.*)
947 COMPREPLY=()
948 return
950 esac
951 case "$cur" in
952 --*)
953 __gitcomp "
954 --global --system --file=
955 --list --replace-all
956 --get --get-all --get-regexp
957 --add --unset --unset-all
958 --remove-section --rename-section
960 return
962 branch.*.*)
963 local pfx="${cur%.*}."
964 cur="${cur##*.}"
965 __gitcomp "remote merge" "$pfx" "$cur"
966 return
968 branch.*)
969 local pfx="${cur%.*}."
970 cur="${cur#*.}"
971 __gitcomp "$(__git_heads)" "$pfx" "$cur" "."
972 return
974 remote.*.*)
975 local pfx="${cur%.*}."
976 cur="${cur##*.}"
977 __gitcomp "
978 url fetch push skipDefaultUpdate
979 receivepack uploadpack tagopt
980 " "$pfx" "$cur"
981 return
983 remote.*)
984 local pfx="${cur%.*}."
985 cur="${cur#*.}"
986 __gitcomp "$(__git_remotes)" "$pfx" "$cur" "."
987 return
989 esac
990 __gitcomp "
991 apply.whitespace
992 core.fileMode
993 core.gitProxy
994 core.ignoreStat
995 core.preferSymlinkRefs
996 core.logAllRefUpdates
997 core.loosecompression
998 core.repositoryFormatVersion
999 core.sharedRepository
1000 core.warnAmbiguousRefs
1001 core.compression
1002 core.packedGitWindowSize
1003 core.packedGitLimit
1004 clean.requireForce
1005 color.branch
1006 color.branch.current
1007 color.branch.local
1008 color.branch.remote
1009 color.branch.plain
1010 color.diff
1011 color.diff.plain
1012 color.diff.meta
1013 color.diff.frag
1014 color.diff.old
1015 color.diff.new
1016 color.diff.commit
1017 color.diff.whitespace
1018 color.pager
1019 color.status
1020 color.status.header
1021 color.status.added
1022 color.status.changed
1023 color.status.untracked
1024 diff.renameLimit
1025 diff.renames
1026 fetch.unpackLimit
1027 format.headers
1028 format.subjectprefix
1029 gitcvs.enabled
1030 gitcvs.logfile
1031 gitcvs.allbinary
1032 gitcvs.dbname gitcvs.dbdriver gitcvs.dbuser gitcvs.dbpass
1033 gitcvs.dbtablenameprefix
1034 gc.packrefs
1035 gc.reflogexpire
1036 gc.reflogexpireunreachable
1037 gc.rerereresolved
1038 gc.rerereunresolved
1039 http.sslVerify
1040 http.sslCert
1041 http.sslKey
1042 http.sslCAInfo
1043 http.sslCAPath
1044 http.maxRequests
1045 http.lowSpeedLimit
1046 http.lowSpeedTime
1047 http.noEPSV
1048 i18n.commitEncoding
1049 i18n.logOutputEncoding
1050 log.showroot
1051 merge.tool
1052 merge.summary
1053 merge.verbosity
1054 pack.window
1055 pack.depth
1056 pack.windowMemory
1057 pack.compression
1058 pack.deltaCacheSize
1059 pack.deltaCacheLimit
1060 pull.octopus
1061 pull.twohead
1062 repack.useDeltaBaseOffset
1063 show.difftree
1064 showbranch.default
1065 tar.umask
1066 transfer.unpackLimit
1067 receive.unpackLimit
1068 receive.denyNonFastForwards
1069 user.name
1070 user.email
1071 user.signingkey
1072 whatchanged.difftree
1073 branch. remote.
1077 _git_remote ()
1079 local subcommands="add rm show prune update"
1080 local subcommand="$(__git_find_subcommand "$subcommands")"
1081 if [ -z "$subcommand" ]; then
1082 __gitcomp "$subcommands"
1083 return
1086 case "$subcommand" in
1087 rm|show|prune)
1088 __gitcomp "$(__git_remotes)"
1090 update)
1091 local i c='' IFS=$'\n'
1092 for i in $(git --git-dir="$(__gitdir)" config --list); do
1093 case "$i" in
1094 remotes.*)
1095 i="${i#remotes.}"
1096 c="$c ${i/=*/}"
1098 esac
1099 done
1100 __gitcomp "$c"
1103 COMPREPLY=()
1105 esac
1108 _git_reset ()
1110 __git_has_doubledash && return
1112 local cur="${COMP_WORDS[COMP_CWORD]}"
1113 case "$cur" in
1114 --*)
1115 __gitcomp "--mixed --hard --soft"
1116 return
1118 esac
1119 __gitcomp "$(__git_refs)"
1122 _git_shortlog ()
1124 __git_has_doubledash && return
1126 local cur="${COMP_WORDS[COMP_CWORD]}"
1127 case "$cur" in
1128 --*)
1129 __gitcomp "
1130 --max-count= --max-age= --since= --after=
1131 --min-age= --before= --until=
1132 --no-merges
1133 --author= --committer= --grep=
1134 --all-match
1135 --not --all
1136 --numbered --summary
1138 return
1140 esac
1141 __git_complete_revlist
1144 _git_show ()
1146 local cur="${COMP_WORDS[COMP_CWORD]}"
1147 case "$cur" in
1148 --pretty=*)
1149 __gitcomp "
1150 oneline short medium full fuller email raw
1151 " "" "${cur##--pretty=}"
1152 return
1154 --*)
1155 __gitcomp "--pretty="
1156 return
1158 esac
1159 __git_complete_file
1162 _git_stash ()
1164 local subcommands='save list show apply clear drop pop create'
1165 if [ -z "$(__git_find_subcommand "$subcommands")" ]; then
1166 __gitcomp "$subcommands"
1170 _git_submodule ()
1172 __git_has_doubledash && return
1174 local subcommands="add status init update"
1175 if [ -z "$(__git_find_subcommand "$subcommands")" ]; then
1176 local cur="${COMP_WORDS[COMP_CWORD]}"
1177 case "$cur" in
1178 --*)
1179 __gitcomp "--quiet --cached"
1182 __gitcomp "$subcommands"
1184 esac
1185 return
1189 _git_svn ()
1191 local subcommands="
1192 init fetch clone rebase dcommit log find-rev
1193 set-tree commit-diff info create-ignore propget
1194 proplist show-ignore show-externals
1196 local subcommand="$(__git_find_subcommand "$subcommands")"
1197 if [ -z "$subcommand" ]; then
1198 __gitcomp "$subcommands"
1199 else
1200 local remote_opts="--username= --config-dir= --no-auth-cache"
1201 local fc_opts="
1202 --follow-parent --authors-file= --repack=
1203 --no-metadata --use-svm-props --use-svnsync-props
1204 --log-window-size= --no-checkout --quiet
1205 --repack-flags --user-log-author $remote_opts
1207 local init_opts="
1208 --template= --shared= --trunk= --tags=
1209 --branches= --stdlayout --minimize-url
1210 --no-metadata --use-svm-props --use-svnsync-props
1211 --rewrite-root= $remote_opts
1213 local cmt_opts="
1214 --edit --rmdir --find-copies-harder --copy-similarity=
1217 local cur="${COMP_WORDS[COMP_CWORD]}"
1218 case "$subcommand,$cur" in
1219 fetch,--*)
1220 __gitcomp "--revision= --fetch-all $fc_opts"
1222 clone,--*)
1223 __gitcomp "--revision= $fc_opts $init_opts"
1225 init,--*)
1226 __gitcomp "$init_opts"
1228 dcommit,--*)
1229 __gitcomp "
1230 --merge --strategy= --verbose --dry-run
1231 --fetch-all --no-rebase $cmt_opts $fc_opts
1234 set-tree,--*)
1235 __gitcomp "--stdin $cmt_opts $fc_opts"
1237 create-ignore,--*|propget,--*|proplist,--*|show-ignore,--*|\
1238 show-externals,--*)
1239 __gitcomp "--revision="
1241 log,--*)
1242 __gitcomp "
1243 --limit= --revision= --verbose --incremental
1244 --oneline --show-commit --non-recursive
1245 --authors-file=
1248 rebase,--*)
1249 __gitcomp "
1250 --merge --verbose --strategy= --local
1251 --fetch-all $fc_opts
1254 commit-diff,--*)
1255 __gitcomp "--message= --file= --revision= $cmt_opts"
1257 info,--*)
1258 __gitcomp "--url"
1261 COMPREPLY=()
1263 esac
1267 _git_tag ()
1269 local i c=1 f=0
1270 while [ $c -lt $COMP_CWORD ]; do
1271 i="${COMP_WORDS[c]}"
1272 case "$i" in
1273 -d|-v)
1274 __gitcomp "$(__git_tags)"
1275 return
1280 esac
1281 c=$((++c))
1282 done
1284 case "${COMP_WORDS[COMP_CWORD-1]}" in
1285 -m|-F)
1286 COMPREPLY=()
1288 -*|tag|git-tag)
1289 if [ $f = 1 ]; then
1290 __gitcomp "$(__git_tags)"
1291 else
1292 COMPREPLY=()
1296 __gitcomp "$(__git_refs)"
1298 esac
1301 _git ()
1303 local i c=1 command __git_dir
1305 while [ $c -lt $COMP_CWORD ]; do
1306 i="${COMP_WORDS[c]}"
1307 case "$i" in
1308 --git-dir=*) __git_dir="${i#--git-dir=}" ;;
1309 --bare) __git_dir="." ;;
1310 --version|--help|-p|--paginate) ;;
1311 *) command="$i"; break ;;
1312 esac
1313 c=$((++c))
1314 done
1316 if [ -z "$command" ]; then
1317 case "${COMP_WORDS[COMP_CWORD]}" in
1318 --*=*) COMPREPLY=() ;;
1319 --*) __gitcomp "
1320 --paginate
1321 --no-pager
1322 --git-dir=
1323 --bare
1324 --version
1325 --exec-path
1326 --work-tree=
1327 --help
1330 *) __gitcomp "$(__git_commands) $(__git_aliases)" ;;
1331 esac
1332 return
1335 local expansion=$(__git_aliased_command "$command")
1336 [ "$expansion" ] && command="$expansion"
1338 case "$command" in
1339 am) _git_am ;;
1340 add) _git_add ;;
1341 apply) _git_apply ;;
1342 bisect) _git_bisect ;;
1343 bundle) _git_bundle ;;
1344 branch) _git_branch ;;
1345 checkout) _git_checkout ;;
1346 cherry) _git_cherry ;;
1347 cherry-pick) _git_cherry_pick ;;
1348 commit) _git_commit ;;
1349 config) _git_config ;;
1350 describe) _git_describe ;;
1351 diff) _git_diff ;;
1352 fetch) _git_fetch ;;
1353 format-patch) _git_format_patch ;;
1354 gc) _git_gc ;;
1355 log) _git_log ;;
1356 ls-remote) _git_ls_remote ;;
1357 ls-tree) _git_ls_tree ;;
1358 merge) _git_merge;;
1359 merge-base) _git_merge_base ;;
1360 name-rev) _git_name_rev ;;
1361 pull) _git_pull ;;
1362 push) _git_push ;;
1363 rebase) _git_rebase ;;
1364 remote) _git_remote ;;
1365 reset) _git_reset ;;
1366 shortlog) _git_shortlog ;;
1367 show) _git_show ;;
1368 show-branch) _git_log ;;
1369 stash) _git_stash ;;
1370 submodule) _git_submodule ;;
1371 svn) _git_svn ;;
1372 tag) _git_tag ;;
1373 whatchanged) _git_log ;;
1374 *) COMPREPLY=() ;;
1375 esac
1378 _gitk ()
1380 __git_has_doubledash && return
1382 local cur="${COMP_WORDS[COMP_CWORD]}"
1383 local g="$(git rev-parse --git-dir 2>/dev/null)"
1384 local merge=""
1385 if [ -f $g/MERGE_HEAD ]; then
1386 merge="--merge"
1388 case "$cur" in
1389 --*)
1390 __gitcomp "--not --all $merge"
1391 return
1393 esac
1394 __git_complete_revlist
1397 complete -o default -o nospace -F _git git
1398 complete -o default -o nospace -F _gitk gitk
1399 complete -o default -o nospace -F _git_am git-am
1400 complete -o default -o nospace -F _git_apply git-apply
1401 complete -o default -o nospace -F _git_bisect git-bisect
1402 complete -o default -o nospace -F _git_branch git-branch
1403 complete -o default -o nospace -F _git_bundle git-bundle
1404 complete -o default -o nospace -F _git_checkout git-checkout
1405 complete -o default -o nospace -F _git_cherry git-cherry
1406 complete -o default -o nospace -F _git_cherry_pick git-cherry-pick
1407 complete -o default -o nospace -F _git_commit git-commit
1408 complete -o default -o nospace -F _git_describe git-describe
1409 complete -o default -o nospace -F _git_diff git-diff
1410 complete -o default -o nospace -F _git_fetch git-fetch
1411 complete -o default -o nospace -F _git_format_patch git-format-patch
1412 complete -o default -o nospace -F _git_gc git-gc
1413 complete -o default -o nospace -F _git_log git-log
1414 complete -o default -o nospace -F _git_ls_remote git-ls-remote
1415 complete -o default -o nospace -F _git_ls_tree git-ls-tree
1416 complete -o default -o nospace -F _git_merge git-merge
1417 complete -o default -o nospace -F _git_merge_base git-merge-base
1418 complete -o default -o nospace -F _git_name_rev git-name-rev
1419 complete -o default -o nospace -F _git_pull git-pull
1420 complete -o default -o nospace -F _git_push git-push
1421 complete -o default -o nospace -F _git_rebase git-rebase
1422 complete -o default -o nospace -F _git_config git-config
1423 complete -o default -o nospace -F _git_remote git-remote
1424 complete -o default -o nospace -F _git_reset git-reset
1425 complete -o default -o nospace -F _git_shortlog git-shortlog
1426 complete -o default -o nospace -F _git_show git-show
1427 complete -o default -o nospace -F _git_stash git-stash
1428 complete -o default -o nospace -F _git_submodule git-submodule
1429 complete -o default -o nospace -F _git_svn git-svn
1430 complete -o default -o nospace -F _git_log git-show-branch
1431 complete -o default -o nospace -F _git_tag git-tag
1432 complete -o default -o nospace -F _git_log git-whatchanged
1434 # The following are necessary only for Cygwin, and only are needed
1435 # when the user has tab-completed the executable name and consequently
1436 # included the '.exe' suffix.
1438 if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
1439 complete -o default -o nospace -F _git_add git-add.exe
1440 complete -o default -o nospace -F _git_apply git-apply.exe
1441 complete -o default -o nospace -F _git git.exe
1442 complete -o default -o nospace -F _git_branch git-branch.exe
1443 complete -o default -o nospace -F _git_bundle git-bundle.exe
1444 complete -o default -o nospace -F _git_cherry git-cherry.exe
1445 complete -o default -o nospace -F _git_describe git-describe.exe
1446 complete -o default -o nospace -F _git_diff git-diff.exe
1447 complete -o default -o nospace -F _git_format_patch git-format-patch.exe
1448 complete -o default -o nospace -F _git_log git-log.exe
1449 complete -o default -o nospace -F _git_ls_tree git-ls-tree.exe
1450 complete -o default -o nospace -F _git_merge_base git-merge-base.exe
1451 complete -o default -o nospace -F _git_name_rev git-name-rev.exe
1452 complete -o default -o nospace -F _git_push git-push.exe
1453 complete -o default -o nospace -F _git_config git-config
1454 complete -o default -o nospace -F _git_shortlog git-shortlog.exe
1455 complete -o default -o nospace -F _git_show git-show.exe
1456 complete -o default -o nospace -F _git_log git-show-branch.exe
1457 complete -o default -o nospace -F _git_tag git-tag.exe
1458 complete -o default -o nospace -F _git_log git-whatchanged.exe