bash-completion: Add comments to remind about required arguments
[git/trast.git] / contrib / completion / git-completion.bash
blobf8b845a4ac9cbe14d046636b81f693874f973242
1 #!bash
3 # bash completion support for core Git.
5 # Copyright (C) 2006,2007 Shawn O. Pearce <spearce@spearce.org>
6 # Conceptually based on gitcompletion (http://gitweb.hawaga.org.uk/).
7 # Distributed under the GNU General Public License, version 2.0.
9 # The contained completion routines provide support for completing:
11 # *) local and remote branch names
12 # *) local and remote tag names
13 # *) .git/remotes file names
14 # *) git 'subcommands'
15 # *) tree paths within 'ref:path/to/file' expressions
16 # *) common --long-options
18 # To use these routines:
20 # 1) Copy this file to somewhere (e.g. ~/.git-completion.sh).
21 # 2) Added the following line to your .bashrc:
22 # source ~/.git-completion.sh
24 # 3) You may want to make sure the git executable is available
25 # in your PATH before this script is sourced, as some caching
26 # is performed while the script loads. If git isn't found
27 # at source time then all lookups will be done on demand,
28 # which may be slightly slower.
30 # 4) Consider changing your PS1 to also show the current branch:
31 # PS1='[\u@\h \W$(__git_ps1 " (%s)")]\$ '
33 # The argument to __git_ps1 will be displayed only if you
34 # are currently in a git repository. The %s token will be
35 # the name of the current branch.
37 # To submit patches:
39 # *) Read Documentation/SubmittingPatches
40 # *) Send all patches to the current maintainer:
42 # "Shawn O. Pearce" <spearce@spearce.org>
44 # *) Always CC the Git mailing list:
46 # git@vger.kernel.org
49 case "$COMP_WORDBREAKS" in
50 *:*) : great ;;
51 *) COMP_WORDBREAKS="$COMP_WORDBREAKS:"
52 esac
54 # __gitdir accepts 0 or 1 arguments (i.e., location)
55 # returns location of .git repo
56 __gitdir ()
58 if [ -z "${1-}" ]; then
59 if [ -n "$__git_dir" ]; then
60 echo "$__git_dir"
61 elif [ -d .git ]; then
62 echo .git
63 else
64 git rev-parse --git-dir 2>/dev/null
66 elif [ -d "$1/.git" ]; then
67 echo "$1/.git"
68 else
69 echo "$1"
73 # __git_ps1 accepts 0 or 1 arguments (i.e., format string)
74 # returns text to add to bash PS1 prompt (includes branch name)
75 __git_ps1 ()
77 local g="$(git rev-parse --git-dir 2>/dev/null)"
78 if [ -n "$g" ]; then
79 local r
80 local b
81 if [ -d "$g/rebase-apply" ]
82 then
83 if test -f "$g/rebase-apply/rebasing"
84 then
85 r="|REBASE"
86 elif test -f "$g/rebase-apply/applying"
87 then
88 r="|AM"
89 else
90 r="|AM/REBASE"
92 b="$(git symbolic-ref HEAD 2>/dev/null)"
93 elif [ -f "$g/rebase-merge/interactive" ]
94 then
95 r="|REBASE-i"
96 b="$(cat "$g/rebase-merge/head-name")"
97 elif [ -d "$g/rebase-merge" ]
98 then
99 r="|REBASE-m"
100 b="$(cat "$g/rebase-merge/head-name")"
101 elif [ -f "$g/MERGE_HEAD" ]
102 then
103 r="|MERGING"
104 b="$(git symbolic-ref HEAD 2>/dev/null)"
105 else
106 if [ -f "$g/BISECT_LOG" ]
107 then
108 r="|BISECTING"
110 if ! b="$(git symbolic-ref HEAD 2>/dev/null)"
111 then
112 if ! b="$(git describe --exact-match HEAD 2>/dev/null)"
113 then
114 b="$(cut -c1-7 "$g/HEAD")..."
119 if [ -n "${1-}" ]; then
120 printf "$1" "${b##refs/heads/}$r"
121 else
122 printf " (%s)" "${b##refs/heads/}$r"
127 # __gitcomp_1 requires 2 arguments
128 __gitcomp_1 ()
130 local c IFS=' '$'\t'$'\n'
131 for c in $1; do
132 case "$c$2" in
133 --*=*) printf %s$'\n' "$c$2" ;;
134 *.) printf %s$'\n' "$c$2" ;;
135 *) printf %s$'\n' "$c$2 " ;;
136 esac
137 done
140 # __gitcomp accepts 1, 2, 3, or 4 arguments
141 # generates completion reply with compgen
142 __gitcomp ()
144 local cur="${COMP_WORDS[COMP_CWORD]}"
145 if [ $# -gt 2 ]; then
146 cur="$3"
148 case "$cur" in
149 --*=)
150 COMPREPLY=()
153 local IFS=$'\n'
154 COMPREPLY=($(compgen -P "${2-}" \
155 -W "$(__gitcomp_1 "${1-}" "${4-}")" \
156 -- "$cur"))
158 esac
161 # __git_heads accepts 0 or 1 arguments (to pass to __gitdir)
162 __git_heads ()
164 local cmd i is_hash=y dir="$(__gitdir "${1-}")"
165 if [ -d "$dir" ]; then
166 git --git-dir="$dir" for-each-ref --format='%(refname:short)' \
167 refs/heads
168 return
170 for i in $(git ls-remote "${1-}" 2>/dev/null); do
171 case "$is_hash,$i" in
172 y,*) is_hash=n ;;
173 n,*^{}) is_hash=y ;;
174 n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;
175 n,*) is_hash=y; echo "$i" ;;
176 esac
177 done
180 # __git_tags accepts 0 or 1 arguments (to pass to __gitdir)
181 __git_tags ()
183 local cmd i is_hash=y dir="$(__gitdir "${1-}")"
184 if [ -d "$dir" ]; then
185 git --git-dir="$dir" for-each-ref --format='%(refname:short)' \
186 refs/tags
187 return
189 for i in $(git ls-remote "${1-}" 2>/dev/null); do
190 case "$is_hash,$i" in
191 y,*) is_hash=n ;;
192 n,*^{}) is_hash=y ;;
193 n,refs/tags/*) is_hash=y; echo "${i#refs/tags/}" ;;
194 n,*) is_hash=y; echo "$i" ;;
195 esac
196 done
199 # __git_refs accepts 0 or 1 arguments (to pass to __gitdir)
200 __git_refs ()
202 local i is_hash=y dir="$(__gitdir "${1-}")"
203 local cur="${COMP_WORDS[COMP_CWORD]}" format refs
204 if [ -d "$dir" ]; then
205 case "$cur" in
206 refs|refs/*)
207 format="refname"
208 refs="${cur%/*}"
211 if [ -e "$dir/HEAD" ]; then echo HEAD; fi
212 format="refname:short"
213 refs="refs/tags refs/heads refs/remotes"
215 esac
216 git --git-dir="$dir" for-each-ref --format="%($format)" \
217 $refs
218 return
220 for i in $(git ls-remote "$dir" 2>/dev/null); do
221 case "$is_hash,$i" in
222 y,*) is_hash=n ;;
223 n,*^{}) is_hash=y ;;
224 n,refs/tags/*) is_hash=y; echo "${i#refs/tags/}" ;;
225 n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;
226 n,refs/remotes/*) is_hash=y; echo "${i#refs/remotes/}" ;;
227 n,*) is_hash=y; echo "$i" ;;
228 esac
229 done
232 # __git_refs2 requires 1 argument (to pass to __git_refs)
233 __git_refs2 ()
235 local i
236 for i in $(__git_refs "$1"); do
237 echo "$i:$i"
238 done
241 # __git_refs_remotes requires 1 argument (to pass to ls-remote)
242 __git_refs_remotes ()
244 local cmd i is_hash=y
245 for i in $(git ls-remote "$1" 2>/dev/null); do
246 case "$is_hash,$i" in
247 n,refs/heads/*)
248 is_hash=y
249 echo "$i:refs/remotes/$1/${i#refs/heads/}"
251 y,*) is_hash=n ;;
252 n,*^{}) is_hash=y ;;
253 n,refs/tags/*) is_hash=y;;
254 n,*) is_hash=y; ;;
255 esac
256 done
259 __git_remotes ()
261 local i ngoff IFS=$'\n' d="$(__gitdir)"
262 shopt -q nullglob || ngoff=1
263 shopt -s nullglob
264 for i in "$d/remotes"/*; do
265 echo ${i#$d/remotes/}
266 done
267 [ "$ngoff" ] && shopt -u nullglob
268 for i in $(git --git-dir="$d" config --list); do
269 case "$i" in
270 remote.*.url=*)
271 i="${i#remote.}"
272 echo "${i/.url=*/}"
274 esac
275 done
278 __git_merge_strategies ()
280 if [ -n "$__git_merge_strategylist" ]; then
281 echo "$__git_merge_strategylist"
282 return
284 git merge -s help 2>&1 |
285 sed -n -e '/[Aa]vailable strategies are: /,/^$/{
286 s/\.$//
287 s/.*://
288 s/^[ ]*//
289 s/[ ]*$//
293 __git_merge_strategylist=
294 __git_merge_strategylist=$(__git_merge_strategies 2>/dev/null)
296 __git_complete_file ()
298 local pfx ls ref cur="${COMP_WORDS[COMP_CWORD]}"
299 case "$cur" in
300 ?*:*)
301 ref="${cur%%:*}"
302 cur="${cur#*:}"
303 case "$cur" in
304 ?*/*)
305 pfx="${cur%/*}"
306 cur="${cur##*/}"
307 ls="$ref:$pfx"
308 pfx="$pfx/"
311 ls="$ref"
313 esac
315 case "$COMP_WORDBREAKS" in
316 *:*) : great ;;
317 *) pfx="$ref:$pfx" ;;
318 esac
320 local IFS=$'\n'
321 COMPREPLY=($(compgen -P "$pfx" \
322 -W "$(git --git-dir="$(__gitdir)" ls-tree "$ls" \
323 | sed '/^100... blob /{
324 s,^.* ,,
325 s,$, ,
327 /^120000 blob /{
328 s,^.* ,,
329 s,$, ,
331 /^040000 tree /{
332 s,^.* ,,
333 s,$,/,
335 s/^.* //')" \
336 -- "$cur"))
339 __gitcomp "$(__git_refs)"
341 esac
344 __git_complete_revlist ()
346 local pfx cur="${COMP_WORDS[COMP_CWORD]}"
347 case "$cur" in
348 *...*)
349 pfx="${cur%...*}..."
350 cur="${cur#*...}"
351 __gitcomp "$(__git_refs)" "$pfx" "$cur"
353 *..*)
354 pfx="${cur%..*}.."
355 cur="${cur#*..}"
356 __gitcomp "$(__git_refs)" "$pfx" "$cur"
359 __gitcomp "$(__git_refs)"
361 esac
364 __git_all_commands ()
366 if [ -n "$__git_all_commandlist" ]; then
367 echo "$__git_all_commandlist"
368 return
370 local i IFS=" "$'\n'
371 for i in $(git help -a|egrep '^ ')
373 case $i in
374 *--*) : helper pattern;;
375 *) echo $i;;
376 esac
377 done
379 __git_all_commandlist=
380 __git_all_commandlist="$(__git_all_commands 2>/dev/null)"
382 __git_porcelain_commands ()
384 if [ -n "$__git_porcelain_commandlist" ]; then
385 echo "$__git_porcelain_commandlist"
386 return
388 local i IFS=" "$'\n'
389 for i in "help" $(__git_all_commands)
391 case $i in
392 *--*) : helper pattern;;
393 applymbox) : ask gittus;;
394 applypatch) : ask gittus;;
395 archimport) : import;;
396 cat-file) : plumbing;;
397 check-attr) : plumbing;;
398 check-ref-format) : plumbing;;
399 checkout-index) : plumbing;;
400 commit-tree) : plumbing;;
401 count-objects) : infrequent;;
402 cvsexportcommit) : export;;
403 cvsimport) : import;;
404 cvsserver) : daemon;;
405 daemon) : daemon;;
406 diff-files) : plumbing;;
407 diff-index) : plumbing;;
408 diff-tree) : plumbing;;
409 fast-import) : import;;
410 fast-export) : export;;
411 fsck-objects) : plumbing;;
412 fetch-pack) : plumbing;;
413 fmt-merge-msg) : plumbing;;
414 for-each-ref) : plumbing;;
415 hash-object) : plumbing;;
416 http-*) : transport;;
417 index-pack) : plumbing;;
418 init-db) : deprecated;;
419 local-fetch) : plumbing;;
420 lost-found) : infrequent;;
421 ls-files) : plumbing;;
422 ls-remote) : plumbing;;
423 ls-tree) : plumbing;;
424 mailinfo) : plumbing;;
425 mailsplit) : plumbing;;
426 merge-*) : plumbing;;
427 mktree) : plumbing;;
428 mktag) : plumbing;;
429 pack-objects) : plumbing;;
430 pack-redundant) : plumbing;;
431 pack-refs) : plumbing;;
432 parse-remote) : plumbing;;
433 patch-id) : plumbing;;
434 peek-remote) : plumbing;;
435 prune) : plumbing;;
436 prune-packed) : plumbing;;
437 quiltimport) : import;;
438 read-tree) : plumbing;;
439 receive-pack) : plumbing;;
440 reflog) : plumbing;;
441 repo-config) : deprecated;;
442 rerere) : plumbing;;
443 rev-list) : plumbing;;
444 rev-parse) : plumbing;;
445 runstatus) : plumbing;;
446 sh-setup) : internal;;
447 shell) : daemon;;
448 show-ref) : plumbing;;
449 send-pack) : plumbing;;
450 show-index) : plumbing;;
451 ssh-*) : transport;;
452 stripspace) : plumbing;;
453 symbolic-ref) : plumbing;;
454 tar-tree) : deprecated;;
455 unpack-file) : plumbing;;
456 unpack-objects) : plumbing;;
457 update-index) : plumbing;;
458 update-ref) : plumbing;;
459 update-server-info) : daemon;;
460 upload-archive) : plumbing;;
461 upload-pack) : plumbing;;
462 write-tree) : plumbing;;
463 var) : infrequent;;
464 verify-pack) : infrequent;;
465 verify-tag) : plumbing;;
466 *) echo $i;;
467 esac
468 done
470 __git_porcelain_commandlist=
471 __git_porcelain_commandlist="$(__git_porcelain_commands 2>/dev/null)"
473 __git_aliases ()
475 local i IFS=$'\n'
476 for i in $(git --git-dir="$(__gitdir)" config --list); do
477 case "$i" in
478 alias.*)
479 i="${i#alias.}"
480 echo "${i/=*/}"
482 esac
483 done
486 # __git_aliased_command requires 1 argument
487 __git_aliased_command ()
489 local word cmdline=$(git --git-dir="$(__gitdir)" \
490 config --get "alias.$1")
491 for word in $cmdline; do
492 if [ "${word##-*}" ]; then
493 echo $word
494 return
496 done
499 # __git_find_subcommand requires 1 argument
500 __git_find_subcommand ()
502 local word subcommand c=1
504 while [ $c -lt $COMP_CWORD ]; do
505 word="${COMP_WORDS[c]}"
506 for subcommand in $1; do
507 if [ "$subcommand" = "$word" ]; then
508 echo "$subcommand"
509 return
511 done
512 c=$((++c))
513 done
516 __git_has_doubledash ()
518 local c=1
519 while [ $c -lt $COMP_CWORD ]; do
520 if [ "--" = "${COMP_WORDS[c]}" ]; then
521 return 0
523 c=$((++c))
524 done
525 return 1
528 __git_whitespacelist="nowarn warn error error-all fix"
530 _git_am ()
532 local cur="${COMP_WORDS[COMP_CWORD]}" dir="$(__gitdir)"
533 if [ -d "$dir"/rebase-apply ]; then
534 __gitcomp "--skip --resolved --abort"
535 return
537 case "$cur" in
538 --whitespace=*)
539 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
540 return
542 --*)
543 __gitcomp "
544 --signoff --utf8 --binary --3way --interactive
545 --whitespace=
547 return
548 esac
549 COMPREPLY=()
552 _git_apply ()
554 local cur="${COMP_WORDS[COMP_CWORD]}"
555 case "$cur" in
556 --whitespace=*)
557 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
558 return
560 --*)
561 __gitcomp "
562 --stat --numstat --summary --check --index
563 --cached --index-info --reverse --reject --unidiff-zero
564 --apply --no-add --exclude=
565 --whitespace= --inaccurate-eof --verbose
567 return
568 esac
569 COMPREPLY=()
572 _git_add ()
574 __git_has_doubledash && return
576 local cur="${COMP_WORDS[COMP_CWORD]}"
577 case "$cur" in
578 --*)
579 __gitcomp "
580 --interactive --refresh --patch --update --dry-run
581 --ignore-errors --intent-to-add
583 return
584 esac
585 COMPREPLY=()
588 _git_archive ()
590 local cur="${COMP_WORDS[COMP_CWORD]}"
591 case "$cur" in
592 --format=*)
593 __gitcomp "$(git archive --list)" "" "${cur##--format=}"
594 return
596 --remote=*)
597 __gitcomp "$(__git_remotes)" "" "${cur##--remote=}"
598 return
600 --*)
601 __gitcomp "
602 --format= --list --verbose
603 --prefix= --remote= --exec=
605 return
607 esac
608 __git_complete_file
611 _git_bisect ()
613 __git_has_doubledash && return
615 local subcommands="start bad good skip reset visualize replay log run"
616 local subcommand="$(__git_find_subcommand "$subcommands")"
617 if [ -z "$subcommand" ]; then
618 __gitcomp "$subcommands"
619 return
622 case "$subcommand" in
623 bad|good|reset|skip)
624 __gitcomp "$(__git_refs)"
627 COMPREPLY=()
629 esac
632 _git_branch ()
634 local i c=1 only_local_ref="n" has_r="n"
636 while [ $c -lt $COMP_CWORD ]; do
637 i="${COMP_WORDS[c]}"
638 case "$i" in
639 -d|-m) only_local_ref="y" ;;
640 -r) has_r="y" ;;
641 esac
642 c=$((++c))
643 done
645 case "${COMP_WORDS[COMP_CWORD]}" in
646 --*=*) COMPREPLY=() ;;
647 --*)
648 __gitcomp "
649 --color --no-color --verbose --abbrev= --no-abbrev
650 --track --no-track --contains --merged --no-merged
654 if [ $only_local_ref = "y" -a $has_r = "n" ]; then
655 __gitcomp "$(__git_heads)"
656 else
657 __gitcomp "$(__git_refs)"
660 esac
663 _git_bundle ()
665 local cmd="${COMP_WORDS[2]}"
666 case "$COMP_CWORD" in
668 __gitcomp "create list-heads verify unbundle"
671 # looking for a file
674 case "$cmd" in
675 create)
676 __git_complete_revlist
678 esac
680 esac
683 _git_checkout ()
685 __git_has_doubledash && return
687 __gitcomp "$(__git_refs)"
690 _git_cherry ()
692 __gitcomp "$(__git_refs)"
695 _git_cherry_pick ()
697 local cur="${COMP_WORDS[COMP_CWORD]}"
698 case "$cur" in
699 --*)
700 __gitcomp "--edit --no-commit"
703 __gitcomp "$(__git_refs)"
705 esac
708 _git_clean ()
710 __git_has_doubledash && return
712 local cur="${COMP_WORDS[COMP_CWORD]}"
713 case "$cur" in
714 --*)
715 __gitcomp "--dry-run --quiet"
716 return
718 esac
719 COMPREPLY=()
722 _git_clone ()
724 local cur="${COMP_WORDS[COMP_CWORD]}"
725 case "$cur" in
726 --*)
727 __gitcomp "
728 --local
729 --no-hardlinks
730 --shared
731 --reference
732 --quiet
733 --no-checkout
734 --bare
735 --mirror
736 --origin
737 --upload-pack
738 --template=
739 --depth
741 return
743 esac
744 COMPREPLY=()
747 _git_commit ()
749 __git_has_doubledash && return
751 local cur="${COMP_WORDS[COMP_CWORD]}"
752 case "$cur" in
753 --*)
754 __gitcomp "
755 --all --author= --signoff --verify --no-verify
756 --edit --amend --include --only --interactive
758 return
759 esac
760 COMPREPLY=()
763 _git_describe ()
765 local cur="${COMP_WORDS[COMP_CWORD]}"
766 case "$cur" in
767 --*)
768 __gitcomp "
769 --all --tags --contains --abbrev= --candidates=
770 --exact-match --debug --long --match --always
772 return
773 esac
774 __gitcomp "$(__git_refs)"
777 _git_diff ()
779 __git_has_doubledash && return
781 local cur="${COMP_WORDS[COMP_CWORD]}"
782 case "$cur" in
783 --*)
784 __gitcomp "--cached --stat --numstat --shortstat --summary
785 --patch-with-stat --name-only --name-status --color
786 --no-color --color-words --no-renames --check
787 --full-index --binary --abbrev --diff-filter=
788 --find-copies-harder --pickaxe-all --pickaxe-regex
789 --text --ignore-space-at-eol --ignore-space-change
790 --ignore-all-space --exit-code --quiet --ext-diff
791 --no-ext-diff
792 --no-prefix --src-prefix= --dst-prefix=
793 --base --ours --theirs
794 --inter-hunk-context=
796 return
798 esac
799 __git_complete_file
802 _git_fetch ()
804 local cur="${COMP_WORDS[COMP_CWORD]}"
806 if [ "$COMP_CWORD" = 2 ]; then
807 __gitcomp "$(__git_remotes)"
808 else
809 case "$cur" in
810 *:*)
811 local pfx=""
812 case "$COMP_WORDBREAKS" in
813 *:*) : great ;;
814 *) pfx="${cur%%:*}:" ;;
815 esac
816 __gitcomp "$(__git_refs)" "$pfx" "${cur#*:}"
819 __gitcomp "$(__git_refs2 "${COMP_WORDS[2]}")"
821 esac
825 _git_format_patch ()
827 local cur="${COMP_WORDS[COMP_CWORD]}"
828 case "$cur" in
829 --*)
830 __gitcomp "
831 --stdout --attach --thread
832 --output-directory
833 --numbered --start-number
834 --numbered-files
835 --keep-subject
836 --signoff
837 --in-reply-to=
838 --full-index --binary
839 --not --all
840 --cover-letter
841 --no-prefix --src-prefix= --dst-prefix=
843 return
845 esac
846 __git_complete_revlist
849 _git_gc ()
851 local cur="${COMP_WORDS[COMP_CWORD]}"
852 case "$cur" in
853 --*)
854 __gitcomp "--prune --aggressive"
855 return
857 esac
858 COMPREPLY=()
861 _git_grep ()
863 __git_has_doubledash && return
865 local cur="${COMP_WORDS[COMP_CWORD]}"
866 case "$cur" in
867 --*)
868 __gitcomp "
869 --cached
870 --text --ignore-case --word-regexp --invert-match
871 --full-name
872 --extended-regexp --basic-regexp --fixed-strings
873 --files-with-matches --name-only
874 --files-without-match
875 --count
876 --and --or --not --all-match
878 return
880 esac
881 COMPREPLY=()
884 _git_help ()
886 local cur="${COMP_WORDS[COMP_CWORD]}"
887 case "$cur" in
888 --*)
889 __gitcomp "--all --info --man --web"
890 return
892 esac
893 __gitcomp "$(__git_all_commands)
894 attributes cli core-tutorial cvs-migration
895 diffcore gitk glossary hooks ignore modules
896 repository-layout tutorial tutorial-2
897 workflows
901 _git_init ()
903 local cur="${COMP_WORDS[COMP_CWORD]}"
904 case "$cur" in
905 --shared=*)
906 __gitcomp "
907 false true umask group all world everybody
908 " "" "${cur##--shared=}"
909 return
911 --*)
912 __gitcomp "--quiet --bare --template= --shared --shared="
913 return
915 esac
916 COMPREPLY=()
919 _git_ls_files ()
921 __git_has_doubledash && return
923 local cur="${COMP_WORDS[COMP_CWORD]}"
924 case "$cur" in
925 --*)
926 __gitcomp "--cached --deleted --modified --others --ignored
927 --stage --directory --no-empty-directory --unmerged
928 --killed --exclude= --exclude-from=
929 --exclude-per-directory= --exclude-standard
930 --error-unmatch --with-tree= --full-name
931 --abbrev --ignored --exclude-per-directory
933 return
935 esac
936 COMPREPLY=()
939 _git_ls_remote ()
941 __gitcomp "$(__git_remotes)"
944 _git_ls_tree ()
946 __git_complete_file
949 _git_log ()
951 __git_has_doubledash && return
953 local cur="${COMP_WORDS[COMP_CWORD]}"
954 case "$cur" in
955 --pretty=*)
956 __gitcomp "
957 oneline short medium full fuller email raw
958 " "" "${cur##--pretty=}"
959 return
961 --date=*)
962 __gitcomp "
963 relative iso8601 rfc2822 short local default
964 " "" "${cur##--date=}"
965 return
967 --*)
968 __gitcomp "
969 --max-count= --max-age= --since= --after=
970 --min-age= --before= --until=
971 --root --topo-order --date-order --reverse
972 --no-merges --follow
973 --abbrev-commit --abbrev=
974 --relative-date --date=
975 --author= --committer= --grep=
976 --all-match
977 --pretty= --name-status --name-only --raw
978 --not --all
979 --left-right --cherry-pick
980 --graph
981 --stat --numstat --shortstat
982 --decorate --diff-filter=
983 --color-words --walk-reflogs
984 --parents --children --full-history
985 --merge
986 --inter-hunk-context=
988 return
990 esac
991 __git_complete_revlist
994 _git_merge ()
996 local cur="${COMP_WORDS[COMP_CWORD]}"
997 case "${COMP_WORDS[COMP_CWORD-1]}" in
998 -s|--strategy)
999 __gitcomp "$(__git_merge_strategies)"
1000 return
1001 esac
1002 case "$cur" in
1003 --strategy=*)
1004 __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
1005 return
1007 --*)
1008 __gitcomp "
1009 --no-commit --no-stat --log --no-log --squash --strategy
1011 return
1012 esac
1013 __gitcomp "$(__git_refs)"
1016 _git_mergetool ()
1018 local cur="${COMP_WORDS[COMP_CWORD]}"
1019 case "$cur" in
1020 --tool=*)
1021 __gitcomp "
1022 kdiff3 tkdiff meld xxdiff emerge
1023 vimdiff gvimdiff ecmerge opendiff
1024 " "" "${cur##--tool=}"
1025 return
1027 --*)
1028 __gitcomp "--tool="
1029 return
1031 esac
1032 COMPREPLY=()
1035 _git_merge_base ()
1037 __gitcomp "$(__git_refs)"
1040 _git_mv ()
1042 local cur="${COMP_WORDS[COMP_CWORD]}"
1043 case "$cur" in
1044 --*)
1045 __gitcomp "--dry-run"
1046 return
1048 esac
1049 COMPREPLY=()
1052 _git_name_rev ()
1054 __gitcomp "--tags --all --stdin"
1057 _git_pull ()
1059 local cur="${COMP_WORDS[COMP_CWORD]}"
1061 if [ "$COMP_CWORD" = 2 ]; then
1062 __gitcomp "$(__git_remotes)"
1063 else
1064 __gitcomp "$(__git_refs "${COMP_WORDS[2]}")"
1068 _git_push ()
1070 local cur="${COMP_WORDS[COMP_CWORD]}"
1072 if [ "$COMP_CWORD" = 2 ]; then
1073 __gitcomp "$(__git_remotes)"
1074 else
1075 case "$cur" in
1076 *:*)
1077 local pfx=""
1078 case "$COMP_WORDBREAKS" in
1079 *:*) : great ;;
1080 *) pfx="${cur%%:*}:" ;;
1081 esac
1083 __gitcomp "$(__git_refs "${COMP_WORDS[2]}")" "$pfx" "${cur#*:}"
1086 __gitcomp "$(__git_refs)" + "${cur#+}"
1089 __gitcomp "$(__git_refs)"
1091 esac
1095 _git_rebase ()
1097 local cur="${COMP_WORDS[COMP_CWORD]}" dir="$(__gitdir)"
1098 if [ -d "$dir"/rebase-apply ] || [ -d "$dir"/rebase-merge ]; then
1099 __gitcomp "--continue --skip --abort"
1100 return
1102 case "${COMP_WORDS[COMP_CWORD-1]}" in
1103 -s|--strategy)
1104 __gitcomp "$(__git_merge_strategies)"
1105 return
1106 esac
1107 case "$cur" in
1108 --strategy=*)
1109 __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
1110 return
1112 --*)
1113 __gitcomp "--onto --merge --strategy --interactive"
1114 return
1115 esac
1116 __gitcomp "$(__git_refs)"
1119 _git_send_email ()
1121 local cur="${COMP_WORDS[COMP_CWORD]}"
1122 case "$cur" in
1123 --*)
1124 __gitcomp "--bcc --cc --cc-cmd --chain-reply-to --compose
1125 --dry-run --envelope-sender --from --identity
1126 --in-reply-to --no-chain-reply-to --no-signed-off-by-cc
1127 --no-suppress-from --no-thread --quiet
1128 --signed-off-by-cc --smtp-pass --smtp-server
1129 --smtp-server-port --smtp-ssl --smtp-user --subject
1130 --suppress-cc --suppress-from --thread --to
1131 --validate --no-validate"
1132 return
1134 esac
1135 COMPREPLY=()
1138 _git_config ()
1140 local cur="${COMP_WORDS[COMP_CWORD]}"
1141 local prv="${COMP_WORDS[COMP_CWORD-1]}"
1142 case "$prv" in
1143 branch.*.remote)
1144 __gitcomp "$(__git_remotes)"
1145 return
1147 branch.*.merge)
1148 __gitcomp "$(__git_refs)"
1149 return
1151 remote.*.fetch)
1152 local remote="${prv#remote.}"
1153 remote="${remote%.fetch}"
1154 __gitcomp "$(__git_refs_remotes "$remote")"
1155 return
1157 remote.*.push)
1158 local remote="${prv#remote.}"
1159 remote="${remote%.push}"
1160 __gitcomp "$(git --git-dir="$(__gitdir)" \
1161 for-each-ref --format='%(refname):%(refname)' \
1162 refs/heads)"
1163 return
1165 pull.twohead|pull.octopus)
1166 __gitcomp "$(__git_merge_strategies)"
1167 return
1169 color.branch|color.diff|color.status)
1170 __gitcomp "always never auto"
1171 return
1173 color.*.*)
1174 __gitcomp "
1175 normal black red green yellow blue magenta cyan white
1176 bold dim ul blink reverse
1178 return
1180 *.*)
1181 COMPREPLY=()
1182 return
1184 esac
1185 case "$cur" in
1186 --*)
1187 __gitcomp "
1188 --global --system --file=
1189 --list --replace-all
1190 --get --get-all --get-regexp
1191 --add --unset --unset-all
1192 --remove-section --rename-section
1194 return
1196 branch.*.*)
1197 local pfx="${cur%.*}."
1198 cur="${cur##*.}"
1199 __gitcomp "remote merge mergeoptions" "$pfx" "$cur"
1200 return
1202 branch.*)
1203 local pfx="${cur%.*}."
1204 cur="${cur#*.}"
1205 __gitcomp "$(__git_heads)" "$pfx" "$cur" "."
1206 return
1208 remote.*.*)
1209 local pfx="${cur%.*}."
1210 cur="${cur##*.}"
1211 __gitcomp "
1212 url proxy fetch push mirror skipDefaultUpdate
1213 receivepack uploadpack tagopt
1214 " "$pfx" "$cur"
1215 return
1217 remote.*)
1218 local pfx="${cur%.*}."
1219 cur="${cur#*.}"
1220 __gitcomp "$(__git_remotes)" "$pfx" "$cur" "."
1221 return
1223 esac
1224 __gitcomp "
1225 apply.whitespace
1226 branch.autosetupmerge
1227 branch.autosetuprebase
1228 clean.requireForce
1229 color.branch
1230 color.branch.current
1231 color.branch.local
1232 color.branch.plain
1233 color.branch.remote
1234 color.diff
1235 color.diff.commit
1236 color.diff.frag
1237 color.diff.meta
1238 color.diff.new
1239 color.diff.old
1240 color.diff.plain
1241 color.diff.whitespace
1242 color.interactive
1243 color.interactive.header
1244 color.interactive.help
1245 color.interactive.prompt
1246 color.pager
1247 color.status
1248 color.status.added
1249 color.status.changed
1250 color.status.header
1251 color.status.nobranch
1252 color.status.untracked
1253 color.status.updated
1254 color.ui
1255 commit.template
1256 core.autocrlf
1257 core.bare
1258 core.compression
1259 core.deltaBaseCacheLimit
1260 core.editor
1261 core.excludesfile
1262 core.fileMode
1263 core.fsyncobjectfiles
1264 core.gitProxy
1265 core.ignoreCygwinFSTricks
1266 core.ignoreStat
1267 core.logAllRefUpdates
1268 core.loosecompression
1269 core.packedGitLimit
1270 core.packedGitWindowSize
1271 core.pager
1272 core.preferSymlinkRefs
1273 core.preloadindex
1274 core.quotepath
1275 core.repositoryFormatVersion
1276 core.safecrlf
1277 core.sharedRepository
1278 core.symlinks
1279 core.trustctime
1280 core.warnAmbiguousRefs
1281 core.whitespace
1282 core.worktree
1283 diff.autorefreshindex
1284 diff.external
1285 diff.mnemonicprefix
1286 diff.renameLimit
1287 diff.renameLimit.
1288 diff.renames
1289 fetch.unpackLimit
1290 format.headers
1291 format.numbered
1292 format.pretty
1293 format.suffix
1294 gc.aggressiveWindow
1295 gc.auto
1296 gc.autopacklimit
1297 gc.packrefs
1298 gc.pruneexpire
1299 gc.reflogexpire
1300 gc.reflogexpireunreachable
1301 gc.rerereresolved
1302 gc.rerereunresolved
1303 gitcvs.allbinary
1304 gitcvs.dbTableNamePrefix
1305 gitcvs.dbdriver
1306 gitcvs.dbname
1307 gitcvs.dbpass
1308 gitcvs.dbuser
1309 gitcvs.enabled
1310 gitcvs.logfile
1311 gitcvs.usecrlfattr
1312 gui.blamehistoryctx
1313 gui.commitmsgwidth
1314 gui.copyblamethreshold
1315 gui.diffcontext
1316 gui.encoding
1317 gui.fastcopyblame
1318 gui.matchtrackingbranch
1319 gui.newbranchtemplate
1320 gui.pruneduringfetch
1321 gui.spellingdictionary
1322 gui.trustmtime
1323 help.autocorrect
1324 help.browser
1325 help.format
1326 http.lowSpeedLimit
1327 http.lowSpeedTime
1328 http.maxRequests
1329 http.noEPSV
1330 http.proxy
1331 http.sslCAInfo
1332 http.sslCAPath
1333 http.sslCert
1334 http.sslKey
1335 http.sslVerify
1336 i18n.commitEncoding
1337 i18n.logOutputEncoding
1338 instaweb.browser
1339 instaweb.httpd
1340 instaweb.local
1341 instaweb.modulepath
1342 instaweb.port
1343 log.date
1344 log.showroot
1345 man.viewer
1346 merge.conflictstyle
1347 merge.log
1348 merge.renameLimit
1349 merge.stat
1350 merge.tool
1351 merge.verbosity
1352 mergetool.keepBackup
1353 pack.compression
1354 pack.deltaCacheLimit
1355 pack.deltaCacheSize
1356 pack.depth
1357 pack.indexVersion
1358 pack.packSizeLimit
1359 pack.threads
1360 pack.window
1361 pack.windowMemory
1362 pull.octopus
1363 pull.twohead
1364 receive.denyCurrentBranch
1365 receive.denyDeletes
1366 receive.denyNonFastForwards
1367 receive.fsckObjects
1368 receive.unpackLimit
1369 repack.usedeltabaseoffset
1370 rerere.autoupdate
1371 rerere.enabled
1372 showbranch.default
1373 status.relativePaths
1374 status.showUntrackedFiles
1375 tar.umask
1376 transfer.unpackLimit
1377 user.email
1378 user.name
1379 user.signingkey
1380 web.browser
1381 branch. remote.
1385 _git_remote ()
1387 local subcommands="add rm show prune update"
1388 local subcommand="$(__git_find_subcommand "$subcommands")"
1389 if [ -z "$subcommand" ]; then
1390 __gitcomp "$subcommands"
1391 return
1394 case "$subcommand" in
1395 rm|show|prune)
1396 __gitcomp "$(__git_remotes)"
1398 update)
1399 local i c='' IFS=$'\n'
1400 for i in $(git --git-dir="$(__gitdir)" config --list); do
1401 case "$i" in
1402 remotes.*)
1403 i="${i#remotes.}"
1404 c="$c ${i/=*/}"
1406 esac
1407 done
1408 __gitcomp "$c"
1411 COMPREPLY=()
1413 esac
1416 _git_reset ()
1418 __git_has_doubledash && return
1420 local cur="${COMP_WORDS[COMP_CWORD]}"
1421 case "$cur" in
1422 --*)
1423 __gitcomp "--merge --mixed --hard --soft"
1424 return
1426 esac
1427 __gitcomp "$(__git_refs)"
1430 _git_revert ()
1432 local cur="${COMP_WORDS[COMP_CWORD]}"
1433 case "$cur" in
1434 --*)
1435 __gitcomp "--edit --mainline --no-edit --no-commit --signoff"
1436 return
1438 esac
1439 __gitcomp "$(__git_refs)"
1442 _git_rm ()
1444 __git_has_doubledash && return
1446 local cur="${COMP_WORDS[COMP_CWORD]}"
1447 case "$cur" in
1448 --*)
1449 __gitcomp "--cached --dry-run --ignore-unmatch --quiet"
1450 return
1452 esac
1453 COMPREPLY=()
1456 _git_shortlog ()
1458 __git_has_doubledash && return
1460 local cur="${COMP_WORDS[COMP_CWORD]}"
1461 case "$cur" in
1462 --*)
1463 __gitcomp "
1464 --max-count= --max-age= --since= --after=
1465 --min-age= --before= --until=
1466 --no-merges
1467 --author= --committer= --grep=
1468 --all-match
1469 --not --all
1470 --numbered --summary
1472 return
1474 esac
1475 __git_complete_revlist
1478 _git_show ()
1480 __git_has_doubledash && return
1482 local cur="${COMP_WORDS[COMP_CWORD]}"
1483 case "$cur" in
1484 --pretty=*)
1485 __gitcomp "
1486 oneline short medium full fuller email raw
1487 " "" "${cur##--pretty=}"
1488 return
1490 --*)
1491 __gitcomp "--pretty="
1492 return
1494 esac
1495 __git_complete_file
1498 _git_show_branch ()
1500 local cur="${COMP_WORDS[COMP_CWORD]}"
1501 case "$cur" in
1502 --*)
1503 __gitcomp "
1504 --all --remotes --topo-order --current --more=
1505 --list --independent --merge-base --no-name
1506 --sha1-name --topics --reflog
1508 return
1510 esac
1511 __git_complete_revlist
1514 _git_stash ()
1516 local subcommands='save list show apply clear drop pop create branch'
1517 local subcommand="$(__git_find_subcommand "$subcommands")"
1518 if [ -z "$subcommand" ]; then
1519 __gitcomp "$subcommands"
1520 else
1521 local cur="${COMP_WORDS[COMP_CWORD]}"
1522 case "$subcommand,$cur" in
1523 save,--*)
1524 __gitcomp "--keep-index"
1526 apply,--*)
1527 __gitcomp "--index"
1529 show,--*|drop,--*|pop,--*|branch,--*)
1530 COMPREPLY=()
1532 show,*|apply,*|drop,*|pop,*|branch,*)
1533 __gitcomp "$(git --git-dir="$(__gitdir)" stash list \
1534 | sed -n -e 's/:.*//p')"
1537 COMPREPLY=()
1539 esac
1543 _git_submodule ()
1545 __git_has_doubledash && return
1547 local subcommands="add status init update summary foreach sync"
1548 if [ -z "$(__git_find_subcommand "$subcommands")" ]; then
1549 local cur="${COMP_WORDS[COMP_CWORD]}"
1550 case "$cur" in
1551 --*)
1552 __gitcomp "--quiet --cached"
1555 __gitcomp "$subcommands"
1557 esac
1558 return
1562 _git_svn ()
1564 local subcommands="
1565 init fetch clone rebase dcommit log find-rev
1566 set-tree commit-diff info create-ignore propget
1567 proplist show-ignore show-externals
1569 local subcommand="$(__git_find_subcommand "$subcommands")"
1570 if [ -z "$subcommand" ]; then
1571 __gitcomp "$subcommands"
1572 else
1573 local remote_opts="--username= --config-dir= --no-auth-cache"
1574 local fc_opts="
1575 --follow-parent --authors-file= --repack=
1576 --no-metadata --use-svm-props --use-svnsync-props
1577 --log-window-size= --no-checkout --quiet
1578 --repack-flags --user-log-author $remote_opts
1580 local init_opts="
1581 --template= --shared= --trunk= --tags=
1582 --branches= --stdlayout --minimize-url
1583 --no-metadata --use-svm-props --use-svnsync-props
1584 --rewrite-root= $remote_opts
1586 local cmt_opts="
1587 --edit --rmdir --find-copies-harder --copy-similarity=
1590 local cur="${COMP_WORDS[COMP_CWORD]}"
1591 case "$subcommand,$cur" in
1592 fetch,--*)
1593 __gitcomp "--revision= --fetch-all $fc_opts"
1595 clone,--*)
1596 __gitcomp "--revision= $fc_opts $init_opts"
1598 init,--*)
1599 __gitcomp "$init_opts"
1601 dcommit,--*)
1602 __gitcomp "
1603 --merge --strategy= --verbose --dry-run
1604 --fetch-all --no-rebase $cmt_opts $fc_opts
1607 set-tree,--*)
1608 __gitcomp "--stdin $cmt_opts $fc_opts"
1610 create-ignore,--*|propget,--*|proplist,--*|show-ignore,--*|\
1611 show-externals,--*)
1612 __gitcomp "--revision="
1614 log,--*)
1615 __gitcomp "
1616 --limit= --revision= --verbose --incremental
1617 --oneline --show-commit --non-recursive
1618 --authors-file=
1621 rebase,--*)
1622 __gitcomp "
1623 --merge --verbose --strategy= --local
1624 --fetch-all $fc_opts
1627 commit-diff,--*)
1628 __gitcomp "--message= --file= --revision= $cmt_opts"
1630 info,--*)
1631 __gitcomp "--url"
1634 COMPREPLY=()
1636 esac
1640 _git_tag ()
1642 local i c=1 f=0
1643 while [ $c -lt $COMP_CWORD ]; do
1644 i="${COMP_WORDS[c]}"
1645 case "$i" in
1646 -d|-v)
1647 __gitcomp "$(__git_tags)"
1648 return
1653 esac
1654 c=$((++c))
1655 done
1657 case "${COMP_WORDS[COMP_CWORD-1]}" in
1658 -m|-F)
1659 COMPREPLY=()
1661 -*|tag)
1662 if [ $f = 1 ]; then
1663 __gitcomp "$(__git_tags)"
1664 else
1665 COMPREPLY=()
1669 __gitcomp "$(__git_refs)"
1671 esac
1674 _git ()
1676 local i c=1 command __git_dir
1678 while [ $c -lt $COMP_CWORD ]; do
1679 i="${COMP_WORDS[c]}"
1680 case "$i" in
1681 --git-dir=*) __git_dir="${i#--git-dir=}" ;;
1682 --bare) __git_dir="." ;;
1683 --version|-p|--paginate) ;;
1684 --help) command="help"; break ;;
1685 *) command="$i"; break ;;
1686 esac
1687 c=$((++c))
1688 done
1690 if [ -z "$command" ]; then
1691 case "${COMP_WORDS[COMP_CWORD]}" in
1692 --*=*) COMPREPLY=() ;;
1693 --*) __gitcomp "
1694 --paginate
1695 --no-pager
1696 --git-dir=
1697 --bare
1698 --version
1699 --exec-path
1700 --work-tree=
1701 --help
1704 *) __gitcomp "$(__git_porcelain_commands) $(__git_aliases)" ;;
1705 esac
1706 return
1709 local expansion=$(__git_aliased_command "$command")
1710 [ "$expansion" ] && command="$expansion"
1712 case "$command" in
1713 am) _git_am ;;
1714 add) _git_add ;;
1715 apply) _git_apply ;;
1716 archive) _git_archive ;;
1717 bisect) _git_bisect ;;
1718 bundle) _git_bundle ;;
1719 branch) _git_branch ;;
1720 checkout) _git_checkout ;;
1721 cherry) _git_cherry ;;
1722 cherry-pick) _git_cherry_pick ;;
1723 clean) _git_clean ;;
1724 clone) _git_clone ;;
1725 commit) _git_commit ;;
1726 config) _git_config ;;
1727 describe) _git_describe ;;
1728 diff) _git_diff ;;
1729 fetch) _git_fetch ;;
1730 format-patch) _git_format_patch ;;
1731 gc) _git_gc ;;
1732 grep) _git_grep ;;
1733 help) _git_help ;;
1734 init) _git_init ;;
1735 log) _git_log ;;
1736 ls-files) _git_ls_files ;;
1737 ls-remote) _git_ls_remote ;;
1738 ls-tree) _git_ls_tree ;;
1739 merge) _git_merge;;
1740 mergetool) _git_mergetool;;
1741 merge-base) _git_merge_base ;;
1742 mv) _git_mv ;;
1743 name-rev) _git_name_rev ;;
1744 pull) _git_pull ;;
1745 push) _git_push ;;
1746 rebase) _git_rebase ;;
1747 remote) _git_remote ;;
1748 reset) _git_reset ;;
1749 revert) _git_revert ;;
1750 rm) _git_rm ;;
1751 send-email) _git_send_email ;;
1752 shortlog) _git_shortlog ;;
1753 show) _git_show ;;
1754 show-branch) _git_show_branch ;;
1755 stash) _git_stash ;;
1756 stage) _git_add ;;
1757 submodule) _git_submodule ;;
1758 svn) _git_svn ;;
1759 tag) _git_tag ;;
1760 whatchanged) _git_log ;;
1761 *) COMPREPLY=() ;;
1762 esac
1765 _gitk ()
1767 __git_has_doubledash && return
1769 local cur="${COMP_WORDS[COMP_CWORD]}"
1770 local g="$(git rev-parse --git-dir 2>/dev/null)"
1771 local merge=""
1772 if [ -f $g/MERGE_HEAD ]; then
1773 merge="--merge"
1775 case "$cur" in
1776 --*)
1777 __gitcomp "--not --all $merge"
1778 return
1780 esac
1781 __git_complete_revlist
1784 complete -o bashdefault -o default -o nospace -F _git git 2>/dev/null \
1785 || complete -o default -o nospace -F _git git
1786 complete -o bashdefault -o default -o nospace -F _gitk gitk 2>/dev/null \
1787 || complete -o default -o nospace -F _gitk gitk
1789 # The following are necessary only for Cygwin, and only are needed
1790 # when the user has tab-completed the executable name and consequently
1791 # included the '.exe' suffix.
1793 if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
1794 complete -o bashdefault -o default -o nospace -F _git git.exe 2>/dev/null \
1795 || complete -o default -o nospace -F _git git.exe