Merge branch 'maint-1.6.0' into maint-1.6.1
[alt-git.git] / contrib / completion / git-completion.bash
blob3889cfb5aa20c93e6945784e48924dff3d73c391
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 git --git-dir="$dir" for-each-ref --format='%(refname:short)' \
158 refs/heads
159 return
161 for i in $(git ls-remote "$1" 2>/dev/null); do
162 case "$is_hash,$i" in
163 y,*) is_hash=n ;;
164 n,*^{}) is_hash=y ;;
165 n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;
166 n,*) is_hash=y; echo "$i" ;;
167 esac
168 done
171 __git_tags ()
173 local cmd i is_hash=y dir="$(__gitdir "$1")"
174 if [ -d "$dir" ]; then
175 git --git-dir="$dir" for-each-ref --format='%(refname:short)' \
176 refs/tags
177 return
179 for i in $(git ls-remote "$1" 2>/dev/null); do
180 case "$is_hash,$i" in
181 y,*) is_hash=n ;;
182 n,*^{}) is_hash=y ;;
183 n,refs/tags/*) is_hash=y; echo "${i#refs/tags/}" ;;
184 n,*) is_hash=y; echo "$i" ;;
185 esac
186 done
189 __git_refs ()
191 local i is_hash=y dir="$(__gitdir "$1")"
192 local cur="${COMP_WORDS[COMP_CWORD]}" format refs
193 if [ -d "$dir" ]; then
194 case "$cur" in
195 refs|refs/*)
196 format="refname"
197 refs="${cur%/*}"
200 if [ -e "$dir/HEAD" ]; then echo HEAD; fi
201 format="refname:short"
202 refs="refs/tags refs/heads refs/remotes"
204 esac
205 git --git-dir="$dir" for-each-ref --format="%($format)" \
206 $refs
207 return
209 for i in $(git ls-remote "$dir" 2>/dev/null); do
210 case "$is_hash,$i" in
211 y,*) is_hash=n ;;
212 n,*^{}) is_hash=y ;;
213 n,refs/tags/*) is_hash=y; echo "${i#refs/tags/}" ;;
214 n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;
215 n,refs/remotes/*) is_hash=y; echo "${i#refs/remotes/}" ;;
216 n,*) is_hash=y; echo "$i" ;;
217 esac
218 done
221 __git_refs2 ()
223 local i
224 for i in $(__git_refs "$1"); do
225 echo "$i:$i"
226 done
229 __git_refs_remotes ()
231 local cmd i is_hash=y
232 for i in $(git ls-remote "$1" 2>/dev/null); do
233 case "$is_hash,$i" in
234 n,refs/heads/*)
235 is_hash=y
236 echo "$i:refs/remotes/$1/${i#refs/heads/}"
238 y,*) is_hash=n ;;
239 n,*^{}) is_hash=y ;;
240 n,refs/tags/*) is_hash=y;;
241 n,*) is_hash=y; ;;
242 esac
243 done
246 __git_remotes ()
248 local i ngoff IFS=$'\n' d="$(__gitdir)"
249 shopt -q nullglob || ngoff=1
250 shopt -s nullglob
251 for i in "$d/remotes"/*; do
252 echo ${i#$d/remotes/}
253 done
254 [ "$ngoff" ] && shopt -u nullglob
255 for i in $(git --git-dir="$d" config --list); do
256 case "$i" in
257 remote.*.url=*)
258 i="${i#remote.}"
259 echo "${i/.url=*/}"
261 esac
262 done
265 __git_merge_strategies ()
267 if [ -n "$__git_merge_strategylist" ]; then
268 echo "$__git_merge_strategylist"
269 return
271 git merge -s help 2>&1 |
272 sed -n -e '/[Aa]vailable strategies are: /,/^$/{
273 s/\.$//
274 s/.*://
275 s/^[ ]*//
276 s/[ ]*$//
280 __git_merge_strategylist=
281 __git_merge_strategylist=$(__git_merge_strategies 2>/dev/null)
283 __git_complete_file ()
285 local pfx ls ref cur="${COMP_WORDS[COMP_CWORD]}"
286 case "$cur" in
287 ?*:*)
288 ref="${cur%%:*}"
289 cur="${cur#*:}"
290 case "$cur" in
291 ?*/*)
292 pfx="${cur%/*}"
293 cur="${cur##*/}"
294 ls="$ref:$pfx"
295 pfx="$pfx/"
298 ls="$ref"
300 esac
302 case "$COMP_WORDBREAKS" in
303 *:*) : great ;;
304 *) pfx="$ref:$pfx" ;;
305 esac
307 local IFS=$'\n'
308 COMPREPLY=($(compgen -P "$pfx" \
309 -W "$(git --git-dir="$(__gitdir)" ls-tree "$ls" \
310 | sed '/^100... blob /{
311 s,^.* ,,
312 s,$, ,
314 /^120000 blob /{
315 s,^.* ,,
316 s,$, ,
318 /^040000 tree /{
319 s,^.* ,,
320 s,$,/,
322 s/^.* //')" \
323 -- "$cur"))
326 __gitcomp "$(__git_refs)"
328 esac
331 __git_complete_revlist ()
333 local pfx cur="${COMP_WORDS[COMP_CWORD]}"
334 case "$cur" in
335 *...*)
336 pfx="${cur%...*}..."
337 cur="${cur#*...}"
338 __gitcomp "$(__git_refs)" "$pfx" "$cur"
340 *..*)
341 pfx="${cur%..*}.."
342 cur="${cur#*..}"
343 __gitcomp "$(__git_refs)" "$pfx" "$cur"
346 __gitcomp "$(__git_refs)"
348 esac
351 __git_all_commands ()
353 if [ -n "$__git_all_commandlist" ]; then
354 echo "$__git_all_commandlist"
355 return
357 local i IFS=" "$'\n'
358 for i in $(git help -a|egrep '^ ')
360 case $i in
361 *--*) : helper pattern;;
362 *) echo $i;;
363 esac
364 done
366 __git_all_commandlist=
367 __git_all_commandlist="$(__git_all_commands 2>/dev/null)"
369 __git_porcelain_commands ()
371 if [ -n "$__git_porcelain_commandlist" ]; then
372 echo "$__git_porcelain_commandlist"
373 return
375 local i IFS=" "$'\n'
376 for i in "help" $(__git_all_commands)
378 case $i in
379 *--*) : helper pattern;;
380 applymbox) : ask gittus;;
381 applypatch) : ask gittus;;
382 archimport) : import;;
383 cat-file) : plumbing;;
384 check-attr) : plumbing;;
385 check-ref-format) : plumbing;;
386 checkout-index) : plumbing;;
387 commit-tree) : plumbing;;
388 count-objects) : infrequent;;
389 cvsexportcommit) : export;;
390 cvsimport) : import;;
391 cvsserver) : daemon;;
392 daemon) : daemon;;
393 diff-files) : plumbing;;
394 diff-index) : plumbing;;
395 diff-tree) : plumbing;;
396 fast-import) : import;;
397 fast-export) : export;;
398 fsck-objects) : plumbing;;
399 fetch-pack) : plumbing;;
400 fmt-merge-msg) : plumbing;;
401 for-each-ref) : plumbing;;
402 hash-object) : plumbing;;
403 http-*) : transport;;
404 index-pack) : plumbing;;
405 init-db) : deprecated;;
406 local-fetch) : plumbing;;
407 lost-found) : infrequent;;
408 ls-files) : plumbing;;
409 ls-remote) : plumbing;;
410 ls-tree) : plumbing;;
411 mailinfo) : plumbing;;
412 mailsplit) : plumbing;;
413 merge-*) : plumbing;;
414 mktree) : plumbing;;
415 mktag) : plumbing;;
416 pack-objects) : plumbing;;
417 pack-redundant) : plumbing;;
418 pack-refs) : plumbing;;
419 parse-remote) : plumbing;;
420 patch-id) : plumbing;;
421 peek-remote) : plumbing;;
422 prune) : plumbing;;
423 prune-packed) : plumbing;;
424 quiltimport) : import;;
425 read-tree) : plumbing;;
426 receive-pack) : plumbing;;
427 reflog) : plumbing;;
428 repo-config) : deprecated;;
429 rerere) : plumbing;;
430 rev-list) : plumbing;;
431 rev-parse) : plumbing;;
432 runstatus) : plumbing;;
433 sh-setup) : internal;;
434 shell) : daemon;;
435 show-ref) : plumbing;;
436 send-pack) : plumbing;;
437 show-index) : plumbing;;
438 ssh-*) : transport;;
439 stripspace) : plumbing;;
440 symbolic-ref) : plumbing;;
441 tar-tree) : deprecated;;
442 unpack-file) : plumbing;;
443 unpack-objects) : plumbing;;
444 update-index) : plumbing;;
445 update-ref) : plumbing;;
446 update-server-info) : daemon;;
447 upload-archive) : plumbing;;
448 upload-pack) : plumbing;;
449 write-tree) : plumbing;;
450 var) : infrequent;;
451 verify-pack) : infrequent;;
452 verify-tag) : plumbing;;
453 *) echo $i;;
454 esac
455 done
457 __git_porcelain_commandlist=
458 __git_porcelain_commandlist="$(__git_porcelain_commands 2>/dev/null)"
460 __git_aliases ()
462 local i IFS=$'\n'
463 for i in $(git --git-dir="$(__gitdir)" config --list); do
464 case "$i" in
465 alias.*)
466 i="${i#alias.}"
467 echo "${i/=*/}"
469 esac
470 done
473 __git_aliased_command ()
475 local word cmdline=$(git --git-dir="$(__gitdir)" \
476 config --get "alias.$1")
477 for word in $cmdline; do
478 if [ "${word##-*}" ]; then
479 echo $word
480 return
482 done
485 __git_find_subcommand ()
487 local word subcommand c=1
489 while [ $c -lt $COMP_CWORD ]; do
490 word="${COMP_WORDS[c]}"
491 for subcommand in $1; do
492 if [ "$subcommand" = "$word" ]; then
493 echo "$subcommand"
494 return
496 done
497 c=$((++c))
498 done
501 __git_has_doubledash ()
503 local c=1
504 while [ $c -lt $COMP_CWORD ]; do
505 if [ "--" = "${COMP_WORDS[c]}" ]; then
506 return 0
508 c=$((++c))
509 done
510 return 1
513 __git_whitespacelist="nowarn warn error error-all fix"
515 _git_am ()
517 local cur="${COMP_WORDS[COMP_CWORD]}" dir="$(__gitdir)"
518 if [ -d "$dir"/rebase-apply ]; then
519 __gitcomp "--skip --resolved --abort"
520 return
522 case "$cur" in
523 --whitespace=*)
524 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
525 return
527 --*)
528 __gitcomp "
529 --signoff --utf8 --binary --3way --interactive
530 --whitespace=
532 return
533 esac
534 COMPREPLY=()
537 _git_apply ()
539 local cur="${COMP_WORDS[COMP_CWORD]}"
540 case "$cur" in
541 --whitespace=*)
542 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
543 return
545 --*)
546 __gitcomp "
547 --stat --numstat --summary --check --index
548 --cached --index-info --reverse --reject --unidiff-zero
549 --apply --no-add --exclude=
550 --whitespace= --inaccurate-eof --verbose
552 return
553 esac
554 COMPREPLY=()
557 _git_add ()
559 __git_has_doubledash && return
561 local cur="${COMP_WORDS[COMP_CWORD]}"
562 case "$cur" in
563 --*)
564 __gitcomp "
565 --interactive --refresh --patch --update --dry-run
566 --ignore-errors
568 return
569 esac
570 COMPREPLY=()
573 _git_archive ()
575 local cur="${COMP_WORDS[COMP_CWORD]}"
576 case "$cur" in
577 --format=*)
578 __gitcomp "$(git archive --list)" "" "${cur##--format=}"
579 return
581 --remote=*)
582 __gitcomp "$(__git_remotes)" "" "${cur##--remote=}"
583 return
585 --*)
586 __gitcomp "
587 --format= --list --verbose
588 --prefix= --remote= --exec=
590 return
592 esac
593 __git_complete_file
596 _git_bisect ()
598 __git_has_doubledash && return
600 local subcommands="start bad good skip reset visualize replay log run"
601 local subcommand="$(__git_find_subcommand "$subcommands")"
602 if [ -z "$subcommand" ]; then
603 __gitcomp "$subcommands"
604 return
607 case "$subcommand" in
608 bad|good|reset|skip)
609 __gitcomp "$(__git_refs)"
612 COMPREPLY=()
614 esac
617 _git_branch ()
619 local i c=1 only_local_ref="n" has_r="n"
621 while [ $c -lt $COMP_CWORD ]; do
622 i="${COMP_WORDS[c]}"
623 case "$i" in
624 -d|-m) only_local_ref="y" ;;
625 -r) has_r="y" ;;
626 esac
627 c=$((++c))
628 done
630 case "${COMP_WORDS[COMP_CWORD]}" in
631 --*=*) COMPREPLY=() ;;
632 --*)
633 __gitcomp "
634 --color --no-color --verbose --abbrev= --no-abbrev
635 --track --no-track --contains --merged --no-merged
639 if [ $only_local_ref = "y" -a $has_r = "n" ]; then
640 __gitcomp "$(__git_heads)"
641 else
642 __gitcomp "$(__git_refs)"
645 esac
648 _git_bundle ()
650 local cmd="${COMP_WORDS[2]}"
651 case "$COMP_CWORD" in
653 __gitcomp "create list-heads verify unbundle"
656 # looking for a file
659 case "$cmd" in
660 create)
661 __git_complete_revlist
663 esac
665 esac
668 _git_checkout ()
670 __git_has_doubledash && return
672 __gitcomp "$(__git_refs)"
675 _git_cherry ()
677 __gitcomp "$(__git_refs)"
680 _git_cherry_pick ()
682 local cur="${COMP_WORDS[COMP_CWORD]}"
683 case "$cur" in
684 --*)
685 __gitcomp "--edit --no-commit"
688 __gitcomp "$(__git_refs)"
690 esac
693 _git_clean ()
695 __git_has_doubledash && return
697 local cur="${COMP_WORDS[COMP_CWORD]}"
698 case "$cur" in
699 --*)
700 __gitcomp "--dry-run --quiet"
701 return
703 esac
704 COMPREPLY=()
707 _git_clone ()
709 local cur="${COMP_WORDS[COMP_CWORD]}"
710 case "$cur" in
711 --*)
712 __gitcomp "
713 --local
714 --no-hardlinks
715 --shared
716 --reference
717 --quiet
718 --no-checkout
719 --bare
720 --mirror
721 --origin
722 --upload-pack
723 --template=
724 --depth
726 return
728 esac
729 COMPREPLY=()
732 _git_commit ()
734 __git_has_doubledash && return
736 local cur="${COMP_WORDS[COMP_CWORD]}"
737 case "$cur" in
738 --*)
739 __gitcomp "
740 --all --author= --signoff --verify --no-verify
741 --edit --amend --include --only --interactive
743 return
744 esac
745 COMPREPLY=()
748 _git_describe ()
750 local cur="${COMP_WORDS[COMP_CWORD]}"
751 case "$cur" in
752 --*)
753 __gitcomp "
754 --all --tags --contains --abbrev= --candidates=
755 --exact-match --debug --long --match --always
757 return
758 esac
759 __gitcomp "$(__git_refs)"
762 _git_diff ()
764 __git_has_doubledash && return
766 local cur="${COMP_WORDS[COMP_CWORD]}"
767 case "$cur" in
768 --*)
769 __gitcomp "--cached --stat --numstat --shortstat --summary
770 --patch-with-stat --name-only --name-status --color
771 --no-color --color-words --no-renames --check
772 --full-index --binary --abbrev --diff-filter=
773 --find-copies-harder --pickaxe-all --pickaxe-regex
774 --text --ignore-space-at-eol --ignore-space-change
775 --ignore-all-space --exit-code --quiet --ext-diff
776 --no-ext-diff
777 --no-prefix --src-prefix= --dst-prefix=
778 --base --ours --theirs
780 return
782 esac
783 __git_complete_file
786 _git_fetch ()
788 local cur="${COMP_WORDS[COMP_CWORD]}"
790 if [ "$COMP_CWORD" = 2 ]; then
791 __gitcomp "$(__git_remotes)"
792 else
793 case "$cur" in
794 *:*)
795 local pfx=""
796 case "$COMP_WORDBREAKS" in
797 *:*) : great ;;
798 *) pfx="${cur%%:*}:" ;;
799 esac
800 __gitcomp "$(__git_refs)" "$pfx" "${cur#*:}"
803 __gitcomp "$(__git_refs2 "${COMP_WORDS[2]}")"
805 esac
809 _git_format_patch ()
811 local cur="${COMP_WORDS[COMP_CWORD]}"
812 case "$cur" in
813 --*)
814 __gitcomp "
815 --stdout --attach --thread
816 --output-directory
817 --numbered --start-number
818 --numbered-files
819 --keep-subject
820 --signoff
821 --in-reply-to=
822 --full-index --binary
823 --not --all
824 --cover-letter
825 --no-prefix --src-prefix= --dst-prefix=
827 return
829 esac
830 __git_complete_revlist
833 _git_gc ()
835 local cur="${COMP_WORDS[COMP_CWORD]}"
836 case "$cur" in
837 --*)
838 __gitcomp "--prune --aggressive"
839 return
841 esac
842 COMPREPLY=()
845 _git_grep ()
847 __git_has_doubledash && return
849 local cur="${COMP_WORDS[COMP_CWORD]}"
850 case "$cur" in
851 --*)
852 __gitcomp "
853 --cached
854 --text --ignore-case --word-regexp --invert-match
855 --full-name
856 --extended-regexp --basic-regexp --fixed-strings
857 --files-with-matches --name-only
858 --files-without-match
859 --count
860 --and --or --not --all-match
862 return
864 esac
865 COMPREPLY=()
868 _git_help ()
870 local cur="${COMP_WORDS[COMP_CWORD]}"
871 case "$cur" in
872 --*)
873 __gitcomp "--all --info --man --web"
874 return
876 esac
877 __gitcomp "$(__git_all_commands)
878 attributes cli core-tutorial cvs-migration
879 diffcore gitk glossary hooks ignore modules
880 repository-layout tutorial tutorial-2
881 workflows
885 _git_init ()
887 local cur="${COMP_WORDS[COMP_CWORD]}"
888 case "$cur" in
889 --shared=*)
890 __gitcomp "
891 false true umask group all world everybody
892 " "" "${cur##--shared=}"
893 return
895 --*)
896 __gitcomp "--quiet --bare --template= --shared --shared="
897 return
899 esac
900 COMPREPLY=()
903 _git_ls_files ()
905 __git_has_doubledash && return
907 local cur="${COMP_WORDS[COMP_CWORD]}"
908 case "$cur" in
909 --*)
910 __gitcomp "--cached --deleted --modified --others --ignored
911 --stage --directory --no-empty-directory --unmerged
912 --killed --exclude= --exclude-from=
913 --exclude-per-directory= --exclude-standard
914 --error-unmatch --with-tree= --full-name
915 --abbrev --ignored --exclude-per-directory
917 return
919 esac
920 COMPREPLY=()
923 _git_ls_remote ()
925 __gitcomp "$(__git_remotes)"
928 _git_ls_tree ()
930 __git_complete_file
933 _git_log ()
935 __git_has_doubledash && return
937 local cur="${COMP_WORDS[COMP_CWORD]}"
938 local g="$(git rev-parse --git-dir 2>/dev/null)"
939 local merge=""
940 if [ -f "$g/MERGE_HEAD" ]; then
941 merge="--merge"
943 case "$cur" in
944 --pretty=*)
945 __gitcomp "
946 oneline short medium full fuller email raw
947 " "" "${cur##--pretty=}"
948 return
950 --date=*)
951 __gitcomp "
952 relative iso8601 rfc2822 short local default
953 " "" "${cur##--date=}"
954 return
956 --*)
957 __gitcomp "
958 --max-count= --max-age= --since= --after=
959 --min-age= --before= --until=
960 --root --topo-order --date-order --reverse
961 --no-merges --follow
962 --abbrev-commit --abbrev=
963 --relative-date --date=
964 --author= --committer= --grep=
965 --all-match
966 --pretty= --name-status --name-only --raw
967 --not --all
968 --left-right --cherry-pick
969 --graph
970 --stat --numstat --shortstat
971 --decorate --diff-filter=
972 --color-words --walk-reflogs
973 --parents --children --full-history
974 $merge
976 return
978 esac
979 __git_complete_revlist
982 _git_merge ()
984 local cur="${COMP_WORDS[COMP_CWORD]}"
985 case "${COMP_WORDS[COMP_CWORD-1]}" in
986 -s|--strategy)
987 __gitcomp "$(__git_merge_strategies)"
988 return
989 esac
990 case "$cur" in
991 --strategy=*)
992 __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
993 return
995 --*)
996 __gitcomp "
997 --no-commit --no-stat --log --no-log --squash --strategy
999 return
1000 esac
1001 __gitcomp "$(__git_refs)"
1004 _git_mergetool ()
1006 local cur="${COMP_WORDS[COMP_CWORD]}"
1007 case "$cur" in
1008 --tool=*)
1009 __gitcomp "
1010 kdiff3 tkdiff meld xxdiff emerge
1011 vimdiff gvimdiff ecmerge opendiff
1012 " "" "${cur##--tool=}"
1013 return
1015 --*)
1016 __gitcomp "--tool="
1017 return
1019 esac
1020 COMPREPLY=()
1023 _git_merge_base ()
1025 __gitcomp "$(__git_refs)"
1028 _git_mv ()
1030 local cur="${COMP_WORDS[COMP_CWORD]}"
1031 case "$cur" in
1032 --*)
1033 __gitcomp "--dry-run"
1034 return
1036 esac
1037 COMPREPLY=()
1040 _git_name_rev ()
1042 __gitcomp "--tags --all --stdin"
1045 _git_pull ()
1047 local cur="${COMP_WORDS[COMP_CWORD]}"
1049 if [ "$COMP_CWORD" = 2 ]; then
1050 __gitcomp "$(__git_remotes)"
1051 else
1052 __gitcomp "$(__git_refs "${COMP_WORDS[2]}")"
1056 _git_push ()
1058 local cur="${COMP_WORDS[COMP_CWORD]}"
1060 if [ "$COMP_CWORD" = 2 ]; then
1061 __gitcomp "$(__git_remotes)"
1062 else
1063 case "$cur" in
1064 *:*)
1065 local pfx=""
1066 case "$COMP_WORDBREAKS" in
1067 *:*) : great ;;
1068 *) pfx="${cur%%:*}:" ;;
1069 esac
1071 __gitcomp "$(__git_refs "${COMP_WORDS[2]}")" "$pfx" "${cur#*:}"
1074 __gitcomp "$(__git_refs)" + "${cur#+}"
1077 __gitcomp "$(__git_refs)"
1079 esac
1083 _git_rebase ()
1085 local cur="${COMP_WORDS[COMP_CWORD]}" dir="$(__gitdir)"
1086 if [ -d "$dir"/rebase-apply ] || [ -d "$dir"/rebase-merge ]; then
1087 __gitcomp "--continue --skip --abort"
1088 return
1090 case "${COMP_WORDS[COMP_CWORD-1]}" in
1091 -s|--strategy)
1092 __gitcomp "$(__git_merge_strategies)"
1093 return
1094 esac
1095 case "$cur" in
1096 --strategy=*)
1097 __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
1098 return
1100 --*)
1101 __gitcomp "--onto --merge --strategy --interactive"
1102 return
1103 esac
1104 __gitcomp "$(__git_refs)"
1107 _git_send_email ()
1109 local cur="${COMP_WORDS[COMP_CWORD]}"
1110 case "$cur" in
1111 --*)
1112 __gitcomp "--bcc --cc --cc-cmd --chain-reply-to --compose
1113 --dry-run --envelope-sender --from --identity
1114 --in-reply-to --no-chain-reply-to --no-signed-off-by-cc
1115 --no-suppress-from --no-thread --quiet
1116 --signed-off-by-cc --smtp-pass --smtp-server
1117 --smtp-server-port --smtp-ssl --smtp-user --subject
1118 --suppress-cc --suppress-from --thread --to
1119 --validate --no-validate"
1120 return
1122 esac
1123 COMPREPLY=()
1126 _git_config ()
1128 local cur="${COMP_WORDS[COMP_CWORD]}"
1129 local prv="${COMP_WORDS[COMP_CWORD-1]}"
1130 case "$prv" in
1131 branch.*.remote)
1132 __gitcomp "$(__git_remotes)"
1133 return
1135 branch.*.merge)
1136 __gitcomp "$(__git_refs)"
1137 return
1139 remote.*.fetch)
1140 local remote="${prv#remote.}"
1141 remote="${remote%.fetch}"
1142 __gitcomp "$(__git_refs_remotes "$remote")"
1143 return
1145 remote.*.push)
1146 local remote="${prv#remote.}"
1147 remote="${remote%.push}"
1148 __gitcomp "$(git --git-dir="$(__gitdir)" \
1149 for-each-ref --format='%(refname):%(refname)' \
1150 refs/heads)"
1151 return
1153 pull.twohead|pull.octopus)
1154 __gitcomp "$(__git_merge_strategies)"
1155 return
1157 color.branch|color.diff|color.status)
1158 __gitcomp "always never auto"
1159 return
1161 color.*.*)
1162 __gitcomp "
1163 normal black red green yellow blue magenta cyan white
1164 bold dim ul blink reverse
1166 return
1168 *.*)
1169 COMPREPLY=()
1170 return
1172 esac
1173 case "$cur" in
1174 --*)
1175 __gitcomp "
1176 --global --system --file=
1177 --list --replace-all
1178 --get --get-all --get-regexp
1179 --add --unset --unset-all
1180 --remove-section --rename-section
1182 return
1184 branch.*.*)
1185 local pfx="${cur%.*}."
1186 cur="${cur##*.}"
1187 __gitcomp "remote merge mergeoptions" "$pfx" "$cur"
1188 return
1190 branch.*)
1191 local pfx="${cur%.*}."
1192 cur="${cur#*.}"
1193 __gitcomp "$(__git_heads)" "$pfx" "$cur" "."
1194 return
1196 remote.*.*)
1197 local pfx="${cur%.*}."
1198 cur="${cur##*.}"
1199 __gitcomp "
1200 url proxy fetch push mirror skipDefaultUpdate
1201 receivepack uploadpack tagopt
1202 " "$pfx" "$cur"
1203 return
1205 remote.*)
1206 local pfx="${cur%.*}."
1207 cur="${cur#*.}"
1208 __gitcomp "$(__git_remotes)" "$pfx" "$cur" "."
1209 return
1211 esac
1212 __gitcomp "
1213 apply.whitespace
1214 branch.autosetupmerge
1215 branch.autosetuprebase
1216 clean.requireForce
1217 color.branch
1218 color.branch.current
1219 color.branch.local
1220 color.branch.plain
1221 color.branch.remote
1222 color.diff
1223 color.diff.commit
1224 color.diff.frag
1225 color.diff.meta
1226 color.diff.new
1227 color.diff.old
1228 color.diff.plain
1229 color.diff.whitespace
1230 color.interactive
1231 color.interactive.header
1232 color.interactive.help
1233 color.interactive.prompt
1234 color.pager
1235 color.status
1236 color.status.added
1237 color.status.changed
1238 color.status.header
1239 color.status.nobranch
1240 color.status.untracked
1241 color.status.updated
1242 color.ui
1243 commit.template
1244 core.autocrlf
1245 core.bare
1246 core.compression
1247 core.deltaBaseCacheLimit
1248 core.editor
1249 core.excludesfile
1250 core.fileMode
1251 core.fsyncobjectfiles
1252 core.gitProxy
1253 core.ignoreCygwinFSTricks
1254 core.ignoreStat
1255 core.logAllRefUpdates
1256 core.loosecompression
1257 core.packedGitLimit
1258 core.packedGitWindowSize
1259 core.pager
1260 core.preferSymlinkRefs
1261 core.preloadindex
1262 core.quotepath
1263 core.repositoryFormatVersion
1264 core.safecrlf
1265 core.sharedRepository
1266 core.symlinks
1267 core.trustctime
1268 core.warnAmbiguousRefs
1269 core.whitespace
1270 core.worktree
1271 diff.autorefreshindex
1272 diff.external
1273 diff.mnemonicprefix
1274 diff.renameLimit
1275 diff.renameLimit.
1276 diff.renames
1277 fetch.unpackLimit
1278 format.headers
1279 format.numbered
1280 format.pretty
1281 format.suffix
1282 gc.aggressiveWindow
1283 gc.auto
1284 gc.autopacklimit
1285 gc.packrefs
1286 gc.pruneexpire
1287 gc.reflogexpire
1288 gc.reflogexpireunreachable
1289 gc.rerereresolved
1290 gc.rerereunresolved
1291 gitcvs.allbinary
1292 gitcvs.dbTableNamePrefix
1293 gitcvs.dbdriver
1294 gitcvs.dbname
1295 gitcvs.dbpass
1296 gitcvs.dbuser
1297 gitcvs.enabled
1298 gitcvs.logfile
1299 gitcvs.usecrlfattr
1300 gui.blamehistoryctx
1301 gui.commitmsgwidth
1302 gui.copyblamethreshold
1303 gui.diffcontext
1304 gui.encoding
1305 gui.fastcopyblame
1306 gui.matchtrackingbranch
1307 gui.newbranchtemplate
1308 gui.pruneduringfetch
1309 gui.spellingdictionary
1310 gui.trustmtime
1311 help.autocorrect
1312 help.browser
1313 help.format
1314 http.lowSpeedLimit
1315 http.lowSpeedTime
1316 http.maxRequests
1317 http.noEPSV
1318 http.proxy
1319 http.sslCAInfo
1320 http.sslCAPath
1321 http.sslCert
1322 http.sslKey
1323 http.sslVerify
1324 i18n.commitEncoding
1325 i18n.logOutputEncoding
1326 instaweb.browser
1327 instaweb.httpd
1328 instaweb.local
1329 instaweb.modulepath
1330 instaweb.port
1331 log.date
1332 log.showroot
1333 man.viewer
1334 merge.conflictstyle
1335 merge.log
1336 merge.renameLimit
1337 merge.stat
1338 merge.tool
1339 merge.verbosity
1340 mergetool.keepBackup
1341 pack.compression
1342 pack.deltaCacheLimit
1343 pack.deltaCacheSize
1344 pack.depth
1345 pack.indexVersion
1346 pack.packSizeLimit
1347 pack.threads
1348 pack.window
1349 pack.windowMemory
1350 pull.octopus
1351 pull.twohead
1352 receive.denyCurrentBranch
1353 receive.denyDeletes
1354 receive.denyNonFastForwards
1355 receive.fsckObjects
1356 receive.unpackLimit
1357 repack.usedeltabaseoffset
1358 rerere.autoupdate
1359 rerere.enabled
1360 showbranch.default
1361 status.relativePaths
1362 status.showUntrackedFiles
1363 tar.umask
1364 transfer.unpackLimit
1365 user.email
1366 user.name
1367 user.signingkey
1368 web.browser
1369 branch. remote.
1373 _git_remote ()
1375 local subcommands="add rm show prune update"
1376 local subcommand="$(__git_find_subcommand "$subcommands")"
1377 if [ -z "$subcommand" ]; then
1378 __gitcomp "$subcommands"
1379 return
1382 case "$subcommand" in
1383 rm|show|prune)
1384 __gitcomp "$(__git_remotes)"
1386 update)
1387 local i c='' IFS=$'\n'
1388 for i in $(git --git-dir="$(__gitdir)" config --list); do
1389 case "$i" in
1390 remotes.*)
1391 i="${i#remotes.}"
1392 c="$c ${i/=*/}"
1394 esac
1395 done
1396 __gitcomp "$c"
1399 COMPREPLY=()
1401 esac
1404 _git_reset ()
1406 __git_has_doubledash && return
1408 local cur="${COMP_WORDS[COMP_CWORD]}"
1409 case "$cur" in
1410 --*)
1411 __gitcomp "--mixed --hard --soft"
1412 return
1414 esac
1415 __gitcomp "$(__git_refs)"
1418 _git_revert ()
1420 local cur="${COMP_WORDS[COMP_CWORD]}"
1421 case "$cur" in
1422 --*)
1423 __gitcomp "--edit --mainline --no-edit --no-commit --signoff"
1424 return
1426 esac
1427 __gitcomp "$(__git_refs)"
1430 _git_rm ()
1432 __git_has_doubledash && return
1434 local cur="${COMP_WORDS[COMP_CWORD]}"
1435 case "$cur" in
1436 --*)
1437 __gitcomp "--cached --dry-run --ignore-unmatch --quiet"
1438 return
1440 esac
1441 COMPREPLY=()
1444 _git_shortlog ()
1446 __git_has_doubledash && return
1448 local cur="${COMP_WORDS[COMP_CWORD]}"
1449 case "$cur" in
1450 --*)
1451 __gitcomp "
1452 --max-count= --max-age= --since= --after=
1453 --min-age= --before= --until=
1454 --no-merges
1455 --author= --committer= --grep=
1456 --all-match
1457 --not --all
1458 --numbered --summary
1460 return
1462 esac
1463 __git_complete_revlist
1466 _git_show ()
1468 __git_has_doubledash && return
1470 local cur="${COMP_WORDS[COMP_CWORD]}"
1471 case "$cur" in
1472 --pretty=*)
1473 __gitcomp "
1474 oneline short medium full fuller email raw
1475 " "" "${cur##--pretty=}"
1476 return
1478 --*)
1479 __gitcomp "--pretty="
1480 return
1482 esac
1483 __git_complete_file
1486 _git_show_branch ()
1488 local cur="${COMP_WORDS[COMP_CWORD]}"
1489 case "$cur" in
1490 --*)
1491 __gitcomp "
1492 --all --remotes --topo-order --current --more=
1493 --list --independent --merge-base --no-name
1494 --sha1-name --topics --reflog
1496 return
1498 esac
1499 __git_complete_revlist
1502 _git_stash ()
1504 local subcommands='save list show apply clear drop pop create branch'
1505 local subcommand="$(__git_find_subcommand "$subcommands")"
1506 if [ -z "$subcommand" ]; then
1507 __gitcomp "$subcommands"
1508 else
1509 local cur="${COMP_WORDS[COMP_CWORD]}"
1510 case "$subcommand,$cur" in
1511 save,--*)
1512 __gitcomp "--keep-index"
1514 apply,--*)
1515 __gitcomp "--index"
1517 show,--*|drop,--*|pop,--*|branch,--*)
1518 COMPREPLY=()
1520 show,*|apply,*|drop,*|pop,*|branch,*)
1521 __gitcomp "$(git --git-dir="$(__gitdir)" stash list \
1522 | sed -n -e 's/:.*//p')"
1525 COMPREPLY=()
1527 esac
1531 _git_submodule ()
1533 __git_has_doubledash && return
1535 local subcommands="add status init update summary foreach sync"
1536 if [ -z "$(__git_find_subcommand "$subcommands")" ]; then
1537 local cur="${COMP_WORDS[COMP_CWORD]}"
1538 case "$cur" in
1539 --*)
1540 __gitcomp "--quiet --cached"
1543 __gitcomp "$subcommands"
1545 esac
1546 return
1550 _git_svn ()
1552 local subcommands="
1553 init fetch clone rebase dcommit log find-rev
1554 set-tree commit-diff info create-ignore propget
1555 proplist show-ignore show-externals
1557 local subcommand="$(__git_find_subcommand "$subcommands")"
1558 if [ -z "$subcommand" ]; then
1559 __gitcomp "$subcommands"
1560 else
1561 local remote_opts="--username= --config-dir= --no-auth-cache"
1562 local fc_opts="
1563 --follow-parent --authors-file= --repack=
1564 --no-metadata --use-svm-props --use-svnsync-props
1565 --log-window-size= --no-checkout --quiet
1566 --repack-flags --user-log-author $remote_opts
1568 local init_opts="
1569 --template= --shared= --trunk= --tags=
1570 --branches= --stdlayout --minimize-url
1571 --no-metadata --use-svm-props --use-svnsync-props
1572 --rewrite-root= $remote_opts
1574 local cmt_opts="
1575 --edit --rmdir --find-copies-harder --copy-similarity=
1578 local cur="${COMP_WORDS[COMP_CWORD]}"
1579 case "$subcommand,$cur" in
1580 fetch,--*)
1581 __gitcomp "--revision= --fetch-all $fc_opts"
1583 clone,--*)
1584 __gitcomp "--revision= $fc_opts $init_opts"
1586 init,--*)
1587 __gitcomp "$init_opts"
1589 dcommit,--*)
1590 __gitcomp "
1591 --merge --strategy= --verbose --dry-run
1592 --fetch-all --no-rebase $cmt_opts $fc_opts
1595 set-tree,--*)
1596 __gitcomp "--stdin $cmt_opts $fc_opts"
1598 create-ignore,--*|propget,--*|proplist,--*|show-ignore,--*|\
1599 show-externals,--*)
1600 __gitcomp "--revision="
1602 log,--*)
1603 __gitcomp "
1604 --limit= --revision= --verbose --incremental
1605 --oneline --show-commit --non-recursive
1606 --authors-file=
1609 rebase,--*)
1610 __gitcomp "
1611 --merge --verbose --strategy= --local
1612 --fetch-all $fc_opts
1615 commit-diff,--*)
1616 __gitcomp "--message= --file= --revision= $cmt_opts"
1618 info,--*)
1619 __gitcomp "--url"
1622 COMPREPLY=()
1624 esac
1628 _git_tag ()
1630 local i c=1 f=0
1631 while [ $c -lt $COMP_CWORD ]; do
1632 i="${COMP_WORDS[c]}"
1633 case "$i" in
1634 -d|-v)
1635 __gitcomp "$(__git_tags)"
1636 return
1641 esac
1642 c=$((++c))
1643 done
1645 case "${COMP_WORDS[COMP_CWORD-1]}" in
1646 -m|-F)
1647 COMPREPLY=()
1649 -*|tag)
1650 if [ $f = 1 ]; then
1651 __gitcomp "$(__git_tags)"
1652 else
1653 COMPREPLY=()
1657 __gitcomp "$(__git_refs)"
1659 esac
1662 _git ()
1664 local i c=1 command __git_dir
1666 while [ $c -lt $COMP_CWORD ]; do
1667 i="${COMP_WORDS[c]}"
1668 case "$i" in
1669 --git-dir=*) __git_dir="${i#--git-dir=}" ;;
1670 --bare) __git_dir="." ;;
1671 --version|-p|--paginate) ;;
1672 --help) command="help"; break ;;
1673 *) command="$i"; break ;;
1674 esac
1675 c=$((++c))
1676 done
1678 if [ -z "$command" ]; then
1679 case "${COMP_WORDS[COMP_CWORD]}" in
1680 --*=*) COMPREPLY=() ;;
1681 --*) __gitcomp "
1682 --paginate
1683 --no-pager
1684 --git-dir=
1685 --bare
1686 --version
1687 --exec-path
1688 --work-tree=
1689 --help
1692 *) __gitcomp "$(__git_porcelain_commands) $(__git_aliases)" ;;
1693 esac
1694 return
1697 local expansion=$(__git_aliased_command "$command")
1698 [ "$expansion" ] && command="$expansion"
1700 case "$command" in
1701 am) _git_am ;;
1702 add) _git_add ;;
1703 apply) _git_apply ;;
1704 archive) _git_archive ;;
1705 bisect) _git_bisect ;;
1706 bundle) _git_bundle ;;
1707 branch) _git_branch ;;
1708 checkout) _git_checkout ;;
1709 cherry) _git_cherry ;;
1710 cherry-pick) _git_cherry_pick ;;
1711 clean) _git_clean ;;
1712 clone) _git_clone ;;
1713 commit) _git_commit ;;
1714 config) _git_config ;;
1715 describe) _git_describe ;;
1716 diff) _git_diff ;;
1717 fetch) _git_fetch ;;
1718 format-patch) _git_format_patch ;;
1719 gc) _git_gc ;;
1720 grep) _git_grep ;;
1721 help) _git_help ;;
1722 init) _git_init ;;
1723 log) _git_log ;;
1724 ls-files) _git_ls_files ;;
1725 ls-remote) _git_ls_remote ;;
1726 ls-tree) _git_ls_tree ;;
1727 merge) _git_merge;;
1728 mergetool) _git_mergetool;;
1729 merge-base) _git_merge_base ;;
1730 mv) _git_mv ;;
1731 name-rev) _git_name_rev ;;
1732 pull) _git_pull ;;
1733 push) _git_push ;;
1734 rebase) _git_rebase ;;
1735 remote) _git_remote ;;
1736 reset) _git_reset ;;
1737 revert) _git_revert ;;
1738 rm) _git_rm ;;
1739 send-email) _git_send_email ;;
1740 shortlog) _git_shortlog ;;
1741 show) _git_show ;;
1742 show-branch) _git_show_branch ;;
1743 stash) _git_stash ;;
1744 submodule) _git_submodule ;;
1745 svn) _git_svn ;;
1746 tag) _git_tag ;;
1747 whatchanged) _git_log ;;
1748 *) COMPREPLY=() ;;
1749 esac
1752 _gitk ()
1754 __git_has_doubledash && return
1756 local cur="${COMP_WORDS[COMP_CWORD]}"
1757 local g="$(git rev-parse --git-dir 2>/dev/null)"
1758 local merge=""
1759 if [ -f "$g/MERGE_HEAD" ]; then
1760 merge="--merge"
1762 case "$cur" in
1763 --*)
1764 __gitcomp "--not --all $merge"
1765 return
1767 esac
1768 __git_complete_revlist
1771 complete -o default -o nospace -F _git git
1772 complete -o default -o nospace -F _gitk gitk
1774 # The following are necessary only for Cygwin, and only are needed
1775 # when the user has tab-completed the executable name and consequently
1776 # included the '.exe' suffix.
1778 if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
1779 complete -o default -o nospace -F _git git.exe