1#!bash
2#
3# bash completion support for core Git.
4#
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.
8#
9# The contained completion routines provide support for completing:
10#
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
17#
18# To use these routines:
19#
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
23#
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.
29#
30# 4) Consider changing your PS1 to also show the current branch:
31# PS1='[\u@\h \W$(__git_ps1 " (%s)")]\$ '
32#
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.
36#
37# To submit patches:
38#
39# *) Read Documentation/SubmittingPatches
40# *) Send all patches to the current maintainer:
41#
42# "Shawn O. Pearce" <spearce@spearce.org>
43#
44# *) Always CC the Git mailing list:
45#
46# git@vger.kernel.org
47#
48
49case "$COMP_WORDBREAKS" in
50*:*) : great ;;
51*) COMP_WORDBREAKS="$COMP_WORDBREAKS:"
52esac
53
54# __gitdir accepts 0 or 1 arguments (i.e., location)
55# returns location of .git repo
56__gitdir ()
57{
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
65 fi
66 elif [ -d "$1/.git" ]; then
67 echo "$1/.git"
68 else
69 echo "$1"
70 fi
71}
72
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 ()
76{
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"
91 fi
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"
109 fi
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")..."
115 fi
116 fi
117 fi
118
119 if [ -n "${1-}" ]; then
120 printf "$1" "${b##refs/heads/}$r"
121 else
122 printf " (%s)" "${b##refs/heads/}$r"
123 fi
124 fi
125}
126
127# __gitcomp_1 requires 2 arguments
128__gitcomp_1 ()
129{
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
138}
139
140# __gitcomp accepts 1, 2, 3, or 4 arguments
141# generates completion reply with compgen
142__gitcomp ()
143{
144 local cur="${COMP_WORDS[COMP_CWORD]}"
145 if [ $# -gt 2 ]; then
146 cur="$3"
147 fi
148 case "$cur" in
149 --*=)
150 COMPREPLY=()
151 ;;
152 *)
153 local IFS=$'\n'
154 COMPREPLY=($(compgen -P "${2-}" \
155 -W "$(__gitcomp_1 "${1-}" "${4-}")" \
156 -- "$cur"))
157 ;;
158 esac
159}
160
161# __git_heads accepts 0 or 1 arguments (to pass to __gitdir)
162__git_heads ()
163{
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
169 fi
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
178}
179
180# __git_tags accepts 0 or 1 arguments (to pass to __gitdir)
181__git_tags ()
182{
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
188 fi
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
197}
198
199# __git_refs accepts 0 or 1 arguments (to pass to __gitdir)
200__git_refs ()
201{
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%/*}"
209 ;;
210 *)
211 if [ -e "$dir/HEAD" ]; then echo HEAD; fi
212 format="refname:short"
213 refs="refs/tags refs/heads refs/remotes"
214 ;;
215 esac
216 git --git-dir="$dir" for-each-ref --format="%($format)" \
217 $refs
218 return
219 fi
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
230}
231
232# __git_refs2 requires 1 argument (to pass to __git_refs)
233__git_refs2 ()
234{
235 local i
236 for i in $(__git_refs "$1"); do
237 echo "$i:$i"
238 done
239}
240
241# __git_refs_remotes requires 1 argument (to pass to ls-remote)
242__git_refs_remotes ()
243{
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/}"
250 ;;
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
257}
258
259__git_remotes ()
260{
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=*/}"
273 ;;
274 esac
275 done
276}
277
278__git_merge_strategies ()
279{
280 if [ -n "$__git_merge_strategylist" ]; then
281 echo "$__git_merge_strategylist"
282 return
283 fi
284 git merge -s help 2>&1 |
285 sed -n -e '/[Aa]vailable strategies are: /,/^$/{
286 s/\.$//
287 s/.*://
288 s/^[ ]*//
289 s/[ ]*$//
290 p
291 }'
292}
293__git_merge_strategylist=
294__git_merge_strategylist=$(__git_merge_strategies 2>/dev/null)
295
296__git_complete_file ()
297{
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/"
309 ;;
310 *)
311 ls="$ref"
312 ;;
313 esac
314
315 case "$COMP_WORDBREAKS" in
316 *:*) : great ;;
317 *) pfx="$ref:$pfx" ;;
318 esac
319
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,$, ,
326 }
327 /^120000 blob /{
328 s,^.* ,,
329 s,$, ,
330 }
331 /^040000 tree /{
332 s,^.* ,,
333 s,$,/,
334 }
335 s/^.* //')" \
336 -- "$cur"))
337 ;;
338 *)
339 __gitcomp "$(__git_refs)"
340 ;;
341 esac
342}
343
344__git_complete_revlist ()
345{
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"
352 ;;
353 *..*)
354 pfx="${cur%..*}.."
355 cur="${cur#*..}"
356 __gitcomp "$(__git_refs)" "$pfx" "$cur"
357 ;;
358 *)
359 __gitcomp "$(__git_refs)"
360 ;;
361 esac
362}
363
364__git_all_commands ()
365{
366 if [ -n "$__git_all_commandlist" ]; then
367 echo "$__git_all_commandlist"
368 return
369 fi
370 local i IFS=" "$'\n'
371 for i in $(git help -a|egrep '^ ')
372 do
373 case $i in
374 *--*) : helper pattern;;
375 *) echo $i;;
376 esac
377 done
378}
379__git_all_commandlist=
380__git_all_commandlist="$(__git_all_commands 2>/dev/null)"
381
382__git_porcelain_commands ()
383{
384 if [ -n "$__git_porcelain_commandlist" ]; then
385 echo "$__git_porcelain_commandlist"
386 return
387 fi
388 local i IFS=" "$'\n'
389 for i in "help" $(__git_all_commands)
390 do
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
469}
470__git_porcelain_commandlist=
471__git_porcelain_commandlist="$(__git_porcelain_commands 2>/dev/null)"
472
473__git_aliases ()
474{
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/=*/}"
481 ;;
482 esac
483 done
484}
485
486# __git_aliased_command requires 1 argument
487__git_aliased_command ()
488{
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
495 fi
496 done
497}
498
499# __git_find_subcommand requires 1 argument
500__git_find_subcommand ()
501{
502 local word subcommand c=1
503
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
510 fi
511 done
512 c=$((++c))
513 done
514}
515
516__git_has_doubledash ()
517{
518 local c=1
519 while [ $c -lt $COMP_CWORD ]; do
520 if [ "--" = "${COMP_WORDS[c]}" ]; then
521 return 0
522 fi
523 c=$((++c))
524 done
525 return 1
526}
527
528__git_whitespacelist="nowarn warn error error-all fix"
529
530_git_am ()
531{
532 local cur="${COMP_WORDS[COMP_CWORD]}" dir="$(__gitdir)"
533 if [ -d "$dir"/rebase-apply ]; then
534 __gitcomp "--skip --resolved --abort"
535 return
536 fi
537 case "$cur" in
538 --whitespace=*)
539 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
540 return
541 ;;
542 --*)
543 __gitcomp "
544 --signoff --utf8 --binary --3way --interactive
545 --whitespace=
546 "
547 return
548 esac
549 COMPREPLY=()
550}
551
552_git_apply ()
553{
554 local cur="${COMP_WORDS[COMP_CWORD]}"
555 case "$cur" in
556 --whitespace=*)
557 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
558 return
559 ;;
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
566 "
567 return
568 esac
569 COMPREPLY=()
570}
571
572_git_add ()
573{
574 __git_has_doubledash && return
575
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
582 "
583 return
584 esac
585 COMPREPLY=()
586}
587
588_git_archive ()
589{
590 local cur="${COMP_WORDS[COMP_CWORD]}"
591 case "$cur" in
592 --format=*)
593 __gitcomp "$(git archive --list)" "" "${cur##--format=}"
594 return
595 ;;
596 --remote=*)
597 __gitcomp "$(__git_remotes)" "" "${cur##--remote=}"
598 return
599 ;;
600 --*)
601 __gitcomp "
602 --format= --list --verbose
603 --prefix= --remote= --exec=
604 "
605 return
606 ;;
607 esac
608 __git_complete_file
609}
610
611_git_bisect ()
612{
613 __git_has_doubledash && return
614
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
620 fi
621
622 case "$subcommand" in
623 bad|good|reset|skip)
624 __gitcomp "$(__git_refs)"
625 ;;
626 *)
627 COMPREPLY=()
628 ;;
629 esac
630}
631
632_git_branch ()
633{
634 local i c=1 only_local_ref="n" has_r="n"
635
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
644
645 case "${COMP_WORDS[COMP_CWORD]}" in
646 --*)
647 __gitcomp "
648 --color --no-color --verbose --abbrev= --no-abbrev
649 --track --no-track --contains --merged --no-merged
650 "
651 ;;
652 *)
653 if [ $only_local_ref = "y" -a $has_r = "n" ]; then
654 __gitcomp "$(__git_heads)"
655 else
656 __gitcomp "$(__git_refs)"
657 fi
658 ;;
659 esac
660}
661
662_git_bundle ()
663{
664 local cmd="${COMP_WORDS[2]}"
665 case "$COMP_CWORD" in
666 2)
667 __gitcomp "create list-heads verify unbundle"
668 ;;
669 3)
670 # looking for a file
671 ;;
672 *)
673 case "$cmd" in
674 create)
675 __git_complete_revlist
676 ;;
677 esac
678 ;;
679 esac
680}
681
682_git_checkout ()
683{
684 __git_has_doubledash && return
685
686 __gitcomp "$(__git_refs)"
687}
688
689_git_cherry ()
690{
691 __gitcomp "$(__git_refs)"
692}
693
694_git_cherry_pick ()
695{
696 local cur="${COMP_WORDS[COMP_CWORD]}"
697 case "$cur" in
698 --*)
699 __gitcomp "--edit --no-commit"
700 ;;
701 *)
702 __gitcomp "$(__git_refs)"
703 ;;
704 esac
705}
706
707_git_clean ()
708{
709 __git_has_doubledash && return
710
711 local cur="${COMP_WORDS[COMP_CWORD]}"
712 case "$cur" in
713 --*)
714 __gitcomp "--dry-run --quiet"
715 return
716 ;;
717 esac
718 COMPREPLY=()
719}
720
721_git_clone ()
722{
723 local cur="${COMP_WORDS[COMP_CWORD]}"
724 case "$cur" in
725 --*)
726 __gitcomp "
727 --local
728 --no-hardlinks
729 --shared
730 --reference
731 --quiet
732 --no-checkout
733 --bare
734 --mirror
735 --origin
736 --upload-pack
737 --template=
738 --depth
739 "
740 return
741 ;;
742 esac
743 COMPREPLY=()
744}
745
746_git_commit ()
747{
748 __git_has_doubledash && return
749
750 local cur="${COMP_WORDS[COMP_CWORD]}"
751 case "$cur" in
752 --*)
753 __gitcomp "
754 --all --author= --signoff --verify --no-verify
755 --edit --amend --include --only --interactive
756 "
757 return
758 esac
759 COMPREPLY=()
760}
761
762_git_describe ()
763{
764 local cur="${COMP_WORDS[COMP_CWORD]}"
765 case "$cur" in
766 --*)
767 __gitcomp "
768 --all --tags --contains --abbrev= --candidates=
769 --exact-match --debug --long --match --always
770 "
771 return
772 esac
773 __gitcomp "$(__git_refs)"
774}
775
776_git_diff ()
777{
778 __git_has_doubledash && return
779
780 local cur="${COMP_WORDS[COMP_CWORD]}"
781 case "$cur" in
782 --*)
783 __gitcomp "--cached --stat --numstat --shortstat --summary
784 --patch-with-stat --name-only --name-status --color
785 --no-color --color-words --no-renames --check
786 --full-index --binary --abbrev --diff-filter=
787 --find-copies-harder --pickaxe-all --pickaxe-regex
788 --text --ignore-space-at-eol --ignore-space-change
789 --ignore-all-space --exit-code --quiet --ext-diff
790 --no-ext-diff
791 --no-prefix --src-prefix= --dst-prefix=
792 --base --ours --theirs
793 --inter-hunk-context=
794 "
795 return
796 ;;
797 esac
798 __git_complete_file
799}
800
801_git_fetch ()
802{
803 local cur="${COMP_WORDS[COMP_CWORD]}"
804
805 if [ "$COMP_CWORD" = 2 ]; then
806 __gitcomp "$(__git_remotes)"
807 else
808 case "$cur" in
809 *:*)
810 local pfx=""
811 case "$COMP_WORDBREAKS" in
812 *:*) : great ;;
813 *) pfx="${cur%%:*}:" ;;
814 esac
815 __gitcomp "$(__git_refs)" "$pfx" "${cur#*:}"
816 ;;
817 *)
818 __gitcomp "$(__git_refs2 "${COMP_WORDS[2]}")"
819 ;;
820 esac
821 fi
822}
823
824_git_format_patch ()
825{
826 local cur="${COMP_WORDS[COMP_CWORD]}"
827 case "$cur" in
828 --*)
829 __gitcomp "
830 --stdout --attach --thread
831 --output-directory
832 --numbered --start-number
833 --numbered-files
834 --keep-subject
835 --signoff
836 --in-reply-to=
837 --full-index --binary
838 --not --all
839 --cover-letter
840 --no-prefix --src-prefix= --dst-prefix=
841 --inline --suffix= --ignore-if-in-upstream
842 --subject-prefix=
843 "
844 return
845 ;;
846 esac
847 __git_complete_revlist
848}
849
850_git_gc ()
851{
852 local cur="${COMP_WORDS[COMP_CWORD]}"
853 case "$cur" in
854 --*)
855 __gitcomp "--prune --aggressive"
856 return
857 ;;
858 esac
859 COMPREPLY=()
860}
861
862_git_grep ()
863{
864 __git_has_doubledash && return
865
866 local cur="${COMP_WORDS[COMP_CWORD]}"
867 case "$cur" in
868 --*)
869 __gitcomp "
870 --cached
871 --text --ignore-case --word-regexp --invert-match
872 --full-name
873 --extended-regexp --basic-regexp --fixed-strings
874 --files-with-matches --name-only
875 --files-without-match
876 --count
877 --and --or --not --all-match
878 "
879 return
880 ;;
881 esac
882 COMPREPLY=()
883}
884
885_git_help ()
886{
887 local cur="${COMP_WORDS[COMP_CWORD]}"
888 case "$cur" in
889 --*)
890 __gitcomp "--all --info --man --web"
891 return
892 ;;
893 esac
894 __gitcomp "$(__git_all_commands)
895 attributes cli core-tutorial cvs-migration
896 diffcore gitk glossary hooks ignore modules
897 repository-layout tutorial tutorial-2
898 workflows
899 "
900}
901
902_git_init ()
903{
904 local cur="${COMP_WORDS[COMP_CWORD]}"
905 case "$cur" in
906 --shared=*)
907 __gitcomp "
908 false true umask group all world everybody
909 " "" "${cur##--shared=}"
910 return
911 ;;
912 --*)
913 __gitcomp "--quiet --bare --template= --shared --shared="
914 return
915 ;;
916 esac
917 COMPREPLY=()
918}
919
920_git_ls_files ()
921{
922 __git_has_doubledash && return
923
924 local cur="${COMP_WORDS[COMP_CWORD]}"
925 case "$cur" in
926 --*)
927 __gitcomp "--cached --deleted --modified --others --ignored
928 --stage --directory --no-empty-directory --unmerged
929 --killed --exclude= --exclude-from=
930 --exclude-per-directory= --exclude-standard
931 --error-unmatch --with-tree= --full-name
932 --abbrev --ignored --exclude-per-directory
933 "
934 return
935 ;;
936 esac
937 COMPREPLY=()
938}
939
940_git_ls_remote ()
941{
942 __gitcomp "$(__git_remotes)"
943}
944
945_git_ls_tree ()
946{
947 __git_complete_file
948}
949
950__git_log_pretty_formats="oneline short medium full fuller email raw format:"
951
952_git_log ()
953{
954 __git_has_doubledash && return
955
956 local cur="${COMP_WORDS[COMP_CWORD]}"
957 case "$cur" in
958 --pretty=*)
959 __gitcomp "$__git_log_pretty_formats
960 " "" "${cur##--pretty=}"
961 return
962 ;;
963 --date=*)
964 __gitcomp "
965 relative iso8601 rfc2822 short local default
966 " "" "${cur##--date=}"
967 return
968 ;;
969 --*)
970 __gitcomp "
971 --max-count= --max-age= --since= --after=
972 --min-age= --before= --until=
973 --root --topo-order --date-order --reverse
974 --no-merges --follow
975 --abbrev-commit --abbrev=
976 --relative-date --date=
977 --author= --committer= --grep=
978 --all-match
979 --pretty= --name-status --name-only --raw
980 --not --all
981 --left-right --cherry-pick
982 --graph
983 --stat --numstat --shortstat
984 --decorate --diff-filter=
985 --color-words --walk-reflogs
986 --parents --children --full-history
987 --merge
988 --inter-hunk-context=
989 "
990 return
991 ;;
992 esac
993 __git_complete_revlist
994}
995
996_git_merge ()
997{
998 local cur="${COMP_WORDS[COMP_CWORD]}"
999 case "${COMP_WORDS[COMP_CWORD-1]}" in
1000 -s|--strategy)
1001 __gitcomp "$(__git_merge_strategies)"
1002 return
1003 esac
1004 case "$cur" in
1005 --strategy=*)
1006 __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
1007 return
1008 ;;
1009 --*)
1010 __gitcomp "
1011 --no-commit --no-stat --log --no-log --squash --strategy
1012 "
1013 return
1014 esac
1015 __gitcomp "$(__git_refs)"
1016}
1017
1018_git_mergetool ()
1019{
1020 local cur="${COMP_WORDS[COMP_CWORD]}"
1021 case "$cur" in
1022 --tool=*)
1023 __gitcomp "
1024 kdiff3 tkdiff meld xxdiff emerge
1025 vimdiff gvimdiff ecmerge opendiff
1026 " "" "${cur##--tool=}"
1027 return
1028 ;;
1029 --*)
1030 __gitcomp "--tool="
1031 return
1032 ;;
1033 esac
1034 COMPREPLY=()
1035}
1036
1037_git_merge_base ()
1038{
1039 __gitcomp "$(__git_refs)"
1040}
1041
1042_git_mv ()
1043{
1044 local cur="${COMP_WORDS[COMP_CWORD]}"
1045 case "$cur" in
1046 --*)
1047 __gitcomp "--dry-run"
1048 return
1049 ;;
1050 esac
1051 COMPREPLY=()
1052}
1053
1054_git_name_rev ()
1055{
1056 __gitcomp "--tags --all --stdin"
1057}
1058
1059_git_pull ()
1060{
1061 local cur="${COMP_WORDS[COMP_CWORD]}"
1062
1063 if [ "$COMP_CWORD" = 2 ]; then
1064 __gitcomp "$(__git_remotes)"
1065 else
1066 __gitcomp "$(__git_refs "${COMP_WORDS[2]}")"
1067 fi
1068}
1069
1070_git_push ()
1071{
1072 local cur="${COMP_WORDS[COMP_CWORD]}"
1073
1074 if [ "$COMP_CWORD" = 2 ]; then
1075 __gitcomp "$(__git_remotes)"
1076 else
1077 case "$cur" in
1078 *:*)
1079 local pfx=""
1080 case "$COMP_WORDBREAKS" in
1081 *:*) : great ;;
1082 *) pfx="${cur%%:*}:" ;;
1083 esac
1084
1085 __gitcomp "$(__git_refs "${COMP_WORDS[2]}")" "$pfx" "${cur#*:}"
1086 ;;
1087 +*)
1088 __gitcomp "$(__git_refs)" + "${cur#+}"
1089 ;;
1090 *)
1091 __gitcomp "$(__git_refs)"
1092 ;;
1093 esac
1094 fi
1095}
1096
1097_git_rebase ()
1098{
1099 local cur="${COMP_WORDS[COMP_CWORD]}" dir="$(__gitdir)"
1100 if [ -d "$dir"/rebase-apply ] || [ -d "$dir"/rebase-merge ]; then
1101 __gitcomp "--continue --skip --abort"
1102 return
1103 fi
1104 case "${COMP_WORDS[COMP_CWORD-1]}" in
1105 -s|--strategy)
1106 __gitcomp "$(__git_merge_strategies)"
1107 return
1108 esac
1109 case "$cur" in
1110 --strategy=*)
1111 __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
1112 return
1113 ;;
1114 --*)
1115 __gitcomp "--onto --merge --strategy --interactive"
1116 return
1117 esac
1118 __gitcomp "$(__git_refs)"
1119}
1120
1121_git_send_email ()
1122{
1123 local cur="${COMP_WORDS[COMP_CWORD]}"
1124 case "$cur" in
1125 --*)
1126 __gitcomp "--bcc --cc --cc-cmd --chain-reply-to --compose
1127 --dry-run --envelope-sender --from --identity
1128 --in-reply-to --no-chain-reply-to --no-signed-off-by-cc
1129 --no-suppress-from --no-thread --quiet
1130 --signed-off-by-cc --smtp-pass --smtp-server
1131 --smtp-server-port --smtp-ssl --smtp-user --subject
1132 --suppress-cc --suppress-from --thread --to
1133 --validate --no-validate"
1134 return
1135 ;;
1136 esac
1137 COMPREPLY=()
1138}
1139
1140_git_config ()
1141{
1142 local cur="${COMP_WORDS[COMP_CWORD]}"
1143 local prv="${COMP_WORDS[COMP_CWORD-1]}"
1144 case "$prv" in
1145 branch.*.remote)
1146 __gitcomp "$(__git_remotes)"
1147 return
1148 ;;
1149 branch.*.merge)
1150 __gitcomp "$(__git_refs)"
1151 return
1152 ;;
1153 remote.*.fetch)
1154 local remote="${prv#remote.}"
1155 remote="${remote%.fetch}"
1156 __gitcomp "$(__git_refs_remotes "$remote")"
1157 return
1158 ;;
1159 remote.*.push)
1160 local remote="${prv#remote.}"
1161 remote="${remote%.push}"
1162 __gitcomp "$(git --git-dir="$(__gitdir)" \
1163 for-each-ref --format='%(refname):%(refname)' \
1164 refs/heads)"
1165 return
1166 ;;
1167 pull.twohead|pull.octopus)
1168 __gitcomp "$(__git_merge_strategies)"
1169 return
1170 ;;
1171 color.branch|color.diff|color.status)
1172 __gitcomp "always never auto"
1173 return
1174 ;;
1175 color.*.*)
1176 __gitcomp "
1177 normal black red green yellow blue magenta cyan white
1178 bold dim ul blink reverse
1179 "
1180 return
1181 ;;
1182 *.*)
1183 COMPREPLY=()
1184 return
1185 ;;
1186 esac
1187 case "$cur" in
1188 --*)
1189 __gitcomp "
1190 --global --system --file=
1191 --list --replace-all
1192 --get --get-all --get-regexp
1193 --add --unset --unset-all
1194 --remove-section --rename-section
1195 "
1196 return
1197 ;;
1198 branch.*.*)
1199 local pfx="${cur%.*}."
1200 cur="${cur##*.}"
1201 __gitcomp "remote merge mergeoptions" "$pfx" "$cur"
1202 return
1203 ;;
1204 branch.*)
1205 local pfx="${cur%.*}."
1206 cur="${cur#*.}"
1207 __gitcomp "$(__git_heads)" "$pfx" "$cur" "."
1208 return
1209 ;;
1210 remote.*.*)
1211 local pfx="${cur%.*}."
1212 cur="${cur##*.}"
1213 __gitcomp "
1214 url proxy fetch push mirror skipDefaultUpdate
1215 receivepack uploadpack tagopt
1216 " "$pfx" "$cur"
1217 return
1218 ;;
1219 remote.*)
1220 local pfx="${cur%.*}."
1221 cur="${cur#*.}"
1222 __gitcomp "$(__git_remotes)" "$pfx" "$cur" "."
1223 return
1224 ;;
1225 esac
1226 __gitcomp "
1227 apply.whitespace
1228 branch.autosetupmerge
1229 branch.autosetuprebase
1230 clean.requireForce
1231 color.branch
1232 color.branch.current
1233 color.branch.local
1234 color.branch.plain
1235 color.branch.remote
1236 color.diff
1237 color.diff.commit
1238 color.diff.frag
1239 color.diff.meta
1240 color.diff.new
1241 color.diff.old
1242 color.diff.plain
1243 color.diff.whitespace
1244 color.interactive
1245 color.interactive.header
1246 color.interactive.help
1247 color.interactive.prompt
1248 color.pager
1249 color.status
1250 color.status.added
1251 color.status.changed
1252 color.status.header
1253 color.status.nobranch
1254 color.status.untracked
1255 color.status.updated
1256 color.ui
1257 commit.template
1258 core.autocrlf
1259 core.bare
1260 core.compression
1261 core.deltaBaseCacheLimit
1262 core.editor
1263 core.excludesfile
1264 core.fileMode
1265 core.fsyncobjectfiles
1266 core.gitProxy
1267 core.ignoreCygwinFSTricks
1268 core.ignoreStat
1269 core.logAllRefUpdates
1270 core.loosecompression
1271 core.packedGitLimit
1272 core.packedGitWindowSize
1273 core.pager
1274 core.preferSymlinkRefs
1275 core.preloadindex
1276 core.quotepath
1277 core.repositoryFormatVersion
1278 core.safecrlf
1279 core.sharedRepository
1280 core.symlinks
1281 core.trustctime
1282 core.warnAmbiguousRefs
1283 core.whitespace
1284 core.worktree
1285 diff.autorefreshindex
1286 diff.external
1287 diff.mnemonicprefix
1288 diff.renameLimit
1289 diff.renameLimit.
1290 diff.renames
1291 fetch.unpackLimit
1292 format.headers
1293 format.numbered
1294 format.pretty
1295 format.suffix
1296 gc.aggressiveWindow
1297 gc.auto
1298 gc.autopacklimit
1299 gc.packrefs
1300 gc.pruneexpire
1301 gc.reflogexpire
1302 gc.reflogexpireunreachable
1303 gc.rerereresolved
1304 gc.rerereunresolved
1305 gitcvs.allbinary
1306 gitcvs.dbTableNamePrefix
1307 gitcvs.dbdriver
1308 gitcvs.dbname
1309 gitcvs.dbpass
1310 gitcvs.dbuser
1311 gitcvs.enabled
1312 gitcvs.logfile
1313 gitcvs.usecrlfattr
1314 gui.blamehistoryctx
1315 gui.commitmsgwidth
1316 gui.copyblamethreshold
1317 gui.diffcontext
1318 gui.encoding
1319 gui.fastcopyblame
1320 gui.matchtrackingbranch
1321 gui.newbranchtemplate
1322 gui.pruneduringfetch
1323 gui.spellingdictionary
1324 gui.trustmtime
1325 help.autocorrect
1326 help.browser
1327 help.format
1328 http.lowSpeedLimit
1329 http.lowSpeedTime
1330 http.maxRequests
1331 http.noEPSV
1332 http.proxy
1333 http.sslCAInfo
1334 http.sslCAPath
1335 http.sslCert
1336 http.sslKey
1337 http.sslVerify
1338 i18n.commitEncoding
1339 i18n.logOutputEncoding
1340 instaweb.browser
1341 instaweb.httpd
1342 instaweb.local
1343 instaweb.modulepath
1344 instaweb.port
1345 log.date
1346 log.showroot
1347 man.viewer
1348 merge.conflictstyle
1349 merge.log
1350 merge.renameLimit
1351 merge.stat
1352 merge.tool
1353 merge.verbosity
1354 mergetool.keepBackup
1355 pack.compression
1356 pack.deltaCacheLimit
1357 pack.deltaCacheSize
1358 pack.depth
1359 pack.indexVersion
1360 pack.packSizeLimit
1361 pack.threads
1362 pack.window
1363 pack.windowMemory
1364 pull.octopus
1365 pull.twohead
1366 receive.denyCurrentBranch
1367 receive.denyDeletes
1368 receive.denyNonFastForwards
1369 receive.fsckObjects
1370 receive.unpackLimit
1371 repack.usedeltabaseoffset
1372 rerere.autoupdate
1373 rerere.enabled
1374 showbranch.default
1375 status.relativePaths
1376 status.showUntrackedFiles
1377 tar.umask
1378 transfer.unpackLimit
1379 user.email
1380 user.name
1381 user.signingkey
1382 web.browser
1383 branch. remote.
1384 "
1385}
1386
1387_git_remote ()
1388{
1389 local subcommands="add rm show prune update"
1390 local subcommand="$(__git_find_subcommand "$subcommands")"
1391 if [ -z "$subcommand" ]; then
1392 __gitcomp "$subcommands"
1393 return
1394 fi
1395
1396 case "$subcommand" in
1397 rm|show|prune)
1398 __gitcomp "$(__git_remotes)"
1399 ;;
1400 update)
1401 local i c='' IFS=$'\n'
1402 for i in $(git --git-dir="$(__gitdir)" config --list); do
1403 case "$i" in
1404 remotes.*)
1405 i="${i#remotes.}"
1406 c="$c ${i/=*/}"
1407 ;;
1408 esac
1409 done
1410 __gitcomp "$c"
1411 ;;
1412 *)
1413 COMPREPLY=()
1414 ;;
1415 esac
1416}
1417
1418_git_reset ()
1419{
1420 __git_has_doubledash && return
1421
1422 local cur="${COMP_WORDS[COMP_CWORD]}"
1423 case "$cur" in
1424 --*)
1425 __gitcomp "--merge --mixed --hard --soft"
1426 return
1427 ;;
1428 esac
1429 __gitcomp "$(__git_refs)"
1430}
1431
1432_git_revert ()
1433{
1434 local cur="${COMP_WORDS[COMP_CWORD]}"
1435 case "$cur" in
1436 --*)
1437 __gitcomp "--edit --mainline --no-edit --no-commit --signoff"
1438 return
1439 ;;
1440 esac
1441 __gitcomp "$(__git_refs)"
1442}
1443
1444_git_rm ()
1445{
1446 __git_has_doubledash && return
1447
1448 local cur="${COMP_WORDS[COMP_CWORD]}"
1449 case "$cur" in
1450 --*)
1451 __gitcomp "--cached --dry-run --ignore-unmatch --quiet"
1452 return
1453 ;;
1454 esac
1455 COMPREPLY=()
1456}
1457
1458_git_shortlog ()
1459{
1460 __git_has_doubledash && return
1461
1462 local cur="${COMP_WORDS[COMP_CWORD]}"
1463 case "$cur" in
1464 --*)
1465 __gitcomp "
1466 --max-count= --max-age= --since= --after=
1467 --min-age= --before= --until=
1468 --no-merges
1469 --author= --committer= --grep=
1470 --all-match
1471 --not --all
1472 --numbered --summary
1473 "
1474 return
1475 ;;
1476 esac
1477 __git_complete_revlist
1478}
1479
1480_git_show ()
1481{
1482 __git_has_doubledash && return
1483
1484 local cur="${COMP_WORDS[COMP_CWORD]}"
1485 case "$cur" in
1486 --pretty=*)
1487 __gitcomp "$__git_log_pretty_formats
1488 " "" "${cur##--pretty=}"
1489 return
1490 ;;
1491 --*)
1492 __gitcomp "--pretty="
1493 return
1494 ;;
1495 esac
1496 __git_complete_file
1497}
1498
1499_git_show_branch ()
1500{
1501 local cur="${COMP_WORDS[COMP_CWORD]}"
1502 case "$cur" in
1503 --*)
1504 __gitcomp "
1505 --all --remotes --topo-order --current --more=
1506 --list --independent --merge-base --no-name
1507 --sha1-name --topics --reflog
1508 "
1509 return
1510 ;;
1511 esac
1512 __git_complete_revlist
1513}
1514
1515_git_stash ()
1516{
1517 local subcommands='save list show apply clear drop pop create branch'
1518 local subcommand="$(__git_find_subcommand "$subcommands")"
1519 if [ -z "$subcommand" ]; then
1520 __gitcomp "$subcommands"
1521 else
1522 local cur="${COMP_WORDS[COMP_CWORD]}"
1523 case "$subcommand,$cur" in
1524 save,--*)
1525 __gitcomp "--keep-index"
1526 ;;
1527 apply,--*)
1528 __gitcomp "--index"
1529 ;;
1530 show,--*|drop,--*|pop,--*|branch,--*)
1531 COMPREPLY=()
1532 ;;
1533 show,*|apply,*|drop,*|pop,*|branch,*)
1534 __gitcomp "$(git --git-dir="$(__gitdir)" stash list \
1535 | sed -n -e 's/:.*//p')"
1536 ;;
1537 *)
1538 COMPREPLY=()
1539 ;;
1540 esac
1541 fi
1542}
1543
1544_git_submodule ()
1545{
1546 __git_has_doubledash && return
1547
1548 local subcommands="add status init update summary foreach sync"
1549 if [ -z "$(__git_find_subcommand "$subcommands")" ]; then
1550 local cur="${COMP_WORDS[COMP_CWORD]}"
1551 case "$cur" in
1552 --*)
1553 __gitcomp "--quiet --cached"
1554 ;;
1555 *)
1556 __gitcomp "$subcommands"
1557 ;;
1558 esac
1559 return
1560 fi
1561}
1562
1563_git_svn ()
1564{
1565 local subcommands="
1566 init fetch clone rebase dcommit log find-rev
1567 set-tree commit-diff info create-ignore propget
1568 proplist show-ignore show-externals
1569 "
1570 local subcommand="$(__git_find_subcommand "$subcommands")"
1571 if [ -z "$subcommand" ]; then
1572 __gitcomp "$subcommands"
1573 else
1574 local remote_opts="--username= --config-dir= --no-auth-cache"
1575 local fc_opts="
1576 --follow-parent --authors-file= --repack=
1577 --no-metadata --use-svm-props --use-svnsync-props
1578 --log-window-size= --no-checkout --quiet
1579 --repack-flags --user-log-author --localtime $remote_opts
1580 "
1581 local init_opts="
1582 --template= --shared= --trunk= --tags=
1583 --branches= --stdlayout --minimize-url
1584 --no-metadata --use-svm-props --use-svnsync-props
1585 --rewrite-root= $remote_opts
1586 "
1587 local cmt_opts="
1588 --edit --rmdir --find-copies-harder --copy-similarity=
1589 "
1590
1591 local cur="${COMP_WORDS[COMP_CWORD]}"
1592 case "$subcommand,$cur" in
1593 fetch,--*)
1594 __gitcomp "--revision= --fetch-all $fc_opts"
1595 ;;
1596 clone,--*)
1597 __gitcomp "--revision= $fc_opts $init_opts"
1598 ;;
1599 init,--*)
1600 __gitcomp "$init_opts"
1601 ;;
1602 dcommit,--*)
1603 __gitcomp "
1604 --merge --strategy= --verbose --dry-run
1605 --fetch-all --no-rebase $cmt_opts $fc_opts
1606 "
1607 ;;
1608 set-tree,--*)
1609 __gitcomp "--stdin $cmt_opts $fc_opts"
1610 ;;
1611 create-ignore,--*|propget,--*|proplist,--*|show-ignore,--*|\
1612 show-externals,--*)
1613 __gitcomp "--revision="
1614 ;;
1615 log,--*)
1616 __gitcomp "
1617 --limit= --revision= --verbose --incremental
1618 --oneline --show-commit --non-recursive
1619 --authors-file=
1620 "
1621 ;;
1622 rebase,--*)
1623 __gitcomp "
1624 --merge --verbose --strategy= --local
1625 --fetch-all $fc_opts
1626 "
1627 ;;
1628 commit-diff,--*)
1629 __gitcomp "--message= --file= --revision= $cmt_opts"
1630 ;;
1631 info,--*)
1632 __gitcomp "--url"
1633 ;;
1634 *)
1635 COMPREPLY=()
1636 ;;
1637 esac
1638 fi
1639}
1640
1641_git_tag ()
1642{
1643 local i c=1 f=0
1644 while [ $c -lt $COMP_CWORD ]; do
1645 i="${COMP_WORDS[c]}"
1646 case "$i" in
1647 -d|-v)
1648 __gitcomp "$(__git_tags)"
1649 return
1650 ;;
1651 -f)
1652 f=1
1653 ;;
1654 esac
1655 c=$((++c))
1656 done
1657
1658 case "${COMP_WORDS[COMP_CWORD-1]}" in
1659 -m|-F)
1660 COMPREPLY=()
1661 ;;
1662 -*|tag)
1663 if [ $f = 1 ]; then
1664 __gitcomp "$(__git_tags)"
1665 else
1666 COMPREPLY=()
1667 fi
1668 ;;
1669 *)
1670 __gitcomp "$(__git_refs)"
1671 ;;
1672 esac
1673}
1674
1675_git ()
1676{
1677 local i c=1 command __git_dir
1678
1679 while [ $c -lt $COMP_CWORD ]; do
1680 i="${COMP_WORDS[c]}"
1681 case "$i" in
1682 --git-dir=*) __git_dir="${i#--git-dir=}" ;;
1683 --bare) __git_dir="." ;;
1684 --version|-p|--paginate) ;;
1685 --help) command="help"; break ;;
1686 *) command="$i"; break ;;
1687 esac
1688 c=$((++c))
1689 done
1690
1691 if [ -z "$command" ]; then
1692 case "${COMP_WORDS[COMP_CWORD]}" in
1693 --*) __gitcomp "
1694 --paginate
1695 --no-pager
1696 --git-dir=
1697 --bare
1698 --version
1699 --exec-path
1700 --work-tree=
1701 --help
1702 "
1703 ;;
1704 *) __gitcomp "$(__git_porcelain_commands) $(__git_aliases)" ;;
1705 esac
1706 return
1707 fi
1708
1709 local expansion=$(__git_aliased_command "$command")
1710 [ "$expansion" ] && command="$expansion"
1711
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
1763}
1764
1765_gitk ()
1766{
1767 __git_has_doubledash && return
1768
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"
1774 fi
1775 case "$cur" in
1776 --*)
1777 __gitcomp "--not --all $merge"
1778 return
1779 ;;
1780 esac
1781 __git_complete_revlist
1782}
1783
1784complete -o bashdefault -o default -o nospace -F _git git 2>/dev/null \
1785 || complete -o default -o nospace -F _git git
1786complete -o bashdefault -o default -o nospace -F _gitk gitk 2>/dev/null \
1787 || complete -o default -o nospace -F _gitk gitk
1788
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.
1792#
1793if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
1794complete -o bashdefault -o default -o nospace -F _git git.exe 2>/dev/null \
1795 || complete -o default -o nospace -F _git git.exe
1796fi