Code

Merge branch 'gb/gitweb-opml'
[git.git] / contrib / completion / git-completion.bash
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 #
49 case "$COMP_WORDBREAKS" in
50 *:*) : great ;;
51 *)   COMP_WORDBREAKS="$COMP_WORDBREAKS:"
52 esac
54 # __gitdir accepts 0 or 1 arguments (i.e., location)
55 # returns location of .git repo
56 __gitdir ()
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 }
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
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
127 # __gitcomp_1 requires 2 arguments
128 __gitcomp_1 ()
130         local c IFS=' '$'\t'$'\n'
131         for c in $1; do
132                 case "$c$2" in
133                 --*=*) printf %s$'\n' "$c$2" ;;
134                 *.)    printf %s$'\n' "$c$2" ;;
135                 *)     printf %s$'\n' "$c$2 " ;;
136                 esac
137         done
140 # __gitcomp accepts 1, 2, 3, or 4 arguments
141 # generates completion reply with compgen
142 __gitcomp ()
144         local cur="${COMP_WORDS[COMP_CWORD]}"
145         if [ $# -gt 2 ]; then
146                 cur="$3"
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
161 # __git_heads accepts 0 or 1 arguments (to pass to __gitdir)
162 __git_heads ()
164         local cmd i is_hash=y dir="$(__gitdir "${1-}")"
165         if [ -d "$dir" ]; then
166                 git --git-dir="$dir" for-each-ref --format='%(refname:short)' \
167                         refs/heads
168                 return
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
180 # __git_tags accepts 0 or 1 arguments (to pass to __gitdir)
181 __git_tags ()
183         local cmd i is_hash=y dir="$(__gitdir "${1-}")"
184         if [ -d "$dir" ]; then
185                 git --git-dir="$dir" for-each-ref --format='%(refname:short)' \
186                         refs/tags
187                 return
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
199 # __git_refs accepts 0 or 1 arguments (to pass to __gitdir)
200 __git_refs ()
202         local i is_hash=y dir="$(__gitdir "${1-}")"
203         local cur="${COMP_WORDS[COMP_CWORD]}" format refs
204         if [ -d "$dir" ]; then
205                 case "$cur" in
206                 refs|refs/*)
207                         format="refname"
208                         refs="${cur%/*}"
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
232 # __git_refs2 requires 1 argument (to pass to __git_refs)
233 __git_refs2 ()
235         local i
236         for i in $(__git_refs "$1"); do
237                 echo "$i:$i"
238         done
241 # __git_refs_remotes requires 1 argument (to pass to ls-remote)
242 __git_refs_remotes ()
244         local cmd i is_hash=y
245         for i in $(git ls-remote "$1" 2>/dev/null); do
246                 case "$is_hash,$i" in
247                 n,refs/heads/*)
248                         is_hash=y
249                         echo "$i:refs/remotes/$1/${i#refs/heads/}"
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
259 __git_remotes ()
261         local i ngoff IFS=$'\n' d="$(__gitdir)"
262         shopt -q nullglob || ngoff=1
263         shopt -s nullglob
264         for i in "$d/remotes"/*; do
265                 echo ${i#$d/remotes/}
266         done
267         [ "$ngoff" ] && shopt -u nullglob
268         for i in $(git --git-dir="$d" config --list); do
269                 case "$i" in
270                 remote.*.url=*)
271                         i="${i#remote.}"
272                         echo "${i/.url=*/}"
273                         ;;
274                 esac
275         done
278 __git_merge_strategies ()
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         }'
293 __git_merge_strategylist=
294 __git_merge_strategylist=$(__git_merge_strategies 2>/dev/null)
296 __git_complete_file ()
298         local pfx ls ref cur="${COMP_WORDS[COMP_CWORD]}"
299         case "$cur" in
300         ?*:*)
301                 ref="${cur%%:*}"
302                 cur="${cur#*:}"
303                 case "$cur" in
304                 ?*/*)
305                         pfx="${cur%/*}"
306                         cur="${cur##*/}"
307                         ls="$ref:$pfx"
308                         pfx="$pfx/"
309                         ;;
310                 *)
311                         ls="$ref"
312                         ;;
313             esac
315                 case "$COMP_WORDBREAKS" in
316                 *:*) : great ;;
317                 *)   pfx="$ref:$pfx" ;;
318                 esac
320                 local IFS=$'\n'
321                 COMPREPLY=($(compgen -P "$pfx" \
322                         -W "$(git --git-dir="$(__gitdir)" ls-tree "$ls" \
323                                 | sed '/^100... blob /{
324                                            s,^.*        ,,
325                                            s,$, ,
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
344 __git_complete_revlist ()
346         local pfx cur="${COMP_WORDS[COMP_CWORD]}"
347         case "$cur" in
348         *...*)
349                 pfx="${cur%...*}..."
350                 cur="${cur#*...}"
351                 __gitcomp "$(__git_refs)" "$pfx" "$cur"
352                 ;;
353         *..*)
354                 pfx="${cur%..*}.."
355                 cur="${cur#*..}"
356                 __gitcomp "$(__git_refs)" "$pfx" "$cur"
357                 ;;
358         *)
359                 __gitcomp "$(__git_refs)"
360                 ;;
361         esac
364 __git_all_commands ()
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
379 __git_all_commandlist=
380 __git_all_commandlist="$(__git_all_commands 2>/dev/null)"
382 __git_porcelain_commands ()
384         if [ -n "$__git_porcelain_commandlist" ]; then
385                 echo "$__git_porcelain_commandlist"
386                 return
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
470 __git_porcelain_commandlist=
471 __git_porcelain_commandlist="$(__git_porcelain_commands 2>/dev/null)"
473 __git_aliases ()
475         local i IFS=$'\n'
476         for i in $(git --git-dir="$(__gitdir)" config --list); do
477                 case "$i" in
478                 alias.*)
479                         i="${i#alias.}"
480                         echo "${i/=*/}"
481                         ;;
482                 esac
483         done
486 # __git_aliased_command requires 1 argument
487 __git_aliased_command ()
489         local word cmdline=$(git --git-dir="$(__gitdir)" \
490                 config --get "alias.$1")
491         for word in $cmdline; do
492                 if [ "${word##-*}" ]; then
493                         echo $word
494                         return
495                 fi
496         done
499 # __git_find_subcommand requires 1 argument
500 __git_find_subcommand ()
502         local word subcommand c=1
504         while [ $c -lt $COMP_CWORD ]; do
505                 word="${COMP_WORDS[c]}"
506                 for subcommand in $1; do
507                         if [ "$subcommand" = "$word" ]; then
508                                 echo "$subcommand"
509                                 return
510                         fi
511                 done
512                 c=$((++c))
513         done
516 __git_has_doubledash ()
518         local c=1
519         while [ $c -lt $COMP_CWORD ]; do
520                 if [ "--" = "${COMP_WORDS[c]}" ]; then
521                         return 0
522                 fi
523                 c=$((++c))
524         done
525         return 1
528 __git_whitespacelist="nowarn warn error error-all fix"
530 _git_am ()
532         local cur="${COMP_WORDS[COMP_CWORD]}" dir="$(__gitdir)"
533         if [ -d "$dir"/rebase-apply ]; then
534                 __gitcomp "--skip --resolved --abort"
535                 return
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=()
552 _git_apply ()
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=()
572 _git_add ()
574         __git_has_doubledash && return
576         local cur="${COMP_WORDS[COMP_CWORD]}"
577         case "$cur" in
578         --*)
579                 __gitcomp "
580                         --interactive --refresh --patch --update --dry-run
581                         --ignore-errors --intent-to-add
582                         "
583                 return
584         esac
585         COMPREPLY=()
588 _git_archive ()
590         local cur="${COMP_WORDS[COMP_CWORD]}"
591         case "$cur" in
592         --format=*)
593                 __gitcomp "$(git archive --list)" "" "${cur##--format=}"
594                 return
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
611 _git_bisect ()
613         __git_has_doubledash && return
615         local subcommands="start bad good skip reset visualize replay log run"
616         local subcommand="$(__git_find_subcommand "$subcommands")"
617         if [ -z "$subcommand" ]; then
618                 __gitcomp "$subcommands"
619                 return
620         fi
622         case "$subcommand" in
623         bad|good|reset|skip)
624                 __gitcomp "$(__git_refs)"
625                 ;;
626         *)
627                 COMPREPLY=()
628                 ;;
629         esac
632 _git_branch ()
634         local i c=1 only_local_ref="n" has_r="n"
636         while [ $c -lt $COMP_CWORD ]; do
637                 i="${COMP_WORDS[c]}"
638                 case "$i" in
639                 -d|-m)  only_local_ref="y" ;;
640                 -r)     has_r="y" ;;
641                 esac
642                 c=$((++c))
643         done
645         case "${COMP_WORDS[COMP_CWORD]}" in
646         --*)
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
662 _git_bundle ()
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
682 _git_checkout ()
684         __git_has_doubledash && return
686         __gitcomp "$(__git_refs)"
689 _git_cherry ()
691         __gitcomp "$(__git_refs)"
694 _git_cherry_pick ()
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
707 _git_clean ()
709         __git_has_doubledash && return
711         local cur="${COMP_WORDS[COMP_CWORD]}"
712         case "$cur" in
713         --*)
714                 __gitcomp "--dry-run --quiet"
715                 return
716                 ;;
717         esac
718         COMPREPLY=()
721 _git_clone ()
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=()
746 _git_commit ()
748         __git_has_doubledash && return
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=()
762 _git_describe ()
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)"
776 _git_diff ()
778         __git_has_doubledash && return
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
801 _git_fetch ()
803         local cur="${COMP_WORDS[COMP_CWORD]}"
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
824 _git_format_patch ()
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
850 _git_gc ()
852         local cur="${COMP_WORDS[COMP_CWORD]}"
853         case "$cur" in
854         --*)
855                 __gitcomp "--prune --aggressive"
856                 return
857                 ;;
858         esac
859         COMPREPLY=()
862 _git_grep ()
864         __git_has_doubledash && return
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=()
885 _git_help ()
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                 "
902 _git_init ()
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=()
920 _git_ls_files ()
922         __git_has_doubledash && return
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=()
940 _git_ls_remote ()
942         __gitcomp "$(__git_remotes)"
945 _git_ls_tree ()
947         __git_complete_file
950 __git_log_pretty_formats="oneline short medium full fuller email raw format:"
952 _git_log ()
954         __git_has_doubledash && return
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
996 _git_merge ()
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)"
1018 _git_mergetool ()
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=()
1037 _git_merge_base ()
1039         __gitcomp "$(__git_refs)"
1042 _git_mv ()
1044         local cur="${COMP_WORDS[COMP_CWORD]}"
1045         case "$cur" in
1046         --*)
1047                 __gitcomp "--dry-run"
1048                 return
1049                 ;;
1050         esac
1051         COMPREPLY=()
1054 _git_name_rev ()
1056         __gitcomp "--tags --all --stdin"
1059 _git_pull ()
1061         local cur="${COMP_WORDS[COMP_CWORD]}"
1063         if [ "$COMP_CWORD" = 2 ]; then
1064                 __gitcomp "$(__git_remotes)"
1065         else
1066                 __gitcomp "$(__git_refs "${COMP_WORDS[2]}")"
1067         fi
1070 _git_push ()
1072         local cur="${COMP_WORDS[COMP_CWORD]}"
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
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
1097 _git_rebase ()
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)"
1121 _git_send_email ()
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=()
1140 _git_config ()
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         "
1387 _git_remote ()
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
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
1418 _git_reset ()
1420         __git_has_doubledash && return
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)"
1432 _git_revert ()
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)"
1444 _git_rm ()
1446         __git_has_doubledash && return
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=()
1458 _git_shortlog ()
1460         __git_has_doubledash && return
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
1480 _git_show ()
1482         __git_has_doubledash && return
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
1499 _git_show_branch ()
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
1515 _git_stash ()
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
1544 _git_submodule ()
1546         __git_has_doubledash && return
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
1563 _git_svn ()
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 $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                         "
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
1641 _git_tag ()
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
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
1675 _git ()
1677         local i c=1 command __git_dir
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
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
1709         local expansion=$(__git_aliased_command "$command")
1710         [ "$expansion" ] && command="$expansion"
1712         case "$command" in
1713         am)          _git_am ;;
1714         add)         _git_add ;;
1715         apply)       _git_apply ;;
1716         archive)     _git_archive ;;
1717         bisect)      _git_bisect ;;
1718         bundle)      _git_bundle ;;
1719         branch)      _git_branch ;;
1720         checkout)    _git_checkout ;;
1721         cherry)      _git_cherry ;;
1722         cherry-pick) _git_cherry_pick ;;
1723         clean)       _git_clean ;;
1724         clone)       _git_clone ;;
1725         commit)      _git_commit ;;
1726         config)      _git_config ;;
1727         describe)    _git_describe ;;
1728         diff)        _git_diff ;;
1729         fetch)       _git_fetch ;;
1730         format-patch) _git_format_patch ;;
1731         gc)          _git_gc ;;
1732         grep)        _git_grep ;;
1733         help)        _git_help ;;
1734         init)        _git_init ;;
1735         log)         _git_log ;;
1736         ls-files)    _git_ls_files ;;
1737         ls-remote)   _git_ls_remote ;;
1738         ls-tree)     _git_ls_tree ;;
1739         merge)       _git_merge;;
1740         mergetool)   _git_mergetool;;
1741         merge-base)  _git_merge_base ;;
1742         mv)          _git_mv ;;
1743         name-rev)    _git_name_rev ;;
1744         pull)        _git_pull ;;
1745         push)        _git_push ;;
1746         rebase)      _git_rebase ;;
1747         remote)      _git_remote ;;
1748         reset)       _git_reset ;;
1749         revert)      _git_revert ;;
1750         rm)          _git_rm ;;
1751         send-email)  _git_send_email ;;
1752         shortlog)    _git_shortlog ;;
1753         show)        _git_show ;;
1754         show-branch) _git_show_branch ;;
1755         stash)       _git_stash ;;
1756         stage)       _git_add ;;
1757         submodule)   _git_submodule ;;
1758         svn)         _git_svn ;;
1759         tag)         _git_tag ;;
1760         whatchanged) _git_log ;;
1761         *)           COMPREPLY=() ;;
1762         esac
1765 _gitk ()
1767         __git_has_doubledash && return
1769         local cur="${COMP_WORDS[COMP_CWORD]}"
1770         local g="$(git rev-parse --git-dir 2>/dev/null)"
1771         local merge=""
1772         if [ -f $g/MERGE_HEAD ]; then
1773                 merge="--merge"
1774         fi
1775         case "$cur" in
1776         --*)
1777                 __gitcomp "--not --all $merge"
1778                 return
1779                 ;;
1780         esac
1781         __git_complete_revlist
1784 complete -o bashdefault -o default -o nospace -F _git git 2>/dev/null \
1785         || complete -o default -o nospace -F _git git
1786 complete -o bashdefault -o default -o nospace -F _gitk gitk 2>/dev/null \
1787         || complete -o default -o nospace -F _gitk gitk
1789 # The following are necessary only for Cygwin, and only are needed
1790 # when the user has tab-completed the executable name and consequently
1791 # included the '.exe' suffix.
1793 if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
1794 complete -o bashdefault -o default -o nospace -F _git git.exe 2>/dev/null \
1795         || complete -o default -o nospace -F _git git.exe
1796 fi