bash completion: Add completion for 'git mergetool'
[git/dscho.git] / contrib / completion / git-completion.bash
blob2f8036d1d914ea54e4eabae3afbdca5f4a06ab43
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_all_commands ()
354 if [ -n "$__git_all_commandlist" ]; then
355 echo "$__git_all_commandlist"
356 return
358 local i IFS=" "$'\n'
359 for i in $(git help -a|egrep '^ ')
361 case $i in
362 *--*) : helper pattern;;
363 *) echo $i;;
364 esac
365 done
367 __git_all_commandlist=
368 __git_all_commandlist="$(__git_all_commands 2>/dev/null)"
370 __git_porcelain_commands ()
372 if [ -n "$__git_porcelain_commandlist" ]; then
373 echo "$__git_porcelain_commandlist"
374 return
376 local i IFS=" "$'\n'
377 for i in "help" $(__git_all_commands)
379 case $i in
380 *--*) : helper pattern;;
381 applymbox) : ask gittus;;
382 applypatch) : ask gittus;;
383 archimport) : import;;
384 cat-file) : plumbing;;
385 check-attr) : plumbing;;
386 check-ref-format) : plumbing;;
387 commit-tree) : plumbing;;
388 cvsexportcommit) : export;;
389 cvsimport) : import;;
390 cvsserver) : daemon;;
391 daemon) : daemon;;
392 diff-files) : plumbing;;
393 diff-index) : plumbing;;
394 diff-tree) : plumbing;;
395 fast-import) : import;;
396 fsck-objects) : plumbing;;
397 fetch-pack) : plumbing;;
398 fmt-merge-msg) : plumbing;;
399 for-each-ref) : plumbing;;
400 hash-object) : plumbing;;
401 http-*) : transport;;
402 index-pack) : plumbing;;
403 init-db) : deprecated;;
404 local-fetch) : plumbing;;
405 mailinfo) : plumbing;;
406 mailsplit) : plumbing;;
407 merge-*) : plumbing;;
408 mktree) : plumbing;;
409 mktag) : plumbing;;
410 pack-objects) : plumbing;;
411 pack-redundant) : plumbing;;
412 pack-refs) : plumbing;;
413 parse-remote) : plumbing;;
414 patch-id) : plumbing;;
415 peek-remote) : plumbing;;
416 prune) : plumbing;;
417 prune-packed) : plumbing;;
418 quiltimport) : import;;
419 read-tree) : plumbing;;
420 receive-pack) : plumbing;;
421 reflog) : plumbing;;
422 repo-config) : deprecated;;
423 rerere) : plumbing;;
424 rev-list) : plumbing;;
425 rev-parse) : plumbing;;
426 runstatus) : plumbing;;
427 sh-setup) : internal;;
428 shell) : daemon;;
429 send-pack) : plumbing;;
430 show-index) : plumbing;;
431 ssh-*) : transport;;
432 stripspace) : plumbing;;
433 symbolic-ref) : plumbing;;
434 tar-tree) : deprecated;;
435 unpack-file) : plumbing;;
436 unpack-objects) : plumbing;;
437 update-index) : plumbing;;
438 update-ref) : plumbing;;
439 update-server-info) : daemon;;
440 upload-archive) : plumbing;;
441 upload-pack) : plumbing;;
442 write-tree) : plumbing;;
443 verify-tag) : plumbing;;
444 *) echo $i;;
445 esac
446 done
448 __git_porcelain_commandlist=
449 __git_porcelain_commandlist="$(__git_porcelain_commands 2>/dev/null)"
451 __git_aliases ()
453 local i IFS=$'\n'
454 for i in $(git --git-dir="$(__gitdir)" config --list); do
455 case "$i" in
456 alias.*)
457 i="${i#alias.}"
458 echo "${i/=*/}"
460 esac
461 done
464 __git_aliased_command ()
466 local word cmdline=$(git --git-dir="$(__gitdir)" \
467 config --get "alias.$1")
468 for word in $cmdline; do
469 if [ "${word##-*}" ]; then
470 echo $word
471 return
473 done
476 __git_find_subcommand ()
478 local word subcommand c=1
480 while [ $c -lt $COMP_CWORD ]; do
481 word="${COMP_WORDS[c]}"
482 for subcommand in $1; do
483 if [ "$subcommand" = "$word" ]; then
484 echo "$subcommand"
485 return
487 done
488 c=$((++c))
489 done
492 __git_has_doubledash ()
494 local c=1
495 while [ $c -lt $COMP_CWORD ]; do
496 if [ "--" = "${COMP_WORDS[c]}" ]; then
497 return 0
499 c=$((++c))
500 done
501 return 1
504 __git_whitespacelist="nowarn warn error error-all fix"
506 _git_am ()
508 local cur="${COMP_WORDS[COMP_CWORD]}" dir="$(__gitdir)"
509 if [ -d "$dir"/rebase-apply ]; then
510 __gitcomp "--skip --resolved --abort"
511 return
513 case "$cur" in
514 --whitespace=*)
515 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
516 return
518 --*)
519 __gitcomp "
520 --signoff --utf8 --binary --3way --interactive
521 --whitespace=
523 return
524 esac
525 COMPREPLY=()
528 _git_apply ()
530 local cur="${COMP_WORDS[COMP_CWORD]}"
531 case "$cur" in
532 --whitespace=*)
533 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
534 return
536 --*)
537 __gitcomp "
538 --stat --numstat --summary --check --index
539 --cached --index-info --reverse --reject --unidiff-zero
540 --apply --no-add --exclude=
541 --whitespace= --inaccurate-eof --verbose
543 return
544 esac
545 COMPREPLY=()
548 _git_add ()
550 __git_has_doubledash && return
552 local cur="${COMP_WORDS[COMP_CWORD]}"
553 case "$cur" in
554 --*)
555 __gitcomp "
556 --interactive --refresh --patch --update --dry-run
557 --ignore-errors
559 return
560 esac
561 COMPREPLY=()
564 _git_archive ()
566 local cur="${COMP_WORDS[COMP_CWORD]}"
567 case "$cur" in
568 --format=*)
569 __gitcomp "$(git archive --list)" "" "${cur##--format=}"
570 return
572 --remote=*)
573 __gitcomp "$(__git_remotes)" "" "${cur##--remote=}"
574 return
576 --*)
577 __gitcomp "
578 --format= --list --verbose
579 --prefix= --remote= --exec=
581 return
583 esac
584 __git_complete_file
587 _git_bisect ()
589 __git_has_doubledash && return
591 local subcommands="start bad good skip reset visualize replay log run"
592 local subcommand="$(__git_find_subcommand "$subcommands")"
593 if [ -z "$subcommand" ]; then
594 __gitcomp "$subcommands"
595 return
598 case "$subcommand" in
599 bad|good|reset|skip)
600 __gitcomp "$(__git_refs)"
603 COMPREPLY=()
605 esac
608 _git_branch ()
610 local i c=1 only_local_ref="n" has_r="n"
612 while [ $c -lt $COMP_CWORD ]; do
613 i="${COMP_WORDS[c]}"
614 case "$i" in
615 -d|-m) only_local_ref="y" ;;
616 -r) has_r="y" ;;
617 esac
618 c=$((++c))
619 done
621 case "${COMP_WORDS[COMP_CWORD]}" in
622 --*=*) COMPREPLY=() ;;
623 --*)
624 __gitcomp "
625 --color --no-color --verbose --abbrev= --no-abbrev
626 --track --no-track --contains --merged --no-merged
630 if [ $only_local_ref = "y" -a $has_r = "n" ]; then
631 __gitcomp "$(__git_heads)"
632 else
633 __gitcomp "$(__git_refs)"
636 esac
639 _git_bundle ()
641 local mycword="$COMP_CWORD"
642 case "${COMP_WORDS[0]}" in
643 git)
644 local cmd="${COMP_WORDS[2]}"
645 mycword="$((mycword-1))"
647 git-bundle*)
648 local cmd="${COMP_WORDS[1]}"
650 esac
651 case "$mycword" 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
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 case "${COMP_WORDS[0]},$COMP_CWORD" in
791 git-fetch*,1)
792 __gitcomp "$(__git_remotes)"
794 git,2)
795 __gitcomp "$(__git_remotes)"
798 case "$cur" in
799 *:*)
800 local pfx=""
801 case "$COMP_WORDBREAKS" in
802 *:*) : great ;;
803 *) pfx="${cur%%:*}:" ;;
804 esac
805 __gitcomp "$(__git_refs)" "$pfx" "${cur#*:}"
808 local remote
809 case "${COMP_WORDS[0]}" in
810 git-fetch) remote="${COMP_WORDS[1]}" ;;
811 git) remote="${COMP_WORDS[2]}" ;;
812 esac
813 __gitcomp "$(__git_refs2 "$remote")"
815 esac
817 esac
820 _git_format_patch ()
822 local cur="${COMP_WORDS[COMP_CWORD]}"
823 case "$cur" in
824 --*)
825 __gitcomp "
826 --stdout --attach --thread
827 --output-directory
828 --numbered --start-number
829 --numbered-files
830 --keep-subject
831 --signoff
832 --in-reply-to=
833 --full-index --binary
834 --not --all
835 --cover-letter
836 --no-prefix --src-prefix= --dst-prefix=
838 return
840 esac
841 __git_complete_revlist
844 _git_gc ()
846 local cur="${COMP_WORDS[COMP_CWORD]}"
847 case "$cur" in
848 --*)
849 __gitcomp "--prune --aggressive"
850 return
852 esac
853 COMPREPLY=()
856 _git_grep ()
858 __git_has_doubledash && return
860 local cur="${COMP_WORDS[COMP_CWORD]}"
861 case "$cur" in
862 --*)
863 __gitcomp "
864 --cached
865 --text --ignore-case --word-regexp --invert-match
866 --full-name
867 --extended-regexp --basic-regexp --fixed-strings
868 --files-with-matches --name-only
869 --files-without-match
870 --count
871 --and --or --not --all-match
873 return
875 esac
876 COMPREPLY=()
879 _git_help ()
881 local cur="${COMP_WORDS[COMP_CWORD]}"
882 case "$cur" in
883 --*)
884 __gitcomp "--all --info --man --web"
885 return
887 esac
888 __gitcomp "$(__git_all_commands)"
891 _git_init ()
893 local cur="${COMP_WORDS[COMP_CWORD]}"
894 case "$cur" in
895 --shared=*)
896 __gitcomp "
897 false true umask group all world everybody
898 " "" "${cur##--shared=}"
899 return
901 --*)
902 __gitcomp "--quiet --bare --template= --shared --shared="
903 return
905 esac
906 COMPREPLY=()
909 _git_ls_files ()
911 __git_has_doubledash && return
913 local cur="${COMP_WORDS[COMP_CWORD]}"
914 case "$cur" in
915 --*)
916 __gitcomp "--cached --deleted --modified --others --ignored
917 --stage --directory --no-empty-directory --unmerged
918 --killed --exclude= --exclude-from=
919 --exclude-per-directory= --exclude-standard
920 --error-unmatch --with-tree= --full-name
921 --abbrev --ignored --exclude-per-directory
923 return
925 esac
926 COMPREPLY=()
929 _git_ls_remote ()
931 __gitcomp "$(__git_remotes)"
934 _git_ls_tree ()
936 __git_complete_file
939 _git_log ()
941 __git_has_doubledash && return
943 local cur="${COMP_WORDS[COMP_CWORD]}"
944 case "$cur" in
945 --pretty=*)
946 __gitcomp "
947 oneline short medium full fuller email raw
948 " "" "${cur##--pretty=}"
949 return
951 --date=*)
952 __gitcomp "
953 relative iso8601 rfc2822 short local default
954 " "" "${cur##--date=}"
955 return
957 --*)
958 __gitcomp "
959 --max-count= --max-age= --since= --after=
960 --min-age= --before= --until=
961 --root --topo-order --date-order --reverse
962 --no-merges --follow
963 --abbrev-commit --abbrev=
964 --relative-date --date=
965 --author= --committer= --grep=
966 --all-match
967 --pretty= --name-status --name-only --raw
968 --not --all
969 --left-right --cherry-pick
970 --graph
971 --stat --numstat --shortstat
972 --decorate --diff-filter=
973 --color-words --walk-reflogs
974 --parents --children --full-history
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 case "${COMP_WORDS[0]},$COMP_CWORD" in
1050 git-pull*,1)
1051 __gitcomp "$(__git_remotes)"
1053 git,2)
1054 __gitcomp "$(__git_remotes)"
1057 local remote
1058 case "${COMP_WORDS[0]}" in
1059 git-pull) remote="${COMP_WORDS[1]}" ;;
1060 git) remote="${COMP_WORDS[2]}" ;;
1061 esac
1062 __gitcomp "$(__git_refs "$remote")"
1064 esac
1067 _git_push ()
1069 local cur="${COMP_WORDS[COMP_CWORD]}"
1071 case "${COMP_WORDS[0]},$COMP_CWORD" in
1072 git-push*,1)
1073 __gitcomp "$(__git_remotes)"
1075 git,2)
1076 __gitcomp "$(__git_remotes)"
1079 case "$cur" in
1080 *:*)
1081 local remote
1082 case "${COMP_WORDS[0]}" in
1083 git-push) remote="${COMP_WORDS[1]}" ;;
1084 git) remote="${COMP_WORDS[2]}" ;;
1085 esac
1087 local pfx=""
1088 case "$COMP_WORDBREAKS" in
1089 *:*) : great ;;
1090 *) pfx="${cur%%:*}:" ;;
1091 esac
1093 __gitcomp "$(__git_refs "$remote")" "$pfx" "${cur#*:}"
1096 __gitcomp "$(__git_refs)" + "${cur#+}"
1099 __gitcomp "$(__git_refs)"
1101 esac
1103 esac
1106 _git_rebase ()
1108 local cur="${COMP_WORDS[COMP_CWORD]}" dir="$(__gitdir)"
1109 if [ -d "$dir"/rebase-apply ] || [ -d "$dir"/rebase-merge ]; then
1110 __gitcomp "--continue --skip --abort"
1111 return
1113 case "${COMP_WORDS[COMP_CWORD-1]}" in
1114 -s|--strategy)
1115 __gitcomp "$(__git_merge_strategies)"
1116 return
1117 esac
1118 case "$cur" in
1119 --strategy=*)
1120 __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
1121 return
1123 --*)
1124 __gitcomp "--onto --merge --strategy --interactive"
1125 return
1126 esac
1127 __gitcomp "$(__git_refs)"
1130 _git_send_email ()
1132 local cur="${COMP_WORDS[COMP_CWORD]}"
1133 case "$cur" in
1134 --*)
1135 __gitcomp "--bcc --cc --cc-cmd --chain-reply-to --compose
1136 --dry-run --envelope-sender --from --identity
1137 --in-reply-to --no-chain-reply-to --no-signed-off-by-cc
1138 --no-suppress-from --no-thread --quiet
1139 --signed-off-by-cc --smtp-pass --smtp-server
1140 --smtp-server-port --smtp-ssl --smtp-user --subject
1141 --suppress-cc --suppress-from --thread --to"
1142 return
1144 esac
1145 COMPREPLY=()
1148 _git_config ()
1150 local cur="${COMP_WORDS[COMP_CWORD]}"
1151 local prv="${COMP_WORDS[COMP_CWORD-1]}"
1152 case "$prv" in
1153 branch.*.remote)
1154 __gitcomp "$(__git_remotes)"
1155 return
1157 branch.*.merge)
1158 __gitcomp "$(__git_refs)"
1159 return
1161 remote.*.fetch)
1162 local remote="${prv#remote.}"
1163 remote="${remote%.fetch}"
1164 __gitcomp "$(__git_refs_remotes "$remote")"
1165 return
1167 remote.*.push)
1168 local remote="${prv#remote.}"
1169 remote="${remote%.push}"
1170 __gitcomp "$(git --git-dir="$(__gitdir)" \
1171 for-each-ref --format='%(refname):%(refname)' \
1172 refs/heads)"
1173 return
1175 pull.twohead|pull.octopus)
1176 __gitcomp "$(__git_merge_strategies)"
1177 return
1179 color.branch|color.diff|color.status)
1180 __gitcomp "always never auto"
1181 return
1183 color.*.*)
1184 __gitcomp "
1185 black red green yellow blue magenta cyan white
1186 bold dim ul blink reverse
1188 return
1190 *.*)
1191 COMPREPLY=()
1192 return
1194 esac
1195 case "$cur" in
1196 --*)
1197 __gitcomp "
1198 --global --system --file=
1199 --list --replace-all
1200 --get --get-all --get-regexp
1201 --add --unset --unset-all
1202 --remove-section --rename-section
1204 return
1206 branch.*.*)
1207 local pfx="${cur%.*}."
1208 cur="${cur##*.}"
1209 __gitcomp "remote merge" "$pfx" "$cur"
1210 return
1212 branch.*)
1213 local pfx="${cur%.*}."
1214 cur="${cur#*.}"
1215 __gitcomp "$(__git_heads)" "$pfx" "$cur" "."
1216 return
1218 remote.*.*)
1219 local pfx="${cur%.*}."
1220 cur="${cur##*.}"
1221 __gitcomp "
1222 url fetch push skipDefaultUpdate
1223 receivepack uploadpack tagopt
1224 " "$pfx" "$cur"
1225 return
1227 remote.*)
1228 local pfx="${cur%.*}."
1229 cur="${cur#*.}"
1230 __gitcomp "$(__git_remotes)" "$pfx" "$cur" "."
1231 return
1233 esac
1234 __gitcomp "
1235 apply.whitespace
1236 core.fileMode
1237 core.gitProxy
1238 core.ignoreStat
1239 core.preferSymlinkRefs
1240 core.logAllRefUpdates
1241 core.loosecompression
1242 core.repositoryFormatVersion
1243 core.sharedRepository
1244 core.warnAmbiguousRefs
1245 core.compression
1246 core.packedGitWindowSize
1247 core.packedGitLimit
1248 clean.requireForce
1249 color.branch
1250 color.branch.current
1251 color.branch.local
1252 color.branch.remote
1253 color.branch.plain
1254 color.diff
1255 color.diff.plain
1256 color.diff.meta
1257 color.diff.frag
1258 color.diff.old
1259 color.diff.new
1260 color.diff.commit
1261 color.diff.whitespace
1262 color.pager
1263 color.status
1264 color.status.header
1265 color.status.added
1266 color.status.changed
1267 color.status.untracked
1268 diff.renameLimit
1269 diff.renames
1270 fetch.unpackLimit
1271 format.headers
1272 format.subjectprefix
1273 gitcvs.enabled
1274 gitcvs.logfile
1275 gitcvs.allbinary
1276 gitcvs.dbname gitcvs.dbdriver gitcvs.dbuser gitcvs.dbpass
1277 gitcvs.dbtablenameprefix
1278 gc.packrefs
1279 gc.reflogexpire
1280 gc.reflogexpireunreachable
1281 gc.rerereresolved
1282 gc.rerereunresolved
1283 http.sslVerify
1284 http.sslCert
1285 http.sslKey
1286 http.sslCAInfo
1287 http.sslCAPath
1288 http.maxRequests
1289 http.lowSpeedLimit
1290 http.lowSpeedTime
1291 http.noEPSV
1292 i18n.commitEncoding
1293 i18n.logOutputEncoding
1294 log.showroot
1295 merge.tool
1296 merge.summary
1297 merge.verbosity
1298 pack.window
1299 pack.depth
1300 pack.windowMemory
1301 pack.compression
1302 pack.deltaCacheSize
1303 pack.deltaCacheLimit
1304 pull.octopus
1305 pull.twohead
1306 repack.useDeltaBaseOffset
1307 showbranch.default
1308 tar.umask
1309 transfer.unpackLimit
1310 receive.unpackLimit
1311 receive.denyNonFastForwards
1312 user.name
1313 user.email
1314 user.signingkey
1315 branch. remote.
1319 _git_remote ()
1321 local subcommands="add rm show prune update"
1322 local subcommand="$(__git_find_subcommand "$subcommands")"
1323 if [ -z "$subcommand" ]; then
1324 __gitcomp "$subcommands"
1325 return
1328 case "$subcommand" in
1329 rm|show|prune)
1330 __gitcomp "$(__git_remotes)"
1332 update)
1333 local i c='' IFS=$'\n'
1334 for i in $(git --git-dir="$(__gitdir)" config --list); do
1335 case "$i" in
1336 remotes.*)
1337 i="${i#remotes.}"
1338 c="$c ${i/=*/}"
1340 esac
1341 done
1342 __gitcomp "$c"
1345 COMPREPLY=()
1347 esac
1350 _git_reset ()
1352 __git_has_doubledash && return
1354 local cur="${COMP_WORDS[COMP_CWORD]}"
1355 case "$cur" in
1356 --*)
1357 __gitcomp "--mixed --hard --soft"
1358 return
1360 esac
1361 __gitcomp "$(__git_refs)"
1364 _git_revert ()
1366 local cur="${COMP_WORDS[COMP_CWORD]}"
1367 case "$cur" in
1368 --*)
1369 __gitcomp "--edit --mainline --no-edit --no-commit --signoff"
1370 return
1372 esac
1373 COMPREPLY=()
1376 _git_rm ()
1378 __git_has_doubledash && return
1380 local cur="${COMP_WORDS[COMP_CWORD]}"
1381 case "$cur" in
1382 --*)
1383 __gitcomp "--cached --dry-run --ignore-unmatch --quiet"
1384 return
1386 esac
1387 COMPREPLY=()
1390 _git_shortlog ()
1392 __git_has_doubledash && return
1394 local cur="${COMP_WORDS[COMP_CWORD]}"
1395 case "$cur" in
1396 --*)
1397 __gitcomp "
1398 --max-count= --max-age= --since= --after=
1399 --min-age= --before= --until=
1400 --no-merges
1401 --author= --committer= --grep=
1402 --all-match
1403 --not --all
1404 --numbered --summary
1406 return
1408 esac
1409 __git_complete_revlist
1412 _git_show ()
1414 local cur="${COMP_WORDS[COMP_CWORD]}"
1415 case "$cur" in
1416 --pretty=*)
1417 __gitcomp "
1418 oneline short medium full fuller email raw
1419 " "" "${cur##--pretty=}"
1420 return
1422 --*)
1423 __gitcomp "--pretty="
1424 return
1426 esac
1427 __git_complete_file
1430 _git_show_branch ()
1432 local cur="${COMP_WORDS[COMP_CWORD]}"
1433 case "$cur" in
1434 --*)
1435 __gitcomp "
1436 --all --remotes --topo-order --current --more=
1437 --list --independent --merge-base --no-name
1438 --sha1-name --topics --reflog
1440 return
1442 esac
1443 __git_complete_revlist
1446 _git_stash ()
1448 local subcommands='save list show apply clear drop pop create branch'
1449 local subcommand="$(__git_find_subcommand "$subcommands")"
1450 if [ -z "$subcommand" ]; then
1451 __gitcomp "$subcommands"
1452 else
1453 local cur="${COMP_WORDS[COMP_CWORD]}"
1454 case "$subcommand,$cur" in
1455 save,--*)
1456 __gitcomp "--keep-index"
1458 apply,--*)
1459 __gitcomp "--index"
1461 show,--*|drop,--*|pop,--*|branch,--*)
1462 COMPREPLY=()
1464 show,*|apply,*|drop,*|pop,*|branch,*)
1465 __gitcomp "$(git --git-dir="$(__gitdir)" stash list \
1466 | sed -n -e 's/:.*//p')"
1469 COMPREPLY=()
1471 esac
1475 _git_submodule ()
1477 __git_has_doubledash && return
1479 local subcommands="add status init update"
1480 if [ -z "$(__git_find_subcommand "$subcommands")" ]; then
1481 local cur="${COMP_WORDS[COMP_CWORD]}"
1482 case "$cur" in
1483 --*)
1484 __gitcomp "--quiet --cached"
1487 __gitcomp "$subcommands"
1489 esac
1490 return
1494 _git_svn ()
1496 local subcommands="
1497 init fetch clone rebase dcommit log find-rev
1498 set-tree commit-diff info create-ignore propget
1499 proplist show-ignore show-externals
1501 local subcommand="$(__git_find_subcommand "$subcommands")"
1502 if [ -z "$subcommand" ]; then
1503 __gitcomp "$subcommands"
1504 else
1505 local remote_opts="--username= --config-dir= --no-auth-cache"
1506 local fc_opts="
1507 --follow-parent --authors-file= --repack=
1508 --no-metadata --use-svm-props --use-svnsync-props
1509 --log-window-size= --no-checkout --quiet
1510 --repack-flags --user-log-author $remote_opts
1512 local init_opts="
1513 --template= --shared= --trunk= --tags=
1514 --branches= --stdlayout --minimize-url
1515 --no-metadata --use-svm-props --use-svnsync-props
1516 --rewrite-root= $remote_opts
1518 local cmt_opts="
1519 --edit --rmdir --find-copies-harder --copy-similarity=
1522 local cur="${COMP_WORDS[COMP_CWORD]}"
1523 case "$subcommand,$cur" in
1524 fetch,--*)
1525 __gitcomp "--revision= --fetch-all $fc_opts"
1527 clone,--*)
1528 __gitcomp "--revision= $fc_opts $init_opts"
1530 init,--*)
1531 __gitcomp "$init_opts"
1533 dcommit,--*)
1534 __gitcomp "
1535 --merge --strategy= --verbose --dry-run
1536 --fetch-all --no-rebase $cmt_opts $fc_opts
1539 set-tree,--*)
1540 __gitcomp "--stdin $cmt_opts $fc_opts"
1542 create-ignore,--*|propget,--*|proplist,--*|show-ignore,--*|\
1543 show-externals,--*)
1544 __gitcomp "--revision="
1546 log,--*)
1547 __gitcomp "
1548 --limit= --revision= --verbose --incremental
1549 --oneline --show-commit --non-recursive
1550 --authors-file=
1553 rebase,--*)
1554 __gitcomp "
1555 --merge --verbose --strategy= --local
1556 --fetch-all $fc_opts
1559 commit-diff,--*)
1560 __gitcomp "--message= --file= --revision= $cmt_opts"
1562 info,--*)
1563 __gitcomp "--url"
1566 COMPREPLY=()
1568 esac
1572 _git_tag ()
1574 local i c=1 f=0
1575 while [ $c -lt $COMP_CWORD ]; do
1576 i="${COMP_WORDS[c]}"
1577 case "$i" in
1578 -d|-v)
1579 __gitcomp "$(__git_tags)"
1580 return
1585 esac
1586 c=$((++c))
1587 done
1589 case "${COMP_WORDS[COMP_CWORD-1]}" in
1590 -m|-F)
1591 COMPREPLY=()
1593 -*|tag|git-tag)
1594 if [ $f = 1 ]; then
1595 __gitcomp "$(__git_tags)"
1596 else
1597 COMPREPLY=()
1601 __gitcomp "$(__git_refs)"
1603 esac
1606 _git ()
1608 local i c=1 command __git_dir
1610 while [ $c -lt $COMP_CWORD ]; do
1611 i="${COMP_WORDS[c]}"
1612 case "$i" in
1613 --git-dir=*) __git_dir="${i#--git-dir=}" ;;
1614 --bare) __git_dir="." ;;
1615 --version|-p|--paginate) ;;
1616 --help) command="help"; break ;;
1617 *) command="$i"; break ;;
1618 esac
1619 c=$((++c))
1620 done
1622 if [ -z "$command" ]; then
1623 case "${COMP_WORDS[COMP_CWORD]}" in
1624 --*=*) COMPREPLY=() ;;
1625 --*) __gitcomp "
1626 --paginate
1627 --no-pager
1628 --git-dir=
1629 --bare
1630 --version
1631 --exec-path
1632 --work-tree=
1633 --help
1636 *) __gitcomp "$(__git_porcelain_commands) $(__git_aliases)" ;;
1637 esac
1638 return
1641 local expansion=$(__git_aliased_command "$command")
1642 [ "$expansion" ] && command="$expansion"
1644 case "$command" in
1645 am) _git_am ;;
1646 add) _git_add ;;
1647 apply) _git_apply ;;
1648 archive) _git_archive ;;
1649 bisect) _git_bisect ;;
1650 bundle) _git_bundle ;;
1651 branch) _git_branch ;;
1652 checkout) _git_checkout ;;
1653 cherry) _git_cherry ;;
1654 cherry-pick) _git_cherry_pick ;;
1655 clean) _git_clean ;;
1656 clone) _git_clone ;;
1657 commit) _git_commit ;;
1658 config) _git_config ;;
1659 describe) _git_describe ;;
1660 diff) _git_diff ;;
1661 fetch) _git_fetch ;;
1662 format-patch) _git_format_patch ;;
1663 gc) _git_gc ;;
1664 grep) _git_grep ;;
1665 help) _git_help ;;
1666 init) _git_init ;;
1667 log) _git_log ;;
1668 ls-files) _git_ls_files ;;
1669 ls-remote) _git_ls_remote ;;
1670 ls-tree) _git_ls_tree ;;
1671 merge) _git_merge;;
1672 mergetool) _git_mergetool;;
1673 merge-base) _git_merge_base ;;
1674 mv) _git_mv ;;
1675 name-rev) _git_name_rev ;;
1676 pull) _git_pull ;;
1677 push) _git_push ;;
1678 rebase) _git_rebase ;;
1679 remote) _git_remote ;;
1680 reset) _git_reset ;;
1681 revert) _git_revert ;;
1682 rm) _git_rm ;;
1683 send-email) _git_send_email ;;
1684 shortlog) _git_shortlog ;;
1685 show) _git_show ;;
1686 show-branch) _git_show_branch ;;
1687 stash) _git_stash ;;
1688 submodule) _git_submodule ;;
1689 svn) _git_svn ;;
1690 tag) _git_tag ;;
1691 whatchanged) _git_log ;;
1692 *) COMPREPLY=() ;;
1693 esac
1696 _gitk ()
1698 __git_has_doubledash && return
1700 local cur="${COMP_WORDS[COMP_CWORD]}"
1701 local g="$(git rev-parse --git-dir 2>/dev/null)"
1702 local merge=""
1703 if [ -f $g/MERGE_HEAD ]; then
1704 merge="--merge"
1706 case "$cur" in
1707 --*)
1708 __gitcomp "--not --all $merge"
1709 return
1711 esac
1712 __git_complete_revlist
1715 complete -o default -o nospace -F _git git
1716 complete -o default -o nospace -F _gitk gitk
1718 # The following are necessary only for Cygwin, and only are needed
1719 # when the user has tab-completed the executable name and consequently
1720 # included the '.exe' suffix.
1722 if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
1723 complete -o default -o nospace -F _git git.exe