Code

e32c1f1a9ccd26132f4bf7e42905ac5ce16a67a2
[git.git] / contrib / completion / git-completion.bash
1 #
2 # bash completion support for core Git.
3 #
4 # Copyright (C) 2006,2007 Shawn O. Pearce <spearce@spearce.org>
5 # Conceptually based on gitcompletion (http://gitweb.hawaga.org.uk/).
6 # Distributed under the GNU General Public License, version 2.0.
7 #
8 # The contained completion routines provide support for completing:
9 #
10 #    *) local and remote branch names
11 #    *) local and remote tag names
12 #    *) .git/remotes file names
13 #    *) git 'subcommands'
14 #    *) tree paths within 'ref:path/to/file' expressions
15 #    *) common --long-options
16 #
17 # To use these routines:
18 #
19 #    1) Copy this file to somewhere (e.g. ~/.git-completion.sh).
20 #    2) Added the following line to your .bashrc:
21 #        source ~/.git-completion.sh
22 #
23 #    3) You may want to make sure the git executable is available
24 #       in your PATH before this script is sourced, as some caching
25 #       is performed while the script loads.  If git isn't found
26 #       at source time then all lookups will be done on demand,
27 #       which may be slightly slower.
28 #
29 #    4) Consider changing your PS1 to also show the current branch:
30 #        PS1='[\u@\h \W$(__git_ps1 " (%s)")]\$ '
31 #
32 #       The argument to __git_ps1 will be displayed only if you
33 #       are currently in a git repository.  The %s token will be
34 #       the name of the current branch.
35 #
36 # To submit patches:
37 #
38 #    *) Read Documentation/SubmittingPatches
39 #    *) Send all patches to the current maintainer:
40 #
41 #       "Shawn O. Pearce" <spearce@spearce.org>
42 #
43 #    *) Always CC the Git mailing list:
44 #
45 #       git@vger.kernel.org
46 #
48 case "$COMP_WORDBREAKS" in
49 *:*) : great ;;
50 *)   COMP_WORDBREAKS="$COMP_WORDBREAKS:"
51 esac
53 __gitdir ()
54 {
55         if [ -z "$1" ]; then
56                 if [ -n "$__git_dir" ]; then
57                         echo "$__git_dir"
58                 elif [ -d .git ]; then
59                         echo .git
60                 else
61                         git rev-parse --git-dir 2>/dev/null
62                 fi
63         elif [ -d "$1/.git" ]; then
64                 echo "$1/.git"
65         else
66                 echo "$1"
67         fi
68 }
70 __git_ps1 ()
71 {
72         local g="$(git rev-parse --git-dir 2>/dev/null)"
73         if [ -n "$g" ]; then
74                 local r
75                 local b
76                 if [ -d "$g/rebase-apply" ]
77                 then
78                         if test -f "$g/rebase-apply/rebasing"
79                         then
80                                 r="|REBASE"
81                         elif test -f "$g/rebase-apply/applying"
82                         then
83                                 r="|AM"
84                         else
85                                 r="|AM/REBASE"
86                         fi
87                         b="$(git symbolic-ref HEAD 2>/dev/null)"
88                 elif [ -f "$g/rebase-merge/interactive" ]
89                 then
90                         r="|REBASE-i"
91                         b="$(cat "$g/rebase-merge/head-name")"
92                 elif [ -d "$g/rebase-merge" ]
93                 then
94                         r="|REBASE-m"
95                         b="$(cat "$g/rebase-merge/head-name")"
96                 elif [ -f "$g/MERGE_HEAD" ]
97                 then
98                         r="|MERGING"
99                         b="$(git symbolic-ref HEAD 2>/dev/null)"
100                 else
101                         if [ -f "$g/BISECT_LOG" ]
102                         then
103                                 r="|BISECTING"
104                         fi
105                         if ! b="$(git symbolic-ref HEAD 2>/dev/null)"
106                         then
107                                 if ! b="$(git describe --exact-match HEAD 2>/dev/null)"
108                                 then
109                                         b="$(cut -c1-7 "$g/HEAD")..."
110                                 fi
111                         fi
112                 fi
114                 if [ -n "$1" ]; then
115                         printf "$1" "${b##refs/heads/}$r"
116                 else
117                         printf " (%s)" "${b##refs/heads/}$r"
118                 fi
119         fi
122 __gitcomp_1 ()
124         local c IFS=' '$'\t'$'\n'
125         for c in $1; do
126                 case "$c$2" in
127                 --*=*) printf %s$'\n' "$c$2" ;;
128                 *.)    printf %s$'\n' "$c$2" ;;
129                 *)     printf %s$'\n' "$c$2 " ;;
130                 esac
131         done
134 __gitcomp ()
136         local cur="${COMP_WORDS[COMP_CWORD]}"
137         if [ $# -gt 2 ]; then
138                 cur="$3"
139         fi
140         case "$cur" in
141         --*=)
142                 COMPREPLY=()
143                 ;;
144         *)
145                 local IFS=$'\n'
146                 COMPREPLY=($(compgen -P "$2" \
147                         -W "$(__gitcomp_1 "$1" "$4")" \
148                         -- "$cur"))
149                 ;;
150         esac
153 __git_heads ()
155         local cmd i is_hash=y dir="$(__gitdir "$1")"
156         if [ -d "$dir" ]; then
157                 for i in $(git --git-dir="$dir" \
158                         for-each-ref --format='%(refname)' \
159                         refs/heads ); do
160                         echo "${i#refs/heads/}"
161                 done
162                 return
163         fi
164         for i in $(git ls-remote "$1" 2>/dev/null); do
165                 case "$is_hash,$i" in
166                 y,*) is_hash=n ;;
167                 n,*^{}) is_hash=y ;;
168                 n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;
169                 n,*) is_hash=y; echo "$i" ;;
170                 esac
171         done
174 __git_tags ()
176         local cmd i is_hash=y dir="$(__gitdir "$1")"
177         if [ -d "$dir" ]; then
178                 for i in $(git --git-dir="$dir" \
179                         for-each-ref --format='%(refname)' \
180                         refs/tags ); do
181                         echo "${i#refs/tags/}"
182                 done
183                 return
184         fi
185         for i in $(git ls-remote "$1" 2>/dev/null); do
186                 case "$is_hash,$i" in
187                 y,*) is_hash=n ;;
188                 n,*^{}) is_hash=y ;;
189                 n,refs/tags/*) is_hash=y; echo "${i#refs/tags/}" ;;
190                 n,*) is_hash=y; echo "$i" ;;
191                 esac
192         done
195 __git_refs ()
197         local cmd i is_hash=y dir="$(__gitdir "$1")"
198         if [ -d "$dir" ]; then
199                 if [ -e "$dir/HEAD" ]; then echo HEAD; fi
200                 for i in $(git --git-dir="$dir" \
201                         for-each-ref --format='%(refname)' \
202                         refs/tags refs/heads refs/remotes); do
203                         case "$i" in
204                                 refs/tags/*)    echo "${i#refs/tags/}" ;;
205                                 refs/heads/*)   echo "${i#refs/heads/}" ;;
206                                 refs/remotes/*) echo "${i#refs/remotes/}" ;;
207                                 *)              echo "$i" ;;
208                         esac
209                 done
210                 return
211         fi
212         for i in $(git ls-remote "$dir" 2>/dev/null); do
213                 case "$is_hash,$i" in
214                 y,*) is_hash=n ;;
215                 n,*^{}) is_hash=y ;;
216                 n,refs/tags/*) is_hash=y; echo "${i#refs/tags/}" ;;
217                 n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;
218                 n,refs/remotes/*) is_hash=y; echo "${i#refs/remotes/}" ;;
219                 n,*) is_hash=y; echo "$i" ;;
220                 esac
221         done
224 __git_refs2 ()
226         local i
227         for i in $(__git_refs "$1"); do
228                 echo "$i:$i"
229         done
232 __git_refs_remotes ()
234         local cmd i is_hash=y
235         for i in $(git ls-remote "$1" 2>/dev/null); do
236                 case "$is_hash,$i" in
237                 n,refs/heads/*)
238                         is_hash=y
239                         echo "$i:refs/remotes/$1/${i#refs/heads/}"
240                         ;;
241                 y,*) is_hash=n ;;
242                 n,*^{}) is_hash=y ;;
243                 n,refs/tags/*) is_hash=y;;
244                 n,*) is_hash=y; ;;
245                 esac
246         done
249 __git_remotes ()
251         local i ngoff IFS=$'\n' d="$(__gitdir)"
252         shopt -q nullglob || ngoff=1
253         shopt -s nullglob
254         for i in "$d/remotes"/*; do
255                 echo ${i#$d/remotes/}
256         done
257         [ "$ngoff" ] && shopt -u nullglob
258         for i in $(git --git-dir="$d" config --list); do
259                 case "$i" in
260                 remote.*.url=*)
261                         i="${i#remote.}"
262                         echo "${i/.url=*/}"
263                         ;;
264                 esac
265         done
268 __git_merge_strategies ()
270         if [ -n "$__git_merge_strategylist" ]; then
271                 echo "$__git_merge_strategylist"
272                 return
273         fi
274         sed -n "/^all_strategies='/{
275                 s/^all_strategies='//
276                 s/'//
277                 p
278                 q
279                 }" "$(git --exec-path)/git-merge"
281 __git_merge_strategylist=
282 __git_merge_strategylist="$(__git_merge_strategies 2>/dev/null)"
284 __git_complete_file ()
286         local pfx ls ref cur="${COMP_WORDS[COMP_CWORD]}"
287         case "$cur" in
288         ?*:*)
289                 ref="${cur%%:*}"
290                 cur="${cur#*:}"
291                 case "$cur" in
292                 ?*/*)
293                         pfx="${cur%/*}"
294                         cur="${cur##*/}"
295                         ls="$ref:$pfx"
296                         pfx="$pfx/"
297                         ;;
298                 *)
299                         ls="$ref"
300                         ;;
301             esac
303                 case "$COMP_WORDBREAKS" in
304                 *:*) : great ;;
305                 *)   pfx="$ref:$pfx" ;;
306                 esac
308                 local IFS=$'\n'
309                 COMPREPLY=($(compgen -P "$pfx" \
310                         -W "$(git --git-dir="$(__gitdir)" ls-tree "$ls" \
311                                 | sed '/^100... blob /{
312                                            s,^.*        ,,
313                                            s,$, ,
314                                        }
315                                        /^120000 blob /{
316                                            s,^.*        ,,
317                                            s,$, ,
318                                        }
319                                        /^040000 tree /{
320                                            s,^.*        ,,
321                                            s,$,/,
322                                        }
323                                        s/^.*    //')" \
324                         -- "$cur"))
325                 ;;
326         *)
327                 __gitcomp "$(__git_refs)"
328                 ;;
329         esac
332 __git_complete_revlist ()
334         local pfx cur="${COMP_WORDS[COMP_CWORD]}"
335         case "$cur" in
336         *...*)
337                 pfx="${cur%...*}..."
338                 cur="${cur#*...}"
339                 __gitcomp "$(__git_refs)" "$pfx" "$cur"
340                 ;;
341         *..*)
342                 pfx="${cur%..*}.."
343                 cur="${cur#*..}"
344                 __gitcomp "$(__git_refs)" "$pfx" "$cur"
345                 ;;
346         *)
347                 __gitcomp "$(__git_refs)"
348                 ;;
349         esac
352 __git_all_commands ()
354         if [ -n "$__git_all_commandlist" ]; then
355                 echo "$__git_all_commandlist"
356                 return
357         fi
358         local i IFS=" "$'\n'
359         for i in $(git help -a|egrep '^ ')
360         do
361                 case $i in
362                 *--*)             : helper pattern;;
363                 *) echo $i;;
364                 esac
365         done
367 __git_all_commandlist=
368 __git_all_commandlist="$(__git_all_commands 2>/dev/null)"
370 __git_porcelain_commands ()
372         if [ -n "$__git_porcelain_commandlist" ]; then
373                 echo "$__git_porcelain_commandlist"
374                 return
375         fi
376         local i IFS=" "$'\n'
377         for i in "help" $(__git_all_commands)
378         do
379                 case $i in
380                 *--*)             : helper pattern;;
381                 applymbox)        : ask gittus;;
382                 applypatch)       : ask gittus;;
383                 archimport)       : import;;
384                 cat-file)         : plumbing;;
385                 check-attr)       : plumbing;;
386                 check-ref-format) : plumbing;;
387                 commit-tree)      : plumbing;;
388                 cvsexportcommit)  : export;;
389                 cvsimport)        : import;;
390                 cvsserver)        : daemon;;
391                 daemon)           : daemon;;
392                 diff-files)       : plumbing;;
393                 diff-index)       : plumbing;;
394                 diff-tree)        : plumbing;;
395                 fast-import)      : import;;
396                 fsck-objects)     : plumbing;;
397                 fetch-pack)       : plumbing;;
398                 fmt-merge-msg)    : plumbing;;
399                 for-each-ref)     : plumbing;;
400                 hash-object)      : plumbing;;
401                 http-*)           : transport;;
402                 index-pack)       : plumbing;;
403                 init-db)          : deprecated;;
404                 local-fetch)      : plumbing;;
405                 mailinfo)         : plumbing;;
406                 mailsplit)        : plumbing;;
407                 merge-*)          : plumbing;;
408                 mktree)           : plumbing;;
409                 mktag)            : plumbing;;
410                 pack-objects)     : plumbing;;
411                 pack-redundant)   : plumbing;;
412                 pack-refs)        : plumbing;;
413                 parse-remote)     : plumbing;;
414                 patch-id)         : plumbing;;
415                 peek-remote)      : plumbing;;
416                 prune)            : plumbing;;
417                 prune-packed)     : plumbing;;
418                 quiltimport)      : import;;
419                 read-tree)        : plumbing;;
420                 receive-pack)     : plumbing;;
421                 reflog)           : plumbing;;
422                 repo-config)      : deprecated;;
423                 rerere)           : plumbing;;
424                 rev-list)         : plumbing;;
425                 rev-parse)        : plumbing;;
426                 runstatus)        : plumbing;;
427                 sh-setup)         : internal;;
428                 shell)            : daemon;;
429                 send-pack)        : plumbing;;
430                 show-index)       : plumbing;;
431                 ssh-*)            : transport;;
432                 stripspace)       : plumbing;;
433                 symbolic-ref)     : plumbing;;
434                 tar-tree)         : deprecated;;
435                 unpack-file)      : plumbing;;
436                 unpack-objects)   : plumbing;;
437                 update-index)     : plumbing;;
438                 update-ref)       : plumbing;;
439                 update-server-info) : daemon;;
440                 upload-archive)   : plumbing;;
441                 upload-pack)      : plumbing;;
442                 write-tree)       : plumbing;;
443                 verify-tag)       : plumbing;;
444                 *) echo $i;;
445                 esac
446         done
448 __git_porcelain_commandlist=
449 __git_porcelain_commandlist="$(__git_porcelain_commands 2>/dev/null)"
451 __git_aliases ()
453         local i IFS=$'\n'
454         for i in $(git --git-dir="$(__gitdir)" config --list); do
455                 case "$i" in
456                 alias.*)
457                         i="${i#alias.}"
458                         echo "${i/=*/}"
459                         ;;
460                 esac
461         done
464 __git_aliased_command ()
466         local word cmdline=$(git --git-dir="$(__gitdir)" \
467                 config --get "alias.$1")
468         for word in $cmdline; do
469                 if [ "${word##-*}" ]; then
470                         echo $word
471                         return
472                 fi
473         done
476 __git_find_subcommand ()
478         local word subcommand c=1
480         while [ $c -lt $COMP_CWORD ]; do
481                 word="${COMP_WORDS[c]}"
482                 for subcommand in $1; do
483                         if [ "$subcommand" = "$word" ]; then
484                                 echo "$subcommand"
485                                 return
486                         fi
487                 done
488                 c=$((++c))
489         done
492 __git_has_doubledash ()
494         local c=1
495         while [ $c -lt $COMP_CWORD ]; do
496                 if [ "--" = "${COMP_WORDS[c]}" ]; then
497                         return 0
498                 fi
499                 c=$((++c))
500         done
501         return 1
504 __git_whitespacelist="nowarn warn error error-all strip"
506 _git_am ()
508         local cur="${COMP_WORDS[COMP_CWORD]}" dir="$(__gitdir)"
509         if [ -d "$dir"/rebase-apply ]; then
510                 __gitcomp "--skip --resolved --abort"
511                 return
512         fi
513         case "$cur" in
514         --whitespace=*)
515                 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
516                 return
517                 ;;
518         --*)
519                 __gitcomp "
520                         --signoff --utf8 --binary --3way --interactive
521                         --whitespace=
522                         "
523                 return
524         esac
525         COMPREPLY=()
528 _git_apply ()
530         local cur="${COMP_WORDS[COMP_CWORD]}"
531         case "$cur" in
532         --whitespace=*)
533                 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
534                 return
535                 ;;
536         --*)
537                 __gitcomp "
538                         --stat --numstat --summary --check --index
539                         --cached --index-info --reverse --reject --unidiff-zero
540                         --apply --no-add --exclude=
541                         --whitespace= --inaccurate-eof --verbose
542                         "
543                 return
544         esac
545         COMPREPLY=()
548 _git_add ()
550         __git_has_doubledash && return
552         local cur="${COMP_WORDS[COMP_CWORD]}"
553         case "$cur" in
554         --*)
555                 __gitcomp "
556                         --interactive --refresh --patch --update --dry-run
557                         --ignore-errors
558                         "
559                 return
560         esac
561         COMPREPLY=()
564 _git_bisect ()
566         __git_has_doubledash && return
568         local subcommands="start bad good skip reset visualize replay log run"
569         local subcommand="$(__git_find_subcommand "$subcommands")"
570         if [ -z "$subcommand" ]; then
571                 __gitcomp "$subcommands"
572                 return
573         fi
575         case "$subcommand" in
576         bad|good|reset|skip)
577                 __gitcomp "$(__git_refs)"
578                 ;;
579         *)
580                 COMPREPLY=()
581                 ;;
582         esac
585 _git_branch ()
587         local i c=1 only_local_ref="n" has_r="n"
589         while [ $c -lt $COMP_CWORD ]; do
590                 i="${COMP_WORDS[c]}"
591                 case "$i" in
592                 -d|-m)  only_local_ref="y" ;;
593                 -r)     has_r="y" ;;
594                 esac
595                 c=$((++c))
596         done
598         case "${COMP_WORDS[COMP_CWORD]}" in
599         --*=*)  COMPREPLY=() ;;
600         --*)
601                 __gitcomp "
602                         --color --no-color --verbose --abbrev= --no-abbrev
603                         --track --no-track --contains --merged --no-merged
604                         "
605                 ;;
606         *)
607                 if [ $only_local_ref = "y" -a $has_r = "n" ]; then
608                         __gitcomp "$(__git_heads)"
609                 else
610                         __gitcomp "$(__git_refs)"
611                 fi
612                 ;;
613         esac
616 _git_bundle ()
618         local mycword="$COMP_CWORD"
619         case "${COMP_WORDS[0]}" in
620         git)
621                 local cmd="${COMP_WORDS[2]}"
622                 mycword="$((mycword-1))"
623                 ;;
624         git-bundle*)
625                 local cmd="${COMP_WORDS[1]}"
626                 ;;
627         esac
628         case "$mycword" in
629         1)
630                 __gitcomp "create list-heads verify unbundle"
631                 ;;
632         2)
633                 # looking for a file
634                 ;;
635         *)
636                 case "$cmd" in
637                         create)
638                                 __git_complete_revlist
639                         ;;
640                 esac
641                 ;;
642         esac
645 _git_checkout ()
647         __git_has_doubledash && return
649         __gitcomp "$(__git_refs)"
652 _git_cherry ()
654         __gitcomp "$(__git_refs)"
657 _git_cherry_pick ()
659         local cur="${COMP_WORDS[COMP_CWORD]}"
660         case "$cur" in
661         --*)
662                 __gitcomp "--edit --no-commit"
663                 ;;
664         *)
665                 __gitcomp "$(__git_refs)"
666                 ;;
667         esac
670 _git_commit ()
672         __git_has_doubledash && return
674         local cur="${COMP_WORDS[COMP_CWORD]}"
675         case "$cur" in
676         --*)
677                 __gitcomp "
678                         --all --author= --signoff --verify --no-verify
679                         --edit --amend --include --only
680                         "
681                 return
682         esac
683         COMPREPLY=()
686 _git_describe ()
688         local cur="${COMP_WORDS[COMP_CWORD]}"
689         case "$cur" in
690         --*)
691                 __gitcomp "
692                         --all --tags --contains --abbrev= --candidates=
693                         --exact-match --debug --long --match --always
694                         "
695                 return
696         esac
697         __gitcomp "$(__git_refs)"
700 _git_diff ()
702         __git_has_doubledash && return
704         local cur="${COMP_WORDS[COMP_CWORD]}"
705         case "$cur" in
706         --*)
707                 __gitcomp "--cached --stat --numstat --shortstat --summary
708                         --patch-with-stat --name-only --name-status --color
709                         --no-color --color-words --no-renames --check
710                         --full-index --binary --abbrev --diff-filter
711                         --find-copies-harder --pickaxe-all --pickaxe-regex
712                         --text --ignore-space-at-eol --ignore-space-change
713                         --ignore-all-space --exit-code --quiet --ext-diff
714                         --no-ext-diff
715                         --no-prefix --src-prefix= --dst-prefix=
716                         --base --ours --theirs
717                         "
718                 return
719                 ;;
720         esac
721         __git_complete_file
724 _git_fetch ()
726         local cur="${COMP_WORDS[COMP_CWORD]}"
728         case "${COMP_WORDS[0]},$COMP_CWORD" in
729         git-fetch*,1)
730                 __gitcomp "$(__git_remotes)"
731                 ;;
732         git,2)
733                 __gitcomp "$(__git_remotes)"
734                 ;;
735         *)
736                 case "$cur" in
737                 *:*)
738                         local pfx=""
739                         case "$COMP_WORDBREAKS" in
740                         *:*) : great ;;
741                         *)   pfx="${cur%%:*}:" ;;
742                         esac
743                         __gitcomp "$(__git_refs)" "$pfx" "${cur#*:}"
744                         ;;
745                 *)
746                         local remote
747                         case "${COMP_WORDS[0]}" in
748                         git-fetch) remote="${COMP_WORDS[1]}" ;;
749                         git)       remote="${COMP_WORDS[2]}" ;;
750                         esac
751                         __gitcomp "$(__git_refs2 "$remote")"
752                         ;;
753                 esac
754                 ;;
755         esac
758 _git_format_patch ()
760         local cur="${COMP_WORDS[COMP_CWORD]}"
761         case "$cur" in
762         --*)
763                 __gitcomp "
764                         --stdout --attach --thread
765                         --output-directory
766                         --numbered --start-number
767                         --numbered-files
768                         --keep-subject
769                         --signoff
770                         --in-reply-to=
771                         --full-index --binary
772                         --not --all
773                         --cover-letter
774                         --no-prefix --src-prefix= --dst-prefix=
775                         "
776                 return
777                 ;;
778         esac
779         __git_complete_revlist
782 _git_gc ()
784         local cur="${COMP_WORDS[COMP_CWORD]}"
785         case "$cur" in
786         --*)
787                 __gitcomp "--prune --aggressive"
788                 return
789                 ;;
790         esac
791         COMPREPLY=()
794 _git_help ()
796         local cur="${COMP_WORDS[COMP_CWORD]}"
797         case "$cur" in
798         --*)
799                 __gitcomp "--all --info --man --web"
800                 return
801                 ;;
802         esac
803         __gitcomp "$(__git_all_commands)"
806 _git_ls_remote ()
808         __gitcomp "$(__git_remotes)"
811 _git_ls_tree ()
813         __git_complete_file
816 _git_log ()
818         __git_has_doubledash && return
820         local cur="${COMP_WORDS[COMP_CWORD]}"
821         case "$cur" in
822         --pretty=*)
823                 __gitcomp "
824                         oneline short medium full fuller email raw
825                         " "" "${cur##--pretty=}"
826                 return
827                 ;;
828         --date=*)
829                 __gitcomp "
830                         relative iso8601 rfc2822 short local default
831                 " "" "${cur##--date=}"
832                 return
833                 ;;
834         --*)
835                 __gitcomp "
836                         --max-count= --max-age= --since= --after=
837                         --min-age= --before= --until=
838                         --root --topo-order --date-order --reverse
839                         --no-merges --follow
840                         --abbrev-commit --abbrev=
841                         --relative-date --date=
842                         --author= --committer= --grep=
843                         --all-match
844                         --pretty= --name-status --name-only --raw
845                         --not --all
846                         --left-right --cherry-pick
847                         --graph
848                         --stat --numstat --shortstat
849                         --decorate --diff-filter=
850                         --color-words --walk-reflogs
851                         "
852                 return
853                 ;;
854         esac
855         __git_complete_revlist
858 _git_merge ()
860         local cur="${COMP_WORDS[COMP_CWORD]}"
861         case "${COMP_WORDS[COMP_CWORD-1]}" in
862         -s|--strategy)
863                 __gitcomp "$(__git_merge_strategies)"
864                 return
865         esac
866         case "$cur" in
867         --strategy=*)
868                 __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
869                 return
870                 ;;
871         --*)
872                 __gitcomp "
873                         --no-commit --no-stat --log --no-log --squash --strategy
874                         "
875                 return
876         esac
877         __gitcomp "$(__git_refs)"
880 _git_merge_base ()
882         __gitcomp "$(__git_refs)"
885 _git_name_rev ()
887         __gitcomp "--tags --all --stdin"
890 _git_pull ()
892         local cur="${COMP_WORDS[COMP_CWORD]}"
894         case "${COMP_WORDS[0]},$COMP_CWORD" in
895         git-pull*,1)
896                 __gitcomp "$(__git_remotes)"
897                 ;;
898         git,2)
899                 __gitcomp "$(__git_remotes)"
900                 ;;
901         *)
902                 local remote
903                 case "${COMP_WORDS[0]}" in
904                 git-pull)  remote="${COMP_WORDS[1]}" ;;
905                 git)       remote="${COMP_WORDS[2]}" ;;
906                 esac
907                 __gitcomp "$(__git_refs "$remote")"
908                 ;;
909         esac
912 _git_push ()
914         local cur="${COMP_WORDS[COMP_CWORD]}"
916         case "${COMP_WORDS[0]},$COMP_CWORD" in
917         git-push*,1)
918                 __gitcomp "$(__git_remotes)"
919                 ;;
920         git,2)
921                 __gitcomp "$(__git_remotes)"
922                 ;;
923         *)
924                 case "$cur" in
925                 *:*)
926                         local remote
927                         case "${COMP_WORDS[0]}" in
928                         git-push)  remote="${COMP_WORDS[1]}" ;;
929                         git)       remote="${COMP_WORDS[2]}" ;;
930                         esac
932                         local pfx=""
933                         case "$COMP_WORDBREAKS" in
934                         *:*) : great ;;
935                         *)   pfx="${cur%%:*}:" ;;
936                         esac
938                         __gitcomp "$(__git_refs "$remote")" "$pfx" "${cur#*:}"
939                         ;;
940                 +*)
941                         __gitcomp "$(__git_refs)" + "${cur#+}"
942                         ;;
943                 *)
944                         __gitcomp "$(__git_refs)"
945                         ;;
946                 esac
947                 ;;
948         esac
951 _git_rebase ()
953         local cur="${COMP_WORDS[COMP_CWORD]}" dir="$(__gitdir)"
954         if [ -d "$dir"/rebase-apply ] || [ -d "$dir"/rebase-merge ]; then
955                 __gitcomp "--continue --skip --abort"
956                 return
957         fi
958         case "${COMP_WORDS[COMP_CWORD-1]}" in
959         -s|--strategy)
960                 __gitcomp "$(__git_merge_strategies)"
961                 return
962         esac
963         case "$cur" in
964         --strategy=*)
965                 __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
966                 return
967                 ;;
968         --*)
969                 __gitcomp "--onto --merge --strategy --interactive"
970                 return
971         esac
972         __gitcomp "$(__git_refs)"
975 _git_send_email ()
977         local cur="${COMP_WORDS[COMP_CWORD]}"
978         case "$cur" in
979         --*)
980                 __gitcomp "--bcc --cc --cc-cmd --chain-reply-to --compose
981                         --dry-run --envelope-sender --from --identity
982                         --in-reply-to --no-chain-reply-to --no-signed-off-by-cc
983                         --no-suppress-from --no-thread --quiet
984                         --signed-off-by-cc --smtp-pass --smtp-server
985                         --smtp-server-port --smtp-ssl --smtp-user --subject
986                         --suppress-cc --suppress-from --thread --to"
987                 return
988                 ;;
989         esac
990         COMPREPLY=()
993 _git_config ()
995         local cur="${COMP_WORDS[COMP_CWORD]}"
996         local prv="${COMP_WORDS[COMP_CWORD-1]}"
997         case "$prv" in
998         branch.*.remote)
999                 __gitcomp "$(__git_remotes)"
1000                 return
1001                 ;;
1002         branch.*.merge)
1003                 __gitcomp "$(__git_refs)"
1004                 return
1005                 ;;
1006         remote.*.fetch)
1007                 local remote="${prv#remote.}"
1008                 remote="${remote%.fetch}"
1009                 __gitcomp "$(__git_refs_remotes "$remote")"
1010                 return
1011                 ;;
1012         remote.*.push)
1013                 local remote="${prv#remote.}"
1014                 remote="${remote%.push}"
1015                 __gitcomp "$(git --git-dir="$(__gitdir)" \
1016                         for-each-ref --format='%(refname):%(refname)' \
1017                         refs/heads)"
1018                 return
1019                 ;;
1020         pull.twohead|pull.octopus)
1021                 __gitcomp "$(__git_merge_strategies)"
1022                 return
1023                 ;;
1024         color.branch|color.diff|color.status)
1025                 __gitcomp "always never auto"
1026                 return
1027                 ;;
1028         color.*.*)
1029                 __gitcomp "
1030                         black red green yellow blue magenta cyan white
1031                         bold dim ul blink reverse
1032                         "
1033                 return
1034                 ;;
1035         *.*)
1036                 COMPREPLY=()
1037                 return
1038                 ;;
1039         esac
1040         case "$cur" in
1041         --*)
1042                 __gitcomp "
1043                         --global --system --file=
1044                         --list --replace-all
1045                         --get --get-all --get-regexp
1046                         --add --unset --unset-all
1047                         --remove-section --rename-section
1048                         "
1049                 return
1050                 ;;
1051         branch.*.*)
1052                 local pfx="${cur%.*}."
1053                 cur="${cur##*.}"
1054                 __gitcomp "remote merge" "$pfx" "$cur"
1055                 return
1056                 ;;
1057         branch.*)
1058                 local pfx="${cur%.*}."
1059                 cur="${cur#*.}"
1060                 __gitcomp "$(__git_heads)" "$pfx" "$cur" "."
1061                 return
1062                 ;;
1063         remote.*.*)
1064                 local pfx="${cur%.*}."
1065                 cur="${cur##*.}"
1066                 __gitcomp "
1067                         url fetch push skipDefaultUpdate
1068                         receivepack uploadpack tagopt
1069                         " "$pfx" "$cur"
1070                 return
1071                 ;;
1072         remote.*)
1073                 local pfx="${cur%.*}."
1074                 cur="${cur#*.}"
1075                 __gitcomp "$(__git_remotes)" "$pfx" "$cur" "."
1076                 return
1077                 ;;
1078         esac
1079         __gitcomp "
1080                 apply.whitespace
1081                 core.fileMode
1082                 core.gitProxy
1083                 core.ignoreStat
1084                 core.preferSymlinkRefs
1085                 core.logAllRefUpdates
1086                 core.loosecompression
1087                 core.repositoryFormatVersion
1088                 core.sharedRepository
1089                 core.warnAmbiguousRefs
1090                 core.compression
1091                 core.packedGitWindowSize
1092                 core.packedGitLimit
1093                 clean.requireForce
1094                 color.branch
1095                 color.branch.current
1096                 color.branch.local
1097                 color.branch.remote
1098                 color.branch.plain
1099                 color.diff
1100                 color.diff.plain
1101                 color.diff.meta
1102                 color.diff.frag
1103                 color.diff.old
1104                 color.diff.new
1105                 color.diff.commit
1106                 color.diff.whitespace
1107                 color.pager
1108                 color.status
1109                 color.status.header
1110                 color.status.added
1111                 color.status.changed
1112                 color.status.untracked
1113                 diff.renameLimit
1114                 diff.renames
1115                 fetch.unpackLimit
1116                 format.headers
1117                 format.subjectprefix
1118                 gitcvs.enabled
1119                 gitcvs.logfile
1120                 gitcvs.allbinary
1121                 gitcvs.dbname gitcvs.dbdriver gitcvs.dbuser gitcvs.dbpass
1122                 gitcvs.dbtablenameprefix
1123                 gc.packrefs
1124                 gc.reflogexpire
1125                 gc.reflogexpireunreachable
1126                 gc.rerereresolved
1127                 gc.rerereunresolved
1128                 http.sslVerify
1129                 http.sslCert
1130                 http.sslKey
1131                 http.sslCAInfo
1132                 http.sslCAPath
1133                 http.maxRequests
1134                 http.lowSpeedLimit
1135                 http.lowSpeedTime
1136                 http.noEPSV
1137                 i18n.commitEncoding
1138                 i18n.logOutputEncoding
1139                 log.showroot
1140                 merge.tool
1141                 merge.summary
1142                 merge.verbosity
1143                 pack.window
1144                 pack.depth
1145                 pack.windowMemory
1146                 pack.compression
1147                 pack.deltaCacheSize
1148                 pack.deltaCacheLimit
1149                 pull.octopus
1150                 pull.twohead
1151                 repack.useDeltaBaseOffset
1152                 showbranch.default
1153                 tar.umask
1154                 transfer.unpackLimit
1155                 receive.unpackLimit
1156                 receive.denyNonFastForwards
1157                 user.name
1158                 user.email
1159                 user.signingkey
1160                 branch. remote.
1161         "
1164 _git_remote ()
1166         local subcommands="add rm show prune update"
1167         local subcommand="$(__git_find_subcommand "$subcommands")"
1168         if [ -z "$subcommand" ]; then
1169                 __gitcomp "$subcommands"
1170                 return
1171         fi
1173         case "$subcommand" in
1174         rm|show|prune)
1175                 __gitcomp "$(__git_remotes)"
1176                 ;;
1177         update)
1178                 local i c='' IFS=$'\n'
1179                 for i in $(git --git-dir="$(__gitdir)" config --list); do
1180                         case "$i" in
1181                         remotes.*)
1182                                 i="${i#remotes.}"
1183                                 c="$c ${i/=*/}"
1184                                 ;;
1185                         esac
1186                 done
1187                 __gitcomp "$c"
1188                 ;;
1189         *)
1190                 COMPREPLY=()
1191                 ;;
1192         esac
1195 _git_reset ()
1197         __git_has_doubledash && return
1199         local cur="${COMP_WORDS[COMP_CWORD]}"
1200         case "$cur" in
1201         --*)
1202                 __gitcomp "--mixed --hard --soft"
1203                 return
1204                 ;;
1205         esac
1206         __gitcomp "$(__git_refs)"
1209 _git_rm ()
1211         __git_has_doubledash && return
1213         local cur="${COMP_WORDS[COMP_CWORD]}"
1214         case "$cur" in
1215         --*)
1216                 __gitcomp "--cached --dry-run --ignore-unmatch --quiet"
1217                 return
1218                 ;;
1219         esac
1220         COMPREPLY=()
1223 _git_shortlog ()
1225         __git_has_doubledash && return
1227         local cur="${COMP_WORDS[COMP_CWORD]}"
1228         case "$cur" in
1229         --*)
1230                 __gitcomp "
1231                         --max-count= --max-age= --since= --after=
1232                         --min-age= --before= --until=
1233                         --no-merges
1234                         --author= --committer= --grep=
1235                         --all-match
1236                         --not --all
1237                         --numbered --summary
1238                         "
1239                 return
1240                 ;;
1241         esac
1242         __git_complete_revlist
1245 _git_show ()
1247         local cur="${COMP_WORDS[COMP_CWORD]}"
1248         case "$cur" in
1249         --pretty=*)
1250                 __gitcomp "
1251                         oneline short medium full fuller email raw
1252                         " "" "${cur##--pretty=}"
1253                 return
1254                 ;;
1255         --*)
1256                 __gitcomp "--pretty="
1257                 return
1258                 ;;
1259         esac
1260         __git_complete_file
1263 _git_show_branch ()
1265         local cur="${COMP_WORDS[COMP_CWORD]}"
1266         case "$cur" in
1267         --*)
1268                 __gitcomp "
1269                         --all --remotes --topo-order --current --more=
1270                         --list --independent --merge-base --no-name
1271                         --sha1-name --topics --reflog
1272                         "
1273                 return
1274                 ;;
1275         esac
1276         __git_complete_revlist
1279 _git_stash ()
1281         local subcommands='save list show apply clear drop pop create'
1282         local subcommand="$(__git_find_subcommand "$subcommands")"
1283         if [ -z "$subcommand" ]; then
1284                 __gitcomp "$subcommands"
1285         else
1286                 local cur="${COMP_WORDS[COMP_CWORD]}"
1287                 case "$subcommand,$cur" in
1288                 save,--*)
1289                         __gitcomp "--keep-index"
1290                         ;;
1291                 *)
1292                         COMPREPLY=()
1293                         ;;
1294                 esac
1295         fi
1298 _git_submodule ()
1300         __git_has_doubledash && return
1302         local subcommands="add status init update"
1303         if [ -z "$(__git_find_subcommand "$subcommands")" ]; then
1304                 local cur="${COMP_WORDS[COMP_CWORD]}"
1305                 case "$cur" in
1306                 --*)
1307                         __gitcomp "--quiet --cached"
1308                         ;;
1309                 *)
1310                         __gitcomp "$subcommands"
1311                         ;;
1312                 esac
1313                 return
1314         fi
1317 _git_svn ()
1319         local subcommands="
1320                 init fetch clone rebase dcommit log find-rev
1321                 set-tree commit-diff info create-ignore propget
1322                 proplist show-ignore show-externals
1323                 "
1324         local subcommand="$(__git_find_subcommand "$subcommands")"
1325         if [ -z "$subcommand" ]; then
1326                 __gitcomp "$subcommands"
1327         else
1328                 local remote_opts="--username= --config-dir= --no-auth-cache"
1329                 local fc_opts="
1330                         --follow-parent --authors-file= --repack=
1331                         --no-metadata --use-svm-props --use-svnsync-props
1332                         --log-window-size= --no-checkout --quiet
1333                         --repack-flags --user-log-author $remote_opts
1334                         "
1335                 local init_opts="
1336                         --template= --shared= --trunk= --tags=
1337                         --branches= --stdlayout --minimize-url
1338                         --no-metadata --use-svm-props --use-svnsync-props
1339                         --rewrite-root= $remote_opts
1340                         "
1341                 local cmt_opts="
1342                         --edit --rmdir --find-copies-harder --copy-similarity=
1343                         "
1345                 local cur="${COMP_WORDS[COMP_CWORD]}"
1346                 case "$subcommand,$cur" in
1347                 fetch,--*)
1348                         __gitcomp "--revision= --fetch-all $fc_opts"
1349                         ;;
1350                 clone,--*)
1351                         __gitcomp "--revision= $fc_opts $init_opts"
1352                         ;;
1353                 init,--*)
1354                         __gitcomp "$init_opts"
1355                         ;;
1356                 dcommit,--*)
1357                         __gitcomp "
1358                                 --merge --strategy= --verbose --dry-run
1359                                 --fetch-all --no-rebase $cmt_opts $fc_opts
1360                                 "
1361                         ;;
1362                 set-tree,--*)
1363                         __gitcomp "--stdin $cmt_opts $fc_opts"
1364                         ;;
1365                 create-ignore,--*|propget,--*|proplist,--*|show-ignore,--*|\
1366                 show-externals,--*)
1367                         __gitcomp "--revision="
1368                         ;;
1369                 log,--*)
1370                         __gitcomp "
1371                                 --limit= --revision= --verbose --incremental
1372                                 --oneline --show-commit --non-recursive
1373                                 --authors-file=
1374                                 "
1375                         ;;
1376                 rebase,--*)
1377                         __gitcomp "
1378                                 --merge --verbose --strategy= --local
1379                                 --fetch-all $fc_opts
1380                                 "
1381                         ;;
1382                 commit-diff,--*)
1383                         __gitcomp "--message= --file= --revision= $cmt_opts"
1384                         ;;
1385                 info,--*)
1386                         __gitcomp "--url"
1387                         ;;
1388                 *)
1389                         COMPREPLY=()
1390                         ;;
1391                 esac
1392         fi
1395 _git_tag ()
1397         local i c=1 f=0
1398         while [ $c -lt $COMP_CWORD ]; do
1399                 i="${COMP_WORDS[c]}"
1400                 case "$i" in
1401                 -d|-v)
1402                         __gitcomp "$(__git_tags)"
1403                         return
1404                         ;;
1405                 -f)
1406                         f=1
1407                         ;;
1408                 esac
1409                 c=$((++c))
1410         done
1412         case "${COMP_WORDS[COMP_CWORD-1]}" in
1413         -m|-F)
1414                 COMPREPLY=()
1415                 ;;
1416         -*|tag|git-tag)
1417                 if [ $f = 1 ]; then
1418                         __gitcomp "$(__git_tags)"
1419                 else
1420                         COMPREPLY=()
1421                 fi
1422                 ;;
1423         *)
1424                 __gitcomp "$(__git_refs)"
1425                 ;;
1426         esac
1429 _git ()
1431         local i c=1 command __git_dir
1433         while [ $c -lt $COMP_CWORD ]; do
1434                 i="${COMP_WORDS[c]}"
1435                 case "$i" in
1436                 --git-dir=*) __git_dir="${i#--git-dir=}" ;;
1437                 --bare)      __git_dir="." ;;
1438                 --version|-p|--paginate) ;;
1439                 --help) command="help"; break ;;
1440                 *) command="$i"; break ;;
1441                 esac
1442                 c=$((++c))
1443         done
1445         if [ -z "$command" ]; then
1446                 case "${COMP_WORDS[COMP_CWORD]}" in
1447                 --*=*) COMPREPLY=() ;;
1448                 --*)   __gitcomp "
1449                         --paginate
1450                         --no-pager
1451                         --git-dir=
1452                         --bare
1453                         --version
1454                         --exec-path
1455                         --work-tree=
1456                         --help
1457                         "
1458                         ;;
1459                 *)     __gitcomp "$(__git_porcelain_commands) $(__git_aliases)" ;;
1460                 esac
1461                 return
1462         fi
1464         local expansion=$(__git_aliased_command "$command")
1465         [ "$expansion" ] && command="$expansion"
1467         case "$command" in
1468         am)          _git_am ;;
1469         add)         _git_add ;;
1470         apply)       _git_apply ;;
1471         bisect)      _git_bisect ;;
1472         bundle)      _git_bundle ;;
1473         branch)      _git_branch ;;
1474         checkout)    _git_checkout ;;
1475         cherry)      _git_cherry ;;
1476         cherry-pick) _git_cherry_pick ;;
1477         commit)      _git_commit ;;
1478         config)      _git_config ;;
1479         describe)    _git_describe ;;
1480         diff)        _git_diff ;;
1481         fetch)       _git_fetch ;;
1482         format-patch) _git_format_patch ;;
1483         gc)          _git_gc ;;
1484         help)        _git_help ;;
1485         log)         _git_log ;;
1486         ls-remote)   _git_ls_remote ;;
1487         ls-tree)     _git_ls_tree ;;
1488         merge)       _git_merge;;
1489         merge-base)  _git_merge_base ;;
1490         name-rev)    _git_name_rev ;;
1491         pull)        _git_pull ;;
1492         push)        _git_push ;;
1493         rebase)      _git_rebase ;;
1494         remote)      _git_remote ;;
1495         reset)       _git_reset ;;
1496         rm)          _git_rm ;;
1497         send-email)  _git_send_email ;;
1498         shortlog)    _git_shortlog ;;
1499         show)        _git_show ;;
1500         show-branch) _git_show_branch ;;
1501         stash)       _git_stash ;;
1502         submodule)   _git_submodule ;;
1503         svn)         _git_svn ;;
1504         tag)         _git_tag ;;
1505         whatchanged) _git_log ;;
1506         *)           COMPREPLY=() ;;
1507         esac
1510 _gitk ()
1512         __git_has_doubledash && return
1514         local cur="${COMP_WORDS[COMP_CWORD]}"
1515         local g="$(git rev-parse --git-dir 2>/dev/null)"
1516         local merge=""
1517         if [ -f $g/MERGE_HEAD ]; then
1518                 merge="--merge"
1519         fi
1520         case "$cur" in
1521         --*)
1522                 __gitcomp "--not --all $merge"
1523                 return
1524                 ;;
1525         esac
1526         __git_complete_revlist
1529 complete -o default -o nospace -F _git git
1530 complete -o default -o nospace -F _gitk gitk
1532 # The following are necessary only for Cygwin, and only are needed
1533 # when the user has tab-completed the executable name and consequently
1534 # included the '.exe' suffix.
1536 if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
1537 complete -o default -o nospace -F _git git.exe
1538 fi