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