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