bash completion: Sync config variables with their man pages
[git/msvc.git] / contrib / completion / git-completion.bash
blobe00454983ee16624910e40fec9ddb12849110b1b
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 case "$cur" in
939 --pretty=*)
940 __gitcomp "
941 oneline short medium full fuller email raw
942 " "" "${cur##--pretty=}"
943 return
945 --date=*)
946 __gitcomp "
947 relative iso8601 rfc2822 short local default
948 " "" "${cur##--date=}"
949 return
951 --*)
952 __gitcomp "
953 --max-count= --max-age= --since= --after=
954 --min-age= --before= --until=
955 --root --topo-order --date-order --reverse
956 --no-merges --follow
957 --abbrev-commit --abbrev=
958 --relative-date --date=
959 --author= --committer= --grep=
960 --all-match
961 --pretty= --name-status --name-only --raw
962 --not --all
963 --left-right --cherry-pick
964 --graph
965 --stat --numstat --shortstat
966 --decorate --diff-filter=
967 --color-words --walk-reflogs
968 --parents --children --full-history
969 --merge
971 return
973 esac
974 __git_complete_revlist
977 _git_merge ()
979 local cur="${COMP_WORDS[COMP_CWORD]}"
980 case "${COMP_WORDS[COMP_CWORD-1]}" in
981 -s|--strategy)
982 __gitcomp "$(__git_merge_strategies)"
983 return
984 esac
985 case "$cur" in
986 --strategy=*)
987 __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
988 return
990 --*)
991 __gitcomp "
992 --no-commit --no-stat --log --no-log --squash --strategy
994 return
995 esac
996 __gitcomp "$(__git_refs)"
999 _git_mergetool ()
1001 local cur="${COMP_WORDS[COMP_CWORD]}"
1002 case "$cur" in
1003 --tool=*)
1004 __gitcomp "
1005 kdiff3 tkdiff meld xxdiff emerge
1006 vimdiff gvimdiff ecmerge opendiff
1007 " "" "${cur##--tool=}"
1008 return
1010 --*)
1011 __gitcomp "--tool="
1012 return
1014 esac
1015 COMPREPLY=()
1018 _git_merge_base ()
1020 __gitcomp "$(__git_refs)"
1023 _git_mv ()
1025 local cur="${COMP_WORDS[COMP_CWORD]}"
1026 case "$cur" in
1027 --*)
1028 __gitcomp "--dry-run"
1029 return
1031 esac
1032 COMPREPLY=()
1035 _git_name_rev ()
1037 __gitcomp "--tags --all --stdin"
1040 _git_pull ()
1042 local cur="${COMP_WORDS[COMP_CWORD]}"
1044 if [ "$COMP_CWORD" = 2 ]; then
1045 __gitcomp "$(__git_remotes)"
1046 else
1047 __gitcomp "$(__git_refs "${COMP_WORDS[2]}")"
1051 _git_push ()
1053 local cur="${COMP_WORDS[COMP_CWORD]}"
1055 if [ "$COMP_CWORD" = 2 ]; then
1056 __gitcomp "$(__git_remotes)"
1057 else
1058 case "$cur" in
1059 *:*)
1060 local pfx=""
1061 case "$COMP_WORDBREAKS" in
1062 *:*) : great ;;
1063 *) pfx="${cur%%:*}:" ;;
1064 esac
1066 __gitcomp "$(__git_refs "${COMP_WORDS[2]}")" "$pfx" "${cur#*:}"
1069 __gitcomp "$(__git_refs)" + "${cur#+}"
1072 __gitcomp "$(__git_refs)"
1074 esac
1078 _git_rebase ()
1080 local cur="${COMP_WORDS[COMP_CWORD]}" dir="$(__gitdir)"
1081 if [ -d "$dir"/rebase-apply ] || [ -d "$dir"/rebase-merge ]; then
1082 __gitcomp "--continue --skip --abort"
1083 return
1085 case "${COMP_WORDS[COMP_CWORD-1]}" in
1086 -s|--strategy)
1087 __gitcomp "$(__git_merge_strategies)"
1088 return
1089 esac
1090 case "$cur" in
1091 --strategy=*)
1092 __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
1093 return
1095 --*)
1096 __gitcomp "--onto --merge --strategy --interactive"
1097 return
1098 esac
1099 __gitcomp "$(__git_refs)"
1102 _git_send_email ()
1104 local cur="${COMP_WORDS[COMP_CWORD]}"
1105 case "$cur" in
1106 --*)
1107 __gitcomp "--bcc --cc --cc-cmd --chain-reply-to --compose
1108 --dry-run --envelope-sender --from --identity
1109 --in-reply-to --no-chain-reply-to --no-signed-off-by-cc
1110 --no-suppress-from --no-thread --quiet
1111 --signed-off-by-cc --smtp-pass --smtp-server
1112 --smtp-server-port --smtp-ssl --smtp-user --subject
1113 --suppress-cc --suppress-from --thread --to
1114 --validate --no-validate"
1115 return
1117 esac
1118 COMPREPLY=()
1121 _git_config ()
1123 local cur="${COMP_WORDS[COMP_CWORD]}"
1124 local prv="${COMP_WORDS[COMP_CWORD-1]}"
1125 case "$prv" in
1126 branch.*.remote)
1127 __gitcomp "$(__git_remotes)"
1128 return
1130 branch.*.merge)
1131 __gitcomp "$(__git_refs)"
1132 return
1134 remote.*.fetch)
1135 local remote="${prv#remote.}"
1136 remote="${remote%.fetch}"
1137 __gitcomp "$(__git_refs_remotes "$remote")"
1138 return
1140 remote.*.push)
1141 local remote="${prv#remote.}"
1142 remote="${remote%.push}"
1143 __gitcomp "$(git --git-dir="$(__gitdir)" \
1144 for-each-ref --format='%(refname):%(refname)' \
1145 refs/heads)"
1146 return
1148 pull.twohead|pull.octopus)
1149 __gitcomp "$(__git_merge_strategies)"
1150 return
1152 color.branch|color.diff|color.status)
1153 __gitcomp "always never auto"
1154 return
1156 color.*.*)
1157 __gitcomp "
1158 normal black red green yellow blue magenta cyan white
1159 bold dim ul blink reverse
1161 return
1163 *.*)
1164 COMPREPLY=()
1165 return
1167 esac
1168 case "$cur" in
1169 --*)
1170 __gitcomp "
1171 --global --system --file=
1172 --list --replace-all
1173 --get --get-all --get-regexp
1174 --add --unset --unset-all
1175 --remove-section --rename-section
1177 return
1179 branch.*.*)
1180 local pfx="${cur%.*}."
1181 cur="${cur##*.}"
1182 __gitcomp "remote merge mergeoptions" "$pfx" "$cur"
1183 return
1185 branch.*)
1186 local pfx="${cur%.*}."
1187 cur="${cur#*.}"
1188 __gitcomp "$(__git_heads)" "$pfx" "$cur" "."
1189 return
1191 remote.*.*)
1192 local pfx="${cur%.*}."
1193 cur="${cur##*.}"
1194 __gitcomp "
1195 url proxy fetch push mirror skipDefaultUpdate
1196 receivepack uploadpack tagopt
1197 " "$pfx" "$cur"
1198 return
1200 remote.*)
1201 local pfx="${cur%.*}."
1202 cur="${cur#*.}"
1203 __gitcomp "$(__git_remotes)" "$pfx" "$cur" "."
1204 return
1206 esac
1207 __gitcomp "
1208 apply.whitespace
1209 branch.autosetupmerge
1210 branch.autosetuprebase
1211 clean.requireForce
1212 color.branch
1213 color.branch.current
1214 color.branch.local
1215 color.branch.plain
1216 color.branch.remote
1217 color.diff
1218 color.diff.commit
1219 color.diff.frag
1220 color.diff.meta
1221 color.diff.new
1222 color.diff.old
1223 color.diff.plain
1224 color.diff.whitespace
1225 color.interactive
1226 color.interactive.header
1227 color.interactive.help
1228 color.interactive.prompt
1229 color.pager
1230 color.status
1231 color.status.added
1232 color.status.changed
1233 color.status.header
1234 color.status.nobranch
1235 color.status.untracked
1236 color.status.updated
1237 color.ui
1238 commit.template
1239 core.autocrlf
1240 core.bare
1241 core.compression
1242 core.deltaBaseCacheLimit
1243 core.editor
1244 core.excludesfile
1245 core.fileMode
1246 core.fsyncobjectfiles
1247 core.gitProxy
1248 core.ignoreCygwinFSTricks
1249 core.ignoreStat
1250 core.logAllRefUpdates
1251 core.loosecompression
1252 core.packedGitLimit
1253 core.packedGitWindowSize
1254 core.pager
1255 core.preferSymlinkRefs
1256 core.preloadindex
1257 core.quotepath
1258 core.repositoryFormatVersion
1259 core.safecrlf
1260 core.sharedRepository
1261 core.symlinks
1262 core.trustctime
1263 core.warnAmbiguousRefs
1264 core.whitespace
1265 core.worktree
1266 diff.autorefreshindex
1267 diff.external
1268 diff.mnemonicprefix
1269 diff.renameLimit
1270 diff.renameLimit.
1271 diff.renames
1272 fetch.unpackLimit
1273 format.headers
1274 format.numbered
1275 format.pretty
1276 format.suffix
1277 gc.aggressiveWindow
1278 gc.auto
1279 gc.autopacklimit
1280 gc.packrefs
1281 gc.pruneexpire
1282 gc.reflogexpire
1283 gc.reflogexpireunreachable
1284 gc.rerereresolved
1285 gc.rerereunresolved
1286 gitcvs.allbinary
1287 gitcvs.dbTableNamePrefix
1288 gitcvs.dbdriver
1289 gitcvs.dbname
1290 gitcvs.dbpass
1291 gitcvs.dbuser
1292 gitcvs.enabled
1293 gitcvs.logfile
1294 gitcvs.usecrlfattr
1295 gui.blamehistoryctx
1296 gui.commitmsgwidth
1297 gui.copyblamethreshold
1298 gui.diffcontext
1299 gui.encoding
1300 gui.fastcopyblame
1301 gui.matchtrackingbranch
1302 gui.newbranchtemplate
1303 gui.pruneduringfetch
1304 gui.spellingdictionary
1305 gui.trustmtime
1306 help.autocorrect
1307 help.browser
1308 help.format
1309 http.lowSpeedLimit
1310 http.lowSpeedTime
1311 http.maxRequests
1312 http.noEPSV
1313 http.proxy
1314 http.sslCAInfo
1315 http.sslCAPath
1316 http.sslCert
1317 http.sslKey
1318 http.sslVerify
1319 i18n.commitEncoding
1320 i18n.logOutputEncoding
1321 instaweb.browser
1322 instaweb.httpd
1323 instaweb.local
1324 instaweb.modulepath
1325 instaweb.port
1326 log.date
1327 log.showroot
1328 man.viewer
1329 merge.conflictstyle
1330 merge.log
1331 merge.renameLimit
1332 merge.stat
1333 merge.tool
1334 merge.verbosity
1335 mergetool.keepBackup
1336 pack.compression
1337 pack.deltaCacheLimit
1338 pack.deltaCacheSize
1339 pack.depth
1340 pack.indexVersion
1341 pack.packSizeLimit
1342 pack.threads
1343 pack.window
1344 pack.windowMemory
1345 pull.octopus
1346 pull.twohead
1347 receive.denyCurrentBranch
1348 receive.denyDeletes
1349 receive.denyNonFastForwards
1350 receive.fsckObjects
1351 receive.unpackLimit
1352 repack.usedeltabaseoffset
1353 rerere.autoupdate
1354 rerere.enabled
1355 showbranch.default
1356 status.relativePaths
1357 status.showUntrackedFiles
1358 tar.umask
1359 transfer.unpackLimit
1360 user.email
1361 user.name
1362 user.signingkey
1363 web.browser
1364 branch. remote.
1368 _git_remote ()
1370 local subcommands="add rm show prune update"
1371 local subcommand="$(__git_find_subcommand "$subcommands")"
1372 if [ -z "$subcommand" ]; then
1373 __gitcomp "$subcommands"
1374 return
1377 case "$subcommand" in
1378 rm|show|prune)
1379 __gitcomp "$(__git_remotes)"
1381 update)
1382 local i c='' IFS=$'\n'
1383 for i in $(git --git-dir="$(__gitdir)" config --list); do
1384 case "$i" in
1385 remotes.*)
1386 i="${i#remotes.}"
1387 c="$c ${i/=*/}"
1389 esac
1390 done
1391 __gitcomp "$c"
1394 COMPREPLY=()
1396 esac
1399 _git_reset ()
1401 __git_has_doubledash && return
1403 local cur="${COMP_WORDS[COMP_CWORD]}"
1404 case "$cur" in
1405 --*)
1406 __gitcomp "--mixed --hard --soft"
1407 return
1409 esac
1410 __gitcomp "$(__git_refs)"
1413 _git_revert ()
1415 local cur="${COMP_WORDS[COMP_CWORD]}"
1416 case "$cur" in
1417 --*)
1418 __gitcomp "--edit --mainline --no-edit --no-commit --signoff"
1419 return
1421 esac
1422 __gitcomp "$(__git_refs)"
1425 _git_rm ()
1427 __git_has_doubledash && return
1429 local cur="${COMP_WORDS[COMP_CWORD]}"
1430 case "$cur" in
1431 --*)
1432 __gitcomp "--cached --dry-run --ignore-unmatch --quiet"
1433 return
1435 esac
1436 COMPREPLY=()
1439 _git_shortlog ()
1441 __git_has_doubledash && return
1443 local cur="${COMP_WORDS[COMP_CWORD]}"
1444 case "$cur" in
1445 --*)
1446 __gitcomp "
1447 --max-count= --max-age= --since= --after=
1448 --min-age= --before= --until=
1449 --no-merges
1450 --author= --committer= --grep=
1451 --all-match
1452 --not --all
1453 --numbered --summary
1455 return
1457 esac
1458 __git_complete_revlist
1461 _git_show ()
1463 __git_has_doubledash && return
1465 local cur="${COMP_WORDS[COMP_CWORD]}"
1466 case "$cur" in
1467 --pretty=*)
1468 __gitcomp "
1469 oneline short medium full fuller email raw
1470 " "" "${cur##--pretty=}"
1471 return
1473 --*)
1474 __gitcomp "--pretty="
1475 return
1477 esac
1478 __git_complete_file
1481 _git_show_branch ()
1483 local cur="${COMP_WORDS[COMP_CWORD]}"
1484 case "$cur" in
1485 --*)
1486 __gitcomp "
1487 --all --remotes --topo-order --current --more=
1488 --list --independent --merge-base --no-name
1489 --sha1-name --topics --reflog
1491 return
1493 esac
1494 __git_complete_revlist
1497 _git_stash ()
1499 local subcommands='save list show apply clear drop pop create branch'
1500 local subcommand="$(__git_find_subcommand "$subcommands")"
1501 if [ -z "$subcommand" ]; then
1502 __gitcomp "$subcommands"
1503 else
1504 local cur="${COMP_WORDS[COMP_CWORD]}"
1505 case "$subcommand,$cur" in
1506 save,--*)
1507 __gitcomp "--keep-index"
1509 apply,--*)
1510 __gitcomp "--index"
1512 show,--*|drop,--*|pop,--*|branch,--*)
1513 COMPREPLY=()
1515 show,*|apply,*|drop,*|pop,*|branch,*)
1516 __gitcomp "$(git --git-dir="$(__gitdir)" stash list \
1517 | sed -n -e 's/:.*//p')"
1520 COMPREPLY=()
1522 esac
1526 _git_submodule ()
1528 __git_has_doubledash && return
1530 local subcommands="add status init update summary foreach sync"
1531 if [ -z "$(__git_find_subcommand "$subcommands")" ]; then
1532 local cur="${COMP_WORDS[COMP_CWORD]}"
1533 case "$cur" in
1534 --*)
1535 __gitcomp "--quiet --cached"
1538 __gitcomp "$subcommands"
1540 esac
1541 return
1545 _git_svn ()
1547 local subcommands="
1548 init fetch clone rebase dcommit log find-rev
1549 set-tree commit-diff info create-ignore propget
1550 proplist show-ignore show-externals
1552 local subcommand="$(__git_find_subcommand "$subcommands")"
1553 if [ -z "$subcommand" ]; then
1554 __gitcomp "$subcommands"
1555 else
1556 local remote_opts="--username= --config-dir= --no-auth-cache"
1557 local fc_opts="
1558 --follow-parent --authors-file= --repack=
1559 --no-metadata --use-svm-props --use-svnsync-props
1560 --log-window-size= --no-checkout --quiet
1561 --repack-flags --user-log-author $remote_opts
1563 local init_opts="
1564 --template= --shared= --trunk= --tags=
1565 --branches= --stdlayout --minimize-url
1566 --no-metadata --use-svm-props --use-svnsync-props
1567 --rewrite-root= $remote_opts
1569 local cmt_opts="
1570 --edit --rmdir --find-copies-harder --copy-similarity=
1573 local cur="${COMP_WORDS[COMP_CWORD]}"
1574 case "$subcommand,$cur" in
1575 fetch,--*)
1576 __gitcomp "--revision= --fetch-all $fc_opts"
1578 clone,--*)
1579 __gitcomp "--revision= $fc_opts $init_opts"
1581 init,--*)
1582 __gitcomp "$init_opts"
1584 dcommit,--*)
1585 __gitcomp "
1586 --merge --strategy= --verbose --dry-run
1587 --fetch-all --no-rebase $cmt_opts $fc_opts
1590 set-tree,--*)
1591 __gitcomp "--stdin $cmt_opts $fc_opts"
1593 create-ignore,--*|propget,--*|proplist,--*|show-ignore,--*|\
1594 show-externals,--*)
1595 __gitcomp "--revision="
1597 log,--*)
1598 __gitcomp "
1599 --limit= --revision= --verbose --incremental
1600 --oneline --show-commit --non-recursive
1601 --authors-file=
1604 rebase,--*)
1605 __gitcomp "
1606 --merge --verbose --strategy= --local
1607 --fetch-all $fc_opts
1610 commit-diff,--*)
1611 __gitcomp "--message= --file= --revision= $cmt_opts"
1613 info,--*)
1614 __gitcomp "--url"
1617 COMPREPLY=()
1619 esac
1623 _git_tag ()
1625 local i c=1 f=0
1626 while [ $c -lt $COMP_CWORD ]; do
1627 i="${COMP_WORDS[c]}"
1628 case "$i" in
1629 -d|-v)
1630 __gitcomp "$(__git_tags)"
1631 return
1636 esac
1637 c=$((++c))
1638 done
1640 case "${COMP_WORDS[COMP_CWORD-1]}" in
1641 -m|-F)
1642 COMPREPLY=()
1644 -*|tag)
1645 if [ $f = 1 ]; then
1646 __gitcomp "$(__git_tags)"
1647 else
1648 COMPREPLY=()
1652 __gitcomp "$(__git_refs)"
1654 esac
1657 _git ()
1659 local i c=1 command __git_dir
1661 while [ $c -lt $COMP_CWORD ]; do
1662 i="${COMP_WORDS[c]}"
1663 case "$i" in
1664 --git-dir=*) __git_dir="${i#--git-dir=}" ;;
1665 --bare) __git_dir="." ;;
1666 --version|-p|--paginate) ;;
1667 --help) command="help"; break ;;
1668 *) command="$i"; break ;;
1669 esac
1670 c=$((++c))
1671 done
1673 if [ -z "$command" ]; then
1674 case "${COMP_WORDS[COMP_CWORD]}" in
1675 --*=*) COMPREPLY=() ;;
1676 --*) __gitcomp "
1677 --paginate
1678 --no-pager
1679 --git-dir=
1680 --bare
1681 --version
1682 --exec-path
1683 --work-tree=
1684 --help
1687 *) __gitcomp "$(__git_porcelain_commands) $(__git_aliases)" ;;
1688 esac
1689 return
1692 local expansion=$(__git_aliased_command "$command")
1693 [ "$expansion" ] && command="$expansion"
1695 case "$command" in
1696 am) _git_am ;;
1697 add) _git_add ;;
1698 apply) _git_apply ;;
1699 archive) _git_archive ;;
1700 bisect) _git_bisect ;;
1701 bundle) _git_bundle ;;
1702 branch) _git_branch ;;
1703 checkout) _git_checkout ;;
1704 cherry) _git_cherry ;;
1705 cherry-pick) _git_cherry_pick ;;
1706 clean) _git_clean ;;
1707 clone) _git_clone ;;
1708 commit) _git_commit ;;
1709 config) _git_config ;;
1710 describe) _git_describe ;;
1711 diff) _git_diff ;;
1712 fetch) _git_fetch ;;
1713 format-patch) _git_format_patch ;;
1714 gc) _git_gc ;;
1715 grep) _git_grep ;;
1716 help) _git_help ;;
1717 init) _git_init ;;
1718 log) _git_log ;;
1719 ls-files) _git_ls_files ;;
1720 ls-remote) _git_ls_remote ;;
1721 ls-tree) _git_ls_tree ;;
1722 merge) _git_merge;;
1723 mergetool) _git_mergetool;;
1724 merge-base) _git_merge_base ;;
1725 mv) _git_mv ;;
1726 name-rev) _git_name_rev ;;
1727 pull) _git_pull ;;
1728 push) _git_push ;;
1729 rebase) _git_rebase ;;
1730 remote) _git_remote ;;
1731 reset) _git_reset ;;
1732 revert) _git_revert ;;
1733 rm) _git_rm ;;
1734 send-email) _git_send_email ;;
1735 shortlog) _git_shortlog ;;
1736 show) _git_show ;;
1737 show-branch) _git_show_branch ;;
1738 stash) _git_stash ;;
1739 submodule) _git_submodule ;;
1740 svn) _git_svn ;;
1741 tag) _git_tag ;;
1742 whatchanged) _git_log ;;
1743 *) COMPREPLY=() ;;
1744 esac
1747 _gitk ()
1749 __git_has_doubledash && return
1751 local cur="${COMP_WORDS[COMP_CWORD]}"
1752 local g="$(git rev-parse --git-dir 2>/dev/null)"
1753 local merge=""
1754 if [ -f $g/MERGE_HEAD ]; then
1755 merge="--merge"
1757 case "$cur" in
1758 --*)
1759 __gitcomp "--not --all $merge"
1760 return
1762 esac
1763 __git_complete_revlist
1766 complete -o default -o nospace -F _git git
1767 complete -o default -o nospace -F _gitk gitk
1769 # The following are necessary only for Cygwin, and only are needed
1770 # when the user has tab-completed the executable name and consequently
1771 # included the '.exe' suffix.
1773 if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
1774 complete -o default -o nospace -F _git git.exe