Speed up bash completion loading
[git/dkf.git] / contrib / completion / git-completion.bash
blobf67254d3d1e71f715d7e141241b6f8fc9ec360e0
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) Consider changing your PS1 to also show the current branch:
25 # PS1='[\u@\h \W$(__git_ps1 " (%s)")]\$ '
27 # The argument to __git_ps1 will be displayed only if you
28 # are currently in a git repository. The %s token will be
29 # the name of the current branch.
31 # In addition, if you set GIT_PS1_SHOWDIRTYSTATE to a nonempty
32 # value, unstaged (*) and staged (+) changes will be shown next
33 # to the branch name. You can configure this per-repository
34 # with the bash.showDirtyState variable, which defaults to true
35 # once GIT_PS1_SHOWDIRTYSTATE is enabled.
37 # You can also see if currently something is stashed, by setting
38 # GIT_PS1_SHOWSTASHSTATE to a nonempty value. If something is stashed,
39 # then a '$' will be shown next to the branch name.
41 # If you would like to see if there're untracked files, then you can
42 # set GIT_PS1_SHOWUNTRACKEDFILES to a nonempty value. If there're
43 # untracked files, then a '%' will be shown next to the branch name.
45 # To submit patches:
47 # *) Read Documentation/SubmittingPatches
48 # *) Send all patches to the current maintainer:
50 # "Shawn O. Pearce" <spearce@spearce.org>
52 # *) Always CC the Git mailing list:
54 # git@vger.kernel.org
57 case "$COMP_WORDBREAKS" in
58 *:*) : great ;;
59 *) COMP_WORDBREAKS="$COMP_WORDBREAKS:"
60 esac
62 # __gitdir accepts 0 or 1 arguments (i.e., location)
63 # returns location of .git repo
64 __gitdir ()
66 if [ -z "${1-}" ]; then
67 if [ -n "${__git_dir-}" ]; then
68 echo "$__git_dir"
69 elif [ -d .git ]; then
70 echo .git
71 else
72 git rev-parse --git-dir 2>/dev/null
74 elif [ -d "$1/.git" ]; then
75 echo "$1/.git"
76 else
77 echo "$1"
81 # __git_ps1 accepts 0 or 1 arguments (i.e., format string)
82 # returns text to add to bash PS1 prompt (includes branch name)
83 __git_ps1 ()
85 local g="$(__gitdir)"
86 if [ -n "$g" ]; then
87 local r
88 local b
89 if [ -f "$g/rebase-merge/interactive" ]; then
90 r="|REBASE-i"
91 b="$(cat "$g/rebase-merge/head-name")"
92 elif [ -d "$g/rebase-merge" ]; then
93 r="|REBASE-m"
94 b="$(cat "$g/rebase-merge/head-name")"
95 else
96 if [ -d "$g/rebase-apply" ]; then
97 if [ -f "$g/rebase-apply/rebasing" ]; then
98 r="|REBASE"
99 elif [ -f "$g/rebase-apply/applying" ]; then
100 r="|AM"
101 else
102 r="|AM/REBASE"
104 elif [ -f "$g/MERGE_HEAD" ]; then
105 r="|MERGING"
106 elif [ -f "$g/BISECT_LOG" ]; then
107 r="|BISECTING"
110 b="$(git symbolic-ref HEAD 2>/dev/null)" || {
112 b="$(
113 case "${GIT_PS1_DESCRIBE_STYLE-}" in
114 (contains)
115 git describe --contains HEAD ;;
116 (branch)
117 git describe --contains --all HEAD ;;
118 (describe)
119 git describe HEAD ;;
120 (* | default)
121 git describe --exact-match HEAD ;;
122 esac 2>/dev/null)" ||
124 b="$(cut -c1-7 "$g/HEAD" 2>/dev/null)..." ||
125 b="unknown"
126 b="($b)"
130 local w
131 local i
132 local s
133 local u
134 local c
136 if [ "true" = "$(git rev-parse --is-inside-git-dir 2>/dev/null)" ]; then
137 if [ "true" = "$(git rev-parse --is-bare-repository 2>/dev/null)" ]; then
138 c="BARE:"
139 else
140 b="GIT_DIR!"
142 elif [ "true" = "$(git rev-parse --is-inside-work-tree 2>/dev/null)" ]; then
143 if [ -n "${GIT_PS1_SHOWDIRTYSTATE-}" ]; then
144 if [ "$(git config --bool bash.showDirtyState)" != "false" ]; then
145 git diff --no-ext-diff --ignore-submodules \
146 --quiet --exit-code || w="*"
147 if git rev-parse --quiet --verify HEAD >/dev/null; then
148 git diff-index --cached --quiet \
149 --ignore-submodules HEAD -- || i="+"
150 else
151 i="#"
155 if [ -n "${GIT_PS1_SHOWSTASHSTATE-}" ]; then
156 git rev-parse --verify refs/stash >/dev/null 2>&1 && s="$"
159 if [ -n "${GIT_PS1_SHOWUNTRACKEDFILES-}" ]; then
160 if [ -n "$(git ls-files --others --exclude-standard)" ]; then
161 u="%"
166 if [ -n "${1-}" ]; then
167 printf "$1" "$c${b##refs/heads/}$w$i$s$u$r"
168 else
169 printf " (%s)" "$c${b##refs/heads/}$w$i$s$u$r"
174 # __gitcomp_1 requires 2 arguments
175 __gitcomp_1 ()
177 local c IFS=' '$'\t'$'\n'
178 for c in $1; do
179 case "$c$2" in
180 --*=*) printf %s$'\n' "$c$2" ;;
181 *.) printf %s$'\n' "$c$2" ;;
182 *) printf %s$'\n' "$c$2 " ;;
183 esac
184 done
187 # __gitcomp accepts 1, 2, 3, or 4 arguments
188 # generates completion reply with compgen
189 __gitcomp ()
191 local cur="${COMP_WORDS[COMP_CWORD]}"
192 if [ $# -gt 2 ]; then
193 cur="$3"
195 case "$cur" in
196 --*=)
197 COMPREPLY=()
200 local IFS=$'\n'
201 COMPREPLY=($(compgen -P "${2-}" \
202 -W "$(__gitcomp_1 "${1-}" "${4-}")" \
203 -- "$cur"))
205 esac
208 # __git_heads accepts 0 or 1 arguments (to pass to __gitdir)
209 __git_heads ()
211 local cmd i is_hash=y dir="$(__gitdir "${1-}")"
212 if [ -d "$dir" ]; then
213 git --git-dir="$dir" for-each-ref --format='%(refname:short)' \
214 refs/heads
215 return
217 for i in $(git ls-remote "${1-}" 2>/dev/null); do
218 case "$is_hash,$i" in
219 y,*) is_hash=n ;;
220 n,*^{}) is_hash=y ;;
221 n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;
222 n,*) is_hash=y; echo "$i" ;;
223 esac
224 done
227 # __git_tags accepts 0 or 1 arguments (to pass to __gitdir)
228 __git_tags ()
230 local cmd i is_hash=y dir="$(__gitdir "${1-}")"
231 if [ -d "$dir" ]; then
232 git --git-dir="$dir" for-each-ref --format='%(refname:short)' \
233 refs/tags
234 return
236 for i in $(git ls-remote "${1-}" 2>/dev/null); do
237 case "$is_hash,$i" in
238 y,*) is_hash=n ;;
239 n,*^{}) is_hash=y ;;
240 n,refs/tags/*) is_hash=y; echo "${i#refs/tags/}" ;;
241 n,*) is_hash=y; echo "$i" ;;
242 esac
243 done
246 # __git_refs accepts 0 or 1 arguments (to pass to __gitdir)
247 __git_refs ()
249 local i is_hash=y dir="$(__gitdir "${1-}")"
250 local cur="${COMP_WORDS[COMP_CWORD]}" format refs
251 if [ -d "$dir" ]; then
252 case "$cur" in
253 refs|refs/*)
254 format="refname"
255 refs="${cur%/*}"
258 if [ -e "$dir/HEAD" ]; then echo HEAD; fi
259 format="refname:short"
260 refs="refs/tags refs/heads refs/remotes"
262 esac
263 git --git-dir="$dir" for-each-ref --format="%($format)" \
264 $refs
265 return
267 for i in $(git ls-remote "$dir" 2>/dev/null); do
268 case "$is_hash,$i" in
269 y,*) is_hash=n ;;
270 n,*^{}) is_hash=y ;;
271 n,refs/tags/*) is_hash=y; echo "${i#refs/tags/}" ;;
272 n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;
273 n,refs/remotes/*) is_hash=y; echo "${i#refs/remotes/}" ;;
274 n,*) is_hash=y; echo "$i" ;;
275 esac
276 done
279 # __git_refs2 requires 1 argument (to pass to __git_refs)
280 __git_refs2 ()
282 local i
283 for i in $(__git_refs "$1"); do
284 echo "$i:$i"
285 done
288 # __git_refs_remotes requires 1 argument (to pass to ls-remote)
289 __git_refs_remotes ()
291 local cmd i is_hash=y
292 for i in $(git ls-remote "$1" 2>/dev/null); do
293 case "$is_hash,$i" in
294 n,refs/heads/*)
295 is_hash=y
296 echo "$i:refs/remotes/$1/${i#refs/heads/}"
298 y,*) is_hash=n ;;
299 n,*^{}) is_hash=y ;;
300 n,refs/tags/*) is_hash=y;;
301 n,*) is_hash=y; ;;
302 esac
303 done
306 __git_remotes ()
308 local i ngoff IFS=$'\n' d="$(__gitdir)"
309 shopt -q nullglob || ngoff=1
310 shopt -s nullglob
311 for i in "$d/remotes"/*; do
312 echo ${i#$d/remotes/}
313 done
314 [ "$ngoff" ] && shopt -u nullglob
315 for i in $(git --git-dir="$d" config --get-regexp 'remote\..*\.url' 2>/dev/null); do
316 i="${i#remote.}"
317 echo "${i/.url*/}"
318 done
321 __git_list_merge_strategies ()
323 git merge -s help 2>&1 |
324 sed -n -e '/[Aa]vailable strategies are: /,/^$/{
325 s/\.$//
326 s/.*://
327 s/^[ ]*//
328 s/[ ]*$//
333 __git_merge_strategies=
334 # 'git merge -s help' (and thus detection of the merge strategy
335 # list) fails, unfortunately, if run outside of any git working
336 # tree. __git_merge_strategies is set to the empty string in
337 # that case, and the detection will be repeated the next time it
338 # is needed.
339 __git_compute_merge_strategies ()
341 : ${__git_merge_strategies:=$(__git_list_merge_strategies)}
344 __git_complete_file ()
346 local pfx ls ref cur="${COMP_WORDS[COMP_CWORD]}"
347 case "$cur" in
348 ?*:*)
349 ref="${cur%%:*}"
350 cur="${cur#*:}"
351 case "$cur" in
352 ?*/*)
353 pfx="${cur%/*}"
354 cur="${cur##*/}"
355 ls="$ref:$pfx"
356 pfx="$pfx/"
359 ls="$ref"
361 esac
363 case "$COMP_WORDBREAKS" in
364 *:*) : great ;;
365 *) pfx="$ref:$pfx" ;;
366 esac
368 local IFS=$'\n'
369 COMPREPLY=($(compgen -P "$pfx" \
370 -W "$(git --git-dir="$(__gitdir)" ls-tree "$ls" \
371 | sed '/^100... blob /{
372 s,^.* ,,
373 s,$, ,
375 /^120000 blob /{
376 s,^.* ,,
377 s,$, ,
379 /^040000 tree /{
380 s,^.* ,,
381 s,$,/,
383 s/^.* //')" \
384 -- "$cur"))
387 __gitcomp "$(__git_refs)"
389 esac
392 __git_complete_revlist ()
394 local pfx cur="${COMP_WORDS[COMP_CWORD]}"
395 case "$cur" in
396 *...*)
397 pfx="${cur%...*}..."
398 cur="${cur#*...}"
399 __gitcomp "$(__git_refs)" "$pfx" "$cur"
401 *..*)
402 pfx="${cur%..*}.."
403 cur="${cur#*..}"
404 __gitcomp "$(__git_refs)" "$pfx" "$cur"
407 __gitcomp "$(__git_refs)"
409 esac
412 __git_complete_remote_or_refspec ()
414 local cmd="${COMP_WORDS[1]}"
415 local cur="${COMP_WORDS[COMP_CWORD]}"
416 local i c=2 remote="" pfx="" lhs=1 no_complete_refspec=0
417 while [ $c -lt $COMP_CWORD ]; do
418 i="${COMP_WORDS[c]}"
419 case "$i" in
420 --all|--mirror) [ "$cmd" = "push" ] && no_complete_refspec=1 ;;
421 -*) ;;
422 *) remote="$i"; break ;;
423 esac
424 c=$((++c))
425 done
426 if [ -z "$remote" ]; then
427 __gitcomp "$(__git_remotes)"
428 return
430 if [ $no_complete_refspec = 1 ]; then
431 COMPREPLY=()
432 return
434 [ "$remote" = "." ] && remote=
435 case "$cur" in
436 *:*)
437 case "$COMP_WORDBREAKS" in
438 *:*) : great ;;
439 *) pfx="${cur%%:*}:" ;;
440 esac
441 cur="${cur#*:}"
442 lhs=0
445 pfx="+"
446 cur="${cur#+}"
448 esac
449 case "$cmd" in
450 fetch)
451 if [ $lhs = 1 ]; then
452 __gitcomp "$(__git_refs2 "$remote")" "$pfx" "$cur"
453 else
454 __gitcomp "$(__git_refs)" "$pfx" "$cur"
457 pull)
458 if [ $lhs = 1 ]; then
459 __gitcomp "$(__git_refs "$remote")" "$pfx" "$cur"
460 else
461 __gitcomp "$(__git_refs)" "$pfx" "$cur"
464 push)
465 if [ $lhs = 1 ]; then
466 __gitcomp "$(__git_refs)" "$pfx" "$cur"
467 else
468 __gitcomp "$(__git_refs "$remote")" "$pfx" "$cur"
471 esac
474 __git_complete_strategy ()
476 __git_compute_merge_strategies
477 case "${COMP_WORDS[COMP_CWORD-1]}" in
478 -s|--strategy)
479 __gitcomp "$__git_merge_strategies"
480 return 0
481 esac
482 local cur="${COMP_WORDS[COMP_CWORD]}"
483 case "$cur" in
484 --strategy=*)
485 __gitcomp "$__git_merge_strategies" "" "${cur##--strategy=}"
486 return 0
488 esac
489 return 1
492 __git_list_all_commands ()
494 local i IFS=" "$'\n'
495 for i in $(git help -a|egrep '^ [a-zA-Z0-9]')
497 case $i in
498 *--*) : helper pattern;;
499 *) echo $i;;
500 esac
501 done
504 __git_all_commands=
505 __git_compute_all_commands ()
507 : ${__git_all_commands:=$(__git_list_all_commands)}
510 __git_list_porcelain_commands ()
512 local i IFS=" "$'\n'
513 __git_compute_all_commands
514 for i in "help" $__git_all_commands
516 case $i in
517 *--*) : helper pattern;;
518 applymbox) : ask gittus;;
519 applypatch) : ask gittus;;
520 archimport) : import;;
521 cat-file) : plumbing;;
522 check-attr) : plumbing;;
523 check-ref-format) : plumbing;;
524 checkout-index) : plumbing;;
525 commit-tree) : plumbing;;
526 count-objects) : infrequent;;
527 cvsexportcommit) : export;;
528 cvsimport) : import;;
529 cvsserver) : daemon;;
530 daemon) : daemon;;
531 diff-files) : plumbing;;
532 diff-index) : plumbing;;
533 diff-tree) : plumbing;;
534 fast-import) : import;;
535 fast-export) : export;;
536 fsck-objects) : plumbing;;
537 fetch-pack) : plumbing;;
538 fmt-merge-msg) : plumbing;;
539 for-each-ref) : plumbing;;
540 hash-object) : plumbing;;
541 http-*) : transport;;
542 index-pack) : plumbing;;
543 init-db) : deprecated;;
544 local-fetch) : plumbing;;
545 lost-found) : infrequent;;
546 ls-files) : plumbing;;
547 ls-remote) : plumbing;;
548 ls-tree) : plumbing;;
549 mailinfo) : plumbing;;
550 mailsplit) : plumbing;;
551 merge-*) : plumbing;;
552 mktree) : plumbing;;
553 mktag) : plumbing;;
554 pack-objects) : plumbing;;
555 pack-redundant) : plumbing;;
556 pack-refs) : plumbing;;
557 parse-remote) : plumbing;;
558 patch-id) : plumbing;;
559 peek-remote) : plumbing;;
560 prune) : plumbing;;
561 prune-packed) : plumbing;;
562 quiltimport) : import;;
563 read-tree) : plumbing;;
564 receive-pack) : plumbing;;
565 reflog) : plumbing;;
566 repo-config) : deprecated;;
567 rerere) : plumbing;;
568 rev-list) : plumbing;;
569 rev-parse) : plumbing;;
570 runstatus) : plumbing;;
571 sh-setup) : internal;;
572 shell) : daemon;;
573 show-ref) : plumbing;;
574 send-pack) : plumbing;;
575 show-index) : plumbing;;
576 ssh-*) : transport;;
577 stripspace) : plumbing;;
578 symbolic-ref) : plumbing;;
579 tar-tree) : deprecated;;
580 unpack-file) : plumbing;;
581 unpack-objects) : plumbing;;
582 update-index) : plumbing;;
583 update-ref) : plumbing;;
584 update-server-info) : daemon;;
585 upload-archive) : plumbing;;
586 upload-pack) : plumbing;;
587 write-tree) : plumbing;;
588 var) : infrequent;;
589 verify-pack) : infrequent;;
590 verify-tag) : plumbing;;
591 *) echo $i;;
592 esac
593 done
596 __git_porcelain_commands=
597 __git_compute_porcelain_commands ()
599 __git_compute_all_commands
600 : ${__git_porcelain_commands:=$(__git_list_porcelain_commands)}
603 __git_aliases ()
605 local i IFS=$'\n'
606 for i in $(git --git-dir="$(__gitdir)" config --get-regexp "alias\..*" 2>/dev/null); do
607 case "$i" in
608 alias.*)
609 i="${i#alias.}"
610 echo "${i/ */}"
612 esac
613 done
616 # __git_aliased_command requires 1 argument
617 __git_aliased_command ()
619 local word cmdline=$(git --git-dir="$(__gitdir)" \
620 config --get "alias.$1")
621 for word in $cmdline; do
622 if [ "${word##-*}" ]; then
623 echo $word
624 return
626 done
629 # __git_find_on_cmdline requires 1 argument
630 __git_find_on_cmdline ()
632 local word subcommand c=1
634 while [ $c -lt $COMP_CWORD ]; do
635 word="${COMP_WORDS[c]}"
636 for subcommand in $1; do
637 if [ "$subcommand" = "$word" ]; then
638 echo "$subcommand"
639 return
641 done
642 c=$((++c))
643 done
646 __git_has_doubledash ()
648 local c=1
649 while [ $c -lt $COMP_CWORD ]; do
650 if [ "--" = "${COMP_WORDS[c]}" ]; then
651 return 0
653 c=$((++c))
654 done
655 return 1
658 __git_whitespacelist="nowarn warn error error-all fix"
660 _git_am ()
662 local cur="${COMP_WORDS[COMP_CWORD]}" dir="$(__gitdir)"
663 if [ -d "$dir"/rebase-apply ]; then
664 __gitcomp "--skip --resolved --abort"
665 return
667 case "$cur" in
668 --whitespace=*)
669 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
670 return
672 --*)
673 __gitcomp "
674 --3way --committer-date-is-author-date --ignore-date
675 --ignore-whitespace --ignore-space-change
676 --interactive --keep --no-utf8 --signoff --utf8
677 --whitespace= --scissors
679 return
680 esac
681 COMPREPLY=()
684 _git_apply ()
686 local cur="${COMP_WORDS[COMP_CWORD]}"
687 case "$cur" in
688 --whitespace=*)
689 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
690 return
692 --*)
693 __gitcomp "
694 --stat --numstat --summary --check --index
695 --cached --index-info --reverse --reject --unidiff-zero
696 --apply --no-add --exclude=
697 --ignore-whitespace --ignore-space-change
698 --whitespace= --inaccurate-eof --verbose
700 return
701 esac
702 COMPREPLY=()
705 _git_add ()
707 __git_has_doubledash && return
709 local cur="${COMP_WORDS[COMP_CWORD]}"
710 case "$cur" in
711 --*)
712 __gitcomp "
713 --interactive --refresh --patch --update --dry-run
714 --ignore-errors --intent-to-add
716 return
717 esac
718 COMPREPLY=()
721 _git_archive ()
723 local cur="${COMP_WORDS[COMP_CWORD]}"
724 case "$cur" in
725 --format=*)
726 __gitcomp "$(git archive --list)" "" "${cur##--format=}"
727 return
729 --remote=*)
730 __gitcomp "$(__git_remotes)" "" "${cur##--remote=}"
731 return
733 --*)
734 __gitcomp "
735 --format= --list --verbose
736 --prefix= --remote= --exec=
738 return
740 esac
741 __git_complete_file
744 _git_bisect ()
746 __git_has_doubledash && return
748 local subcommands="start bad good skip reset visualize replay log run"
749 local subcommand="$(__git_find_on_cmdline "$subcommands")"
750 if [ -z "$subcommand" ]; then
751 __gitcomp "$subcommands"
752 return
755 case "$subcommand" in
756 bad|good|reset|skip)
757 __gitcomp "$(__git_refs)"
760 COMPREPLY=()
762 esac
765 _git_branch ()
767 local i c=1 only_local_ref="n" has_r="n"
769 while [ $c -lt $COMP_CWORD ]; do
770 i="${COMP_WORDS[c]}"
771 case "$i" in
772 -d|-m) only_local_ref="y" ;;
773 -r) has_r="y" ;;
774 esac
775 c=$((++c))
776 done
778 case "${COMP_WORDS[COMP_CWORD]}" in
779 --*)
780 __gitcomp "
781 --color --no-color --verbose --abbrev= --no-abbrev
782 --track --no-track --contains --merged --no-merged
786 if [ $only_local_ref = "y" -a $has_r = "n" ]; then
787 __gitcomp "$(__git_heads)"
788 else
789 __gitcomp "$(__git_refs)"
792 esac
795 _git_bundle ()
797 local cmd="${COMP_WORDS[2]}"
798 case "$COMP_CWORD" in
800 __gitcomp "create list-heads verify unbundle"
803 # looking for a file
806 case "$cmd" in
807 create)
808 __git_complete_revlist
810 esac
812 esac
815 _git_checkout ()
817 __git_has_doubledash && return
819 local cur="${COMP_WORDS[COMP_CWORD]}"
820 case "$cur" in
821 --conflict=*)
822 __gitcomp "diff3 merge" "" "${cur##--conflict=}"
824 --*)
825 __gitcomp "
826 --quiet --ours --theirs --track --no-track --merge
827 --conflict= --patch
831 __gitcomp "$(__git_refs)"
833 esac
836 _git_cherry ()
838 __gitcomp "$(__git_refs)"
841 _git_cherry_pick ()
843 local cur="${COMP_WORDS[COMP_CWORD]}"
844 case "$cur" in
845 --*)
846 __gitcomp "--edit --no-commit"
849 __gitcomp "$(__git_refs)"
851 esac
854 _git_clean ()
856 __git_has_doubledash && return
858 local cur="${COMP_WORDS[COMP_CWORD]}"
859 case "$cur" in
860 --*)
861 __gitcomp "--dry-run --quiet"
862 return
864 esac
865 COMPREPLY=()
868 _git_clone ()
870 local cur="${COMP_WORDS[COMP_CWORD]}"
871 case "$cur" in
872 --*)
873 __gitcomp "
874 --local
875 --no-hardlinks
876 --shared
877 --reference
878 --quiet
879 --no-checkout
880 --bare
881 --mirror
882 --origin
883 --upload-pack
884 --template=
885 --depth
887 return
889 esac
890 COMPREPLY=()
893 _git_commit ()
895 __git_has_doubledash && return
897 local cur="${COMP_WORDS[COMP_CWORD]}"
898 case "$cur" in
899 --*)
900 __gitcomp "
901 --all --author= --signoff --verify --no-verify
902 --edit --amend --include --only --interactive
903 --dry-run
905 return
906 esac
907 COMPREPLY=()
910 _git_describe ()
912 local cur="${COMP_WORDS[COMP_CWORD]}"
913 case "$cur" in
914 --*)
915 __gitcomp "
916 --all --tags --contains --abbrev= --candidates=
917 --exact-match --debug --long --match --always
919 return
920 esac
921 __gitcomp "$(__git_refs)"
924 __git_diff_common_options="--stat --numstat --shortstat --summary
925 --patch-with-stat --name-only --name-status --color
926 --no-color --color-words --no-renames --check
927 --full-index --binary --abbrev --diff-filter=
928 --find-copies-harder
929 --text --ignore-space-at-eol --ignore-space-change
930 --ignore-all-space --exit-code --quiet --ext-diff
931 --no-ext-diff
932 --no-prefix --src-prefix= --dst-prefix=
933 --inter-hunk-context=
934 --patience
935 --raw
936 --dirstat --dirstat= --dirstat-by-file
937 --dirstat-by-file= --cumulative
940 _git_diff ()
942 __git_has_doubledash && return
944 local cur="${COMP_WORDS[COMP_CWORD]}"
945 case "$cur" in
946 --*)
947 __gitcomp "--cached --staged --pickaxe-all --pickaxe-regex
948 --base --ours --theirs
949 $__git_diff_common_options
951 return
953 esac
954 __git_complete_file
957 __git_mergetools_common="diffuse ecmerge emerge kdiff3 meld opendiff
958 tkdiff vimdiff gvimdiff xxdiff araxis
961 _git_difftool ()
963 local cur="${COMP_WORDS[COMP_CWORD]}"
964 case "$cur" in
965 --tool=*)
966 __gitcomp "$__git_mergetools_common kompare" "" "${cur##--tool=}"
967 return
969 --*)
970 __gitcomp "--tool="
971 return
973 esac
974 COMPREPLY=()
977 __git_fetch_options="
978 --quiet --verbose --append --upload-pack --force --keep --depth=
979 --tags --no-tags
982 _git_fetch ()
984 local cur="${COMP_WORDS[COMP_CWORD]}"
985 case "$cur" in
986 --*)
987 __gitcomp "$__git_fetch_options"
988 return
990 esac
991 __git_complete_remote_or_refspec
994 _git_format_patch ()
996 local cur="${COMP_WORDS[COMP_CWORD]}"
997 case "$cur" in
998 --thread=*)
999 __gitcomp "
1000 deep shallow
1001 " "" "${cur##--thread=}"
1002 return
1004 --*)
1005 __gitcomp "
1006 --stdout --attach --no-attach --thread --thread=
1007 --output-directory
1008 --numbered --start-number
1009 --numbered-files
1010 --keep-subject
1011 --signoff
1012 --in-reply-to= --cc=
1013 --full-index --binary
1014 --not --all
1015 --cover-letter
1016 --no-prefix --src-prefix= --dst-prefix=
1017 --inline --suffix= --ignore-if-in-upstream
1018 --subject-prefix=
1020 return
1022 esac
1023 __git_complete_revlist
1026 _git_fsck ()
1028 local cur="${COMP_WORDS[COMP_CWORD]}"
1029 case "$cur" in
1030 --*)
1031 __gitcomp "
1032 --tags --root --unreachable --cache --no-reflogs --full
1033 --strict --verbose --lost-found
1035 return
1037 esac
1038 COMPREPLY=()
1041 _git_gc ()
1043 local cur="${COMP_WORDS[COMP_CWORD]}"
1044 case "$cur" in
1045 --*)
1046 __gitcomp "--prune --aggressive"
1047 return
1049 esac
1050 COMPREPLY=()
1053 _git_grep ()
1055 __git_has_doubledash && return
1057 local cur="${COMP_WORDS[COMP_CWORD]}"
1058 case "$cur" in
1059 --*)
1060 __gitcomp "
1061 --cached
1062 --text --ignore-case --word-regexp --invert-match
1063 --full-name
1064 --extended-regexp --basic-regexp --fixed-strings
1065 --files-with-matches --name-only
1066 --files-without-match
1067 --max-depth
1068 --count
1069 --and --or --not --all-match
1071 return
1073 esac
1074 COMPREPLY=()
1077 _git_help ()
1079 local cur="${COMP_WORDS[COMP_CWORD]}"
1080 case "$cur" in
1081 --*)
1082 __gitcomp "--all --info --man --web"
1083 return
1085 esac
1086 __git_compute_all_commands
1087 __gitcomp "$__git_all_commands
1088 attributes cli core-tutorial cvs-migration
1089 diffcore gitk glossary hooks ignore modules
1090 repository-layout tutorial tutorial-2
1091 workflows
1095 _git_init ()
1097 local cur="${COMP_WORDS[COMP_CWORD]}"
1098 case "$cur" in
1099 --shared=*)
1100 __gitcomp "
1101 false true umask group all world everybody
1102 " "" "${cur##--shared=}"
1103 return
1105 --*)
1106 __gitcomp "--quiet --bare --template= --shared --shared="
1107 return
1109 esac
1110 COMPREPLY=()
1113 _git_ls_files ()
1115 __git_has_doubledash && return
1117 local cur="${COMP_WORDS[COMP_CWORD]}"
1118 case "$cur" in
1119 --*)
1120 __gitcomp "--cached --deleted --modified --others --ignored
1121 --stage --directory --no-empty-directory --unmerged
1122 --killed --exclude= --exclude-from=
1123 --exclude-per-directory= --exclude-standard
1124 --error-unmatch --with-tree= --full-name
1125 --abbrev --ignored --exclude-per-directory
1127 return
1129 esac
1130 COMPREPLY=()
1133 _git_ls_remote ()
1135 __gitcomp "$(__git_remotes)"
1138 _git_ls_tree ()
1140 __git_complete_file
1143 # Options that go well for log, shortlog and gitk
1144 __git_log_common_options="
1145 --not --all
1146 --branches --tags --remotes
1147 --first-parent --merges --no-merges
1148 --max-count=
1149 --max-age= --since= --after=
1150 --min-age= --until= --before=
1152 # Options that go well for log and gitk (not shortlog)
1153 __git_log_gitk_options="
1154 --dense --sparse --full-history
1155 --simplify-merges --simplify-by-decoration
1156 --left-right
1158 # Options that go well for log and shortlog (not gitk)
1159 __git_log_shortlog_options="
1160 --author= --committer= --grep=
1161 --all-match
1164 __git_log_pretty_formats="oneline short medium full fuller email raw format:"
1165 __git_log_date_formats="relative iso8601 rfc2822 short local default raw"
1167 _git_log ()
1169 __git_has_doubledash && return
1171 local cur="${COMP_WORDS[COMP_CWORD]}"
1172 local g="$(git rev-parse --git-dir 2>/dev/null)"
1173 local merge=""
1174 if [ -f "$g/MERGE_HEAD" ]; then
1175 merge="--merge"
1177 case "$cur" in
1178 --pretty=*)
1179 __gitcomp "$__git_log_pretty_formats
1180 " "" "${cur##--pretty=}"
1181 return
1183 --format=*)
1184 __gitcomp "$__git_log_pretty_formats
1185 " "" "${cur##--format=}"
1186 return
1188 --date=*)
1189 __gitcomp "$__git_log_date_formats" "" "${cur##--date=}"
1190 return
1192 --decorate=*)
1193 __gitcomp "long short" "" "${cur##--decorate=}"
1194 return
1196 --*)
1197 __gitcomp "
1198 $__git_log_common_options
1199 $__git_log_shortlog_options
1200 $__git_log_gitk_options
1201 --root --topo-order --date-order --reverse
1202 --follow --full-diff
1203 --abbrev-commit --abbrev=
1204 --relative-date --date=
1205 --pretty= --format= --oneline
1206 --cherry-pick
1207 --graph
1208 --decorate --decorate=
1209 --walk-reflogs
1210 --parents --children
1211 $merge
1212 $__git_diff_common_options
1213 --pickaxe-all --pickaxe-regex
1215 return
1217 esac
1218 __git_complete_revlist
1221 __git_merge_options="
1222 --no-commit --no-stat --log --no-log --squash --strategy
1223 --commit --stat --no-squash --ff --no-ff
1226 _git_merge ()
1228 __git_complete_strategy && return
1230 local cur="${COMP_WORDS[COMP_CWORD]}"
1231 case "$cur" in
1232 --*)
1233 __gitcomp "$__git_merge_options"
1234 return
1235 esac
1236 __gitcomp "$(__git_refs)"
1239 _git_mergetool ()
1241 local cur="${COMP_WORDS[COMP_CWORD]}"
1242 case "$cur" in
1243 --tool=*)
1244 __gitcomp "$__git_mergetools_common tortoisemerge" "" "${cur##--tool=}"
1245 return
1247 --*)
1248 __gitcomp "--tool="
1249 return
1251 esac
1252 COMPREPLY=()
1255 _git_merge_base ()
1257 __gitcomp "$(__git_refs)"
1260 _git_mv ()
1262 local cur="${COMP_WORDS[COMP_CWORD]}"
1263 case "$cur" in
1264 --*)
1265 __gitcomp "--dry-run"
1266 return
1268 esac
1269 COMPREPLY=()
1272 _git_name_rev ()
1274 __gitcomp "--tags --all --stdin"
1277 _git_pull ()
1279 __git_complete_strategy && return
1281 local cur="${COMP_WORDS[COMP_CWORD]}"
1282 case "$cur" in
1283 --*)
1284 __gitcomp "
1285 --rebase --no-rebase
1286 $__git_merge_options
1287 $__git_fetch_options
1289 return
1291 esac
1292 __git_complete_remote_or_refspec
1295 _git_push ()
1297 local cur="${COMP_WORDS[COMP_CWORD]}"
1298 case "${COMP_WORDS[COMP_CWORD-1]}" in
1299 --repo)
1300 __gitcomp "$(__git_remotes)"
1301 return
1302 esac
1303 case "$cur" in
1304 --repo=*)
1305 __gitcomp "$(__git_remotes)" "" "${cur##--repo=}"
1306 return
1308 --*)
1309 __gitcomp "
1310 --all --mirror --tags --dry-run --force --verbose
1311 --receive-pack= --repo=
1313 return
1315 esac
1316 __git_complete_remote_or_refspec
1319 _git_rebase ()
1321 local cur="${COMP_WORDS[COMP_CWORD]}" dir="$(__gitdir)"
1322 if [ -d "$dir"/rebase-apply ] || [ -d "$dir"/rebase-merge ]; then
1323 __gitcomp "--continue --skip --abort"
1324 return
1326 __git_complete_strategy && return
1327 case "$cur" in
1328 --*)
1329 __gitcomp "--onto --merge --strategy --interactive"
1330 return
1331 esac
1332 __gitcomp "$(__git_refs)"
1335 __git_send_email_confirm_options="always never auto cc compose"
1336 __git_send_email_suppresscc_options="author self cc bodycc sob cccmd body all"
1338 _git_send_email ()
1340 local cur="${COMP_WORDS[COMP_CWORD]}"
1341 case "$cur" in
1342 --confirm=*)
1343 __gitcomp "
1344 $__git_send_email_confirm_options
1345 " "" "${cur##--confirm=}"
1346 return
1348 --suppress-cc=*)
1349 __gitcomp "
1350 $__git_send_email_suppresscc_options
1351 " "" "${cur##--suppress-cc=}"
1353 return
1355 --smtp-encryption=*)
1356 __gitcomp "ssl tls" "" "${cur##--smtp-encryption=}"
1357 return
1359 --*)
1360 __gitcomp "--annotate --bcc --cc --cc-cmd --chain-reply-to
1361 --compose --confirm= --dry-run --envelope-sender
1362 --from --identity
1363 --in-reply-to --no-chain-reply-to --no-signed-off-by-cc
1364 --no-suppress-from --no-thread --quiet
1365 --signed-off-by-cc --smtp-pass --smtp-server
1366 --smtp-server-port --smtp-encryption= --smtp-user
1367 --subject --suppress-cc= --suppress-from --thread --to
1368 --validate --no-validate"
1369 return
1371 esac
1372 COMPREPLY=()
1375 __git_config_get_set_variables ()
1377 local prevword word config_file= c=$COMP_CWORD
1378 while [ $c -gt 1 ]; do
1379 word="${COMP_WORDS[c]}"
1380 case "$word" in
1381 --global|--system|--file=*)
1382 config_file="$word"
1383 break
1385 -f|--file)
1386 config_file="$word $prevword"
1387 break
1389 esac
1390 prevword=$word
1391 c=$((--c))
1392 done
1394 git --git-dir="$(__gitdir)" config $config_file --list 2>/dev/null |
1395 while read line
1397 case "$line" in
1398 *.*=*)
1399 echo "${line/=*/}"
1401 esac
1402 done
1405 _git_config ()
1407 local cur="${COMP_WORDS[COMP_CWORD]}"
1408 local prv="${COMP_WORDS[COMP_CWORD-1]}"
1409 case "$prv" in
1410 branch.*.remote)
1411 __gitcomp "$(__git_remotes)"
1412 return
1414 branch.*.merge)
1415 __gitcomp "$(__git_refs)"
1416 return
1418 remote.*.fetch)
1419 local remote="${prv#remote.}"
1420 remote="${remote%.fetch}"
1421 __gitcomp "$(__git_refs_remotes "$remote")"
1422 return
1424 remote.*.push)
1425 local remote="${prv#remote.}"
1426 remote="${remote%.push}"
1427 __gitcomp "$(git --git-dir="$(__gitdir)" \
1428 for-each-ref --format='%(refname):%(refname)' \
1429 refs/heads)"
1430 return
1432 pull.twohead|pull.octopus)
1433 __git_compute_merge_strategies
1434 __gitcomp "$__git_merge_strategies"
1435 return
1437 color.branch|color.diff|color.interactive|\
1438 color.showbranch|color.status|color.ui)
1439 __gitcomp "always never auto"
1440 return
1442 color.pager)
1443 __gitcomp "false true"
1444 return
1446 color.*.*)
1447 __gitcomp "
1448 normal black red green yellow blue magenta cyan white
1449 bold dim ul blink reverse
1451 return
1453 help.format)
1454 __gitcomp "man info web html"
1455 return
1457 log.date)
1458 __gitcomp "$__git_log_date_formats"
1459 return
1461 sendemail.aliasesfiletype)
1462 __gitcomp "mutt mailrc pine elm gnus"
1463 return
1465 sendemail.confirm)
1466 __gitcomp "$__git_send_email_confirm_options"
1467 return
1469 sendemail.suppresscc)
1470 __gitcomp "$__git_send_email_suppresscc_options"
1471 return
1473 --get|--get-all|--unset|--unset-all)
1474 __gitcomp "$(__git_config_get_set_variables)"
1475 return
1477 *.*)
1478 COMPREPLY=()
1479 return
1481 esac
1482 case "$cur" in
1483 --*)
1484 __gitcomp "
1485 --global --system --file=
1486 --list --replace-all
1487 --get --get-all --get-regexp
1488 --add --unset --unset-all
1489 --remove-section --rename-section
1491 return
1493 branch.*.*)
1494 local pfx="${cur%.*}."
1495 cur="${cur##*.}"
1496 __gitcomp "remote merge mergeoptions rebase" "$pfx" "$cur"
1497 return
1499 branch.*)
1500 local pfx="${cur%.*}."
1501 cur="${cur#*.}"
1502 __gitcomp "$(__git_heads)" "$pfx" "$cur" "."
1503 return
1505 guitool.*.*)
1506 local pfx="${cur%.*}."
1507 cur="${cur##*.}"
1508 __gitcomp "
1509 argprompt cmd confirm needsfile noconsole norescan
1510 prompt revprompt revunmerged title
1511 " "$pfx" "$cur"
1512 return
1514 difftool.*.*)
1515 local pfx="${cur%.*}."
1516 cur="${cur##*.}"
1517 __gitcomp "cmd path" "$pfx" "$cur"
1518 return
1520 man.*.*)
1521 local pfx="${cur%.*}."
1522 cur="${cur##*.}"
1523 __gitcomp "cmd path" "$pfx" "$cur"
1524 return
1526 mergetool.*.*)
1527 local pfx="${cur%.*}."
1528 cur="${cur##*.}"
1529 __gitcomp "cmd path trustExitCode" "$pfx" "$cur"
1530 return
1532 pager.*)
1533 local pfx="${cur%.*}."
1534 cur="${cur#*.}"
1535 __git_compute_all_commands
1536 __gitcomp "$__git_all_commands" "$pfx" "$cur"
1537 return
1539 remote.*.*)
1540 local pfx="${cur%.*}."
1541 cur="${cur##*.}"
1542 __gitcomp "
1543 url proxy fetch push mirror skipDefaultUpdate
1544 receivepack uploadpack tagopt pushurl
1545 " "$pfx" "$cur"
1546 return
1548 remote.*)
1549 local pfx="${cur%.*}."
1550 cur="${cur#*.}"
1551 __gitcomp "$(__git_remotes)" "$pfx" "$cur" "."
1552 return
1554 url.*.*)
1555 local pfx="${cur%.*}."
1556 cur="${cur##*.}"
1557 __gitcomp "insteadOf pushInsteadOf" "$pfx" "$cur"
1558 return
1560 esac
1561 __gitcomp "
1562 add.ignore-errors
1563 alias.
1564 apply.ignorewhitespace
1565 apply.whitespace
1566 branch.autosetupmerge
1567 branch.autosetuprebase
1568 clean.requireForce
1569 color.branch
1570 color.branch.current
1571 color.branch.local
1572 color.branch.plain
1573 color.branch.remote
1574 color.diff
1575 color.diff.commit
1576 color.diff.frag
1577 color.diff.meta
1578 color.diff.new
1579 color.diff.old
1580 color.diff.plain
1581 color.diff.whitespace
1582 color.grep
1583 color.grep.external
1584 color.grep.match
1585 color.interactive
1586 color.interactive.header
1587 color.interactive.help
1588 color.interactive.prompt
1589 color.pager
1590 color.showbranch
1591 color.status
1592 color.status.added
1593 color.status.changed
1594 color.status.header
1595 color.status.nobranch
1596 color.status.untracked
1597 color.status.updated
1598 color.ui
1599 commit.template
1600 core.autocrlf
1601 core.bare
1602 core.compression
1603 core.createObject
1604 core.deltaBaseCacheLimit
1605 core.editor
1606 core.excludesfile
1607 core.fileMode
1608 core.fsyncobjectfiles
1609 core.gitProxy
1610 core.ignoreCygwinFSTricks
1611 core.ignoreStat
1612 core.logAllRefUpdates
1613 core.loosecompression
1614 core.packedGitLimit
1615 core.packedGitWindowSize
1616 core.pager
1617 core.preferSymlinkRefs
1618 core.preloadindex
1619 core.quotepath
1620 core.repositoryFormatVersion
1621 core.safecrlf
1622 core.sharedRepository
1623 core.symlinks
1624 core.trustctime
1625 core.warnAmbiguousRefs
1626 core.whitespace
1627 core.worktree
1628 diff.autorefreshindex
1629 diff.external
1630 diff.mnemonicprefix
1631 diff.renameLimit
1632 diff.renameLimit.
1633 diff.renames
1634 diff.suppressBlankEmpty
1635 diff.tool
1636 diff.wordRegex
1637 difftool.
1638 difftool.prompt
1639 fetch.unpackLimit
1640 format.attach
1641 format.cc
1642 format.headers
1643 format.numbered
1644 format.pretty
1645 format.signoff
1646 format.subjectprefix
1647 format.suffix
1648 format.thread
1649 gc.aggressiveWindow
1650 gc.auto
1651 gc.autopacklimit
1652 gc.packrefs
1653 gc.pruneexpire
1654 gc.reflogexpire
1655 gc.reflogexpireunreachable
1656 gc.rerereresolved
1657 gc.rerereunresolved
1658 gitcvs.allbinary
1659 gitcvs.commitmsgannotation
1660 gitcvs.dbTableNamePrefix
1661 gitcvs.dbdriver
1662 gitcvs.dbname
1663 gitcvs.dbpass
1664 gitcvs.dbuser
1665 gitcvs.enabled
1666 gitcvs.logfile
1667 gitcvs.usecrlfattr
1668 guitool.
1669 gui.blamehistoryctx
1670 gui.commitmsgwidth
1671 gui.copyblamethreshold
1672 gui.diffcontext
1673 gui.encoding
1674 gui.fastcopyblame
1675 gui.matchtrackingbranch
1676 gui.newbranchtemplate
1677 gui.pruneduringfetch
1678 gui.spellingdictionary
1679 gui.trustmtime
1680 help.autocorrect
1681 help.browser
1682 help.format
1683 http.lowSpeedLimit
1684 http.lowSpeedTime
1685 http.maxRequests
1686 http.noEPSV
1687 http.proxy
1688 http.sslCAInfo
1689 http.sslCAPath
1690 http.sslCert
1691 http.sslKey
1692 http.sslVerify
1693 i18n.commitEncoding
1694 i18n.logOutputEncoding
1695 imap.folder
1696 imap.host
1697 imap.pass
1698 imap.port
1699 imap.preformattedHTML
1700 imap.sslverify
1701 imap.tunnel
1702 imap.user
1703 instaweb.browser
1704 instaweb.httpd
1705 instaweb.local
1706 instaweb.modulepath
1707 instaweb.port
1708 interactive.singlekey
1709 log.date
1710 log.showroot
1711 mailmap.file
1712 man.
1713 man.viewer
1714 merge.conflictstyle
1715 merge.log
1716 merge.renameLimit
1717 merge.stat
1718 merge.tool
1719 merge.verbosity
1720 mergetool.
1721 mergetool.keepBackup
1722 mergetool.prompt
1723 pack.compression
1724 pack.deltaCacheLimit
1725 pack.deltaCacheSize
1726 pack.depth
1727 pack.indexVersion
1728 pack.packSizeLimit
1729 pack.threads
1730 pack.window
1731 pack.windowMemory
1732 pager.
1733 pull.octopus
1734 pull.twohead
1735 push.default
1736 rebase.stat
1737 receive.denyCurrentBranch
1738 receive.denyDeletes
1739 receive.denyNonFastForwards
1740 receive.fsckObjects
1741 receive.unpackLimit
1742 repack.usedeltabaseoffset
1743 rerere.autoupdate
1744 rerere.enabled
1745 sendemail.aliasesfile
1746 sendemail.aliasesfiletype
1747 sendemail.bcc
1748 sendemail.cc
1749 sendemail.cccmd
1750 sendemail.chainreplyto
1751 sendemail.confirm
1752 sendemail.envelopesender
1753 sendemail.multiedit
1754 sendemail.signedoffbycc
1755 sendemail.smtpencryption
1756 sendemail.smtppass
1757 sendemail.smtpserver
1758 sendemail.smtpserverport
1759 sendemail.smtpuser
1760 sendemail.suppresscc
1761 sendemail.suppressfrom
1762 sendemail.thread
1763 sendemail.to
1764 sendemail.validate
1765 showbranch.default
1766 status.relativePaths
1767 status.showUntrackedFiles
1768 tar.umask
1769 transfer.unpackLimit
1770 url.
1771 user.email
1772 user.name
1773 user.signingkey
1774 web.browser
1775 branch. remote.
1779 _git_remote ()
1781 local subcommands="add rename rm show prune update set-head"
1782 local subcommand="$(__git_find_on_cmdline "$subcommands")"
1783 if [ -z "$subcommand" ]; then
1784 __gitcomp "$subcommands"
1785 return
1788 case "$subcommand" in
1789 rename|rm|show|prune)
1790 __gitcomp "$(__git_remotes)"
1792 update)
1793 local i c='' IFS=$'\n'
1794 for i in $(git --git-dir="$(__gitdir)" config --get-regexp "remotes\..*" 2>/dev/null); do
1795 i="${i#remotes.}"
1796 c="$c ${i/ */}"
1797 done
1798 __gitcomp "$c"
1801 COMPREPLY=()
1803 esac
1806 _git_replace ()
1808 __gitcomp "$(__git_refs)"
1811 _git_reset ()
1813 __git_has_doubledash && return
1815 local cur="${COMP_WORDS[COMP_CWORD]}"
1816 case "$cur" in
1817 --*)
1818 __gitcomp "--merge --mixed --hard --soft --patch"
1819 return
1821 esac
1822 __gitcomp "$(__git_refs)"
1825 _git_revert ()
1827 local cur="${COMP_WORDS[COMP_CWORD]}"
1828 case "$cur" in
1829 --*)
1830 __gitcomp "--edit --mainline --no-edit --no-commit --signoff"
1831 return
1833 esac
1834 __gitcomp "$(__git_refs)"
1837 _git_rm ()
1839 __git_has_doubledash && return
1841 local cur="${COMP_WORDS[COMP_CWORD]}"
1842 case "$cur" in
1843 --*)
1844 __gitcomp "--cached --dry-run --ignore-unmatch --quiet"
1845 return
1847 esac
1848 COMPREPLY=()
1851 _git_shortlog ()
1853 __git_has_doubledash && return
1855 local cur="${COMP_WORDS[COMP_CWORD]}"
1856 case "$cur" in
1857 --*)
1858 __gitcomp "
1859 $__git_log_common_options
1860 $__git_log_shortlog_options
1861 --numbered --summary
1863 return
1865 esac
1866 __git_complete_revlist
1869 _git_show ()
1871 __git_has_doubledash && return
1873 local cur="${COMP_WORDS[COMP_CWORD]}"
1874 case "$cur" in
1875 --pretty=*)
1876 __gitcomp "$__git_log_pretty_formats
1877 " "" "${cur##--pretty=}"
1878 return
1880 --format=*)
1881 __gitcomp "$__git_log_pretty_formats
1882 " "" "${cur##--format=}"
1883 return
1885 --*)
1886 __gitcomp "--pretty= --format= --abbrev-commit --oneline
1887 $__git_diff_common_options
1889 return
1891 esac
1892 __git_complete_file
1895 _git_show_branch ()
1897 local cur="${COMP_WORDS[COMP_CWORD]}"
1898 case "$cur" in
1899 --*)
1900 __gitcomp "
1901 --all --remotes --topo-order --current --more=
1902 --list --independent --merge-base --no-name
1903 --color --no-color
1904 --sha1-name --sparse --topics --reflog
1906 return
1908 esac
1909 __git_complete_revlist
1912 _git_stash ()
1914 local cur="${COMP_WORDS[COMP_CWORD]}"
1915 local save_opts='--keep-index --no-keep-index --quiet --patch'
1916 local subcommands='save list show apply clear drop pop create branch'
1917 local subcommand="$(__git_find_on_cmdline "$subcommands")"
1918 if [ -z "$subcommand" ]; then
1919 case "$cur" in
1920 --*)
1921 __gitcomp "$save_opts"
1924 if [ -z "$(__git_find_on_cmdline "$save_opts")" ]; then
1925 __gitcomp "$subcommands"
1926 else
1927 COMPREPLY=()
1930 esac
1931 else
1932 case "$subcommand,$cur" in
1933 save,--*)
1934 __gitcomp "$save_opts"
1936 apply,--*|pop,--*)
1937 __gitcomp "--index --quiet"
1939 show,--*|drop,--*|branch,--*)
1940 COMPREPLY=()
1942 show,*|apply,*|drop,*|pop,*|branch,*)
1943 __gitcomp "$(git --git-dir="$(__gitdir)" stash list \
1944 | sed -n -e 's/:.*//p')"
1947 COMPREPLY=()
1949 esac
1953 _git_submodule ()
1955 __git_has_doubledash && return
1957 local subcommands="add status init update summary foreach sync"
1958 if [ -z "$(__git_find_on_cmdline "$subcommands")" ]; then
1959 local cur="${COMP_WORDS[COMP_CWORD]}"
1960 case "$cur" in
1961 --*)
1962 __gitcomp "--quiet --cached"
1965 __gitcomp "$subcommands"
1967 esac
1968 return
1972 _git_svn ()
1974 local subcommands="
1975 init fetch clone rebase dcommit log find-rev
1976 set-tree commit-diff info create-ignore propget
1977 proplist show-ignore show-externals branch tag blame
1978 migrate
1980 local subcommand="$(__git_find_on_cmdline "$subcommands")"
1981 if [ -z "$subcommand" ]; then
1982 __gitcomp "$subcommands"
1983 else
1984 local remote_opts="--username= --config-dir= --no-auth-cache"
1985 local fc_opts="
1986 --follow-parent --authors-file= --repack=
1987 --no-metadata --use-svm-props --use-svnsync-props
1988 --log-window-size= --no-checkout --quiet
1989 --repack-flags --use-log-author --localtime
1990 --ignore-paths= $remote_opts
1992 local init_opts="
1993 --template= --shared= --trunk= --tags=
1994 --branches= --stdlayout --minimize-url
1995 --no-metadata --use-svm-props --use-svnsync-props
1996 --rewrite-root= --prefix= --use-log-author
1997 --add-author-from $remote_opts
1999 local cmt_opts="
2000 --edit --rmdir --find-copies-harder --copy-similarity=
2003 local cur="${COMP_WORDS[COMP_CWORD]}"
2004 case "$subcommand,$cur" in
2005 fetch,--*)
2006 __gitcomp "--revision= --fetch-all $fc_opts"
2008 clone,--*)
2009 __gitcomp "--revision= $fc_opts $init_opts"
2011 init,--*)
2012 __gitcomp "$init_opts"
2014 dcommit,--*)
2015 __gitcomp "
2016 --merge --strategy= --verbose --dry-run
2017 --fetch-all --no-rebase --commit-url
2018 --revision $cmt_opts $fc_opts
2021 set-tree,--*)
2022 __gitcomp "--stdin $cmt_opts $fc_opts"
2024 create-ignore,--*|propget,--*|proplist,--*|show-ignore,--*|\
2025 show-externals,--*)
2026 __gitcomp "--revision="
2028 log,--*)
2029 __gitcomp "
2030 --limit= --revision= --verbose --incremental
2031 --oneline --show-commit --non-recursive
2032 --authors-file= --color
2035 rebase,--*)
2036 __gitcomp "
2037 --merge --verbose --strategy= --local
2038 --fetch-all --dry-run $fc_opts
2041 commit-diff,--*)
2042 __gitcomp "--message= --file= --revision= $cmt_opts"
2044 info,--*)
2045 __gitcomp "--url"
2047 branch,--*)
2048 __gitcomp "--dry-run --message --tag"
2050 tag,--*)
2051 __gitcomp "--dry-run --message"
2053 blame,--*)
2054 __gitcomp "--git-format"
2056 migrate,--*)
2057 __gitcomp "
2058 --config-dir= --ignore-paths= --minimize
2059 --no-auth-cache --username=
2063 COMPREPLY=()
2065 esac
2069 _git_tag ()
2071 local i c=1 f=0
2072 while [ $c -lt $COMP_CWORD ]; do
2073 i="${COMP_WORDS[c]}"
2074 case "$i" in
2075 -d|-v)
2076 __gitcomp "$(__git_tags)"
2077 return
2082 esac
2083 c=$((++c))
2084 done
2086 case "${COMP_WORDS[COMP_CWORD-1]}" in
2087 -m|-F)
2088 COMPREPLY=()
2090 -*|tag)
2091 if [ $f = 1 ]; then
2092 __gitcomp "$(__git_tags)"
2093 else
2094 COMPREPLY=()
2098 __gitcomp "$(__git_refs)"
2100 esac
2103 _git ()
2105 local i c=1 command __git_dir
2107 while [ $c -lt $COMP_CWORD ]; do
2108 i="${COMP_WORDS[c]}"
2109 case "$i" in
2110 --git-dir=*) __git_dir="${i#--git-dir=}" ;;
2111 --bare) __git_dir="." ;;
2112 --version|-p|--paginate) ;;
2113 --help) command="help"; break ;;
2114 *) command="$i"; break ;;
2115 esac
2116 c=$((++c))
2117 done
2119 if [ -z "$command" ]; then
2120 case "${COMP_WORDS[COMP_CWORD]}" in
2121 --*) __gitcomp "
2122 --paginate
2123 --no-pager
2124 --git-dir=
2125 --bare
2126 --version
2127 --exec-path
2128 --html-path
2129 --work-tree=
2130 --help
2133 *) __git_compute_porcelain_commands
2134 __gitcomp "$__git_porcelain_commands $(__git_aliases)" ;;
2135 esac
2136 return
2139 local expansion=$(__git_aliased_command "$command")
2140 [ "$expansion" ] && command="$expansion"
2142 case "$command" in
2143 am) _git_am ;;
2144 add) _git_add ;;
2145 apply) _git_apply ;;
2146 archive) _git_archive ;;
2147 bisect) _git_bisect ;;
2148 bundle) _git_bundle ;;
2149 branch) _git_branch ;;
2150 checkout) _git_checkout ;;
2151 cherry) _git_cherry ;;
2152 cherry-pick) _git_cherry_pick ;;
2153 clean) _git_clean ;;
2154 clone) _git_clone ;;
2155 commit) _git_commit ;;
2156 config) _git_config ;;
2157 describe) _git_describe ;;
2158 diff) _git_diff ;;
2159 difftool) _git_difftool ;;
2160 fetch) _git_fetch ;;
2161 format-patch) _git_format_patch ;;
2162 fsck) _git_fsck ;;
2163 gc) _git_gc ;;
2164 grep) _git_grep ;;
2165 help) _git_help ;;
2166 init) _git_init ;;
2167 log) _git_log ;;
2168 ls-files) _git_ls_files ;;
2169 ls-remote) _git_ls_remote ;;
2170 ls-tree) _git_ls_tree ;;
2171 merge) _git_merge;;
2172 mergetool) _git_mergetool;;
2173 merge-base) _git_merge_base ;;
2174 mv) _git_mv ;;
2175 name-rev) _git_name_rev ;;
2176 pull) _git_pull ;;
2177 push) _git_push ;;
2178 rebase) _git_rebase ;;
2179 remote) _git_remote ;;
2180 replace) _git_replace ;;
2181 reset) _git_reset ;;
2182 revert) _git_revert ;;
2183 rm) _git_rm ;;
2184 send-email) _git_send_email ;;
2185 shortlog) _git_shortlog ;;
2186 show) _git_show ;;
2187 show-branch) _git_show_branch ;;
2188 stash) _git_stash ;;
2189 stage) _git_add ;;
2190 submodule) _git_submodule ;;
2191 svn) _git_svn ;;
2192 tag) _git_tag ;;
2193 whatchanged) _git_log ;;
2194 *) COMPREPLY=() ;;
2195 esac
2198 _gitk ()
2200 __git_has_doubledash && return
2202 local cur="${COMP_WORDS[COMP_CWORD]}"
2203 local g="$(__gitdir)"
2204 local merge=""
2205 if [ -f "$g/MERGE_HEAD" ]; then
2206 merge="--merge"
2208 case "$cur" in
2209 --*)
2210 __gitcomp "
2211 $__git_log_common_options
2212 $__git_log_gitk_options
2213 $merge
2215 return
2217 esac
2218 __git_complete_revlist
2221 complete -o bashdefault -o default -o nospace -F _git git 2>/dev/null \
2222 || complete -o default -o nospace -F _git git
2223 complete -o bashdefault -o default -o nospace -F _gitk gitk 2>/dev/null \
2224 || complete -o default -o nospace -F _gitk gitk
2226 # The following are necessary only for Cygwin, and only are needed
2227 # when the user has tab-completed the executable name and consequently
2228 # included the '.exe' suffix.
2230 if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
2231 complete -o bashdefault -o default -o nospace -F _git git.exe 2>/dev/null \
2232 || complete -o default -o nospace -F _git git.exe