contrib / completion / git-completion.bashon commit bash: Hide diff-stages from completion. (983591c)
   1#
   2# bash completion support for core Git.
   3#
   4# Copyright (C) 2006,2007 Shawn Pearce
   5# Conceptually based on gitcompletion (http://gitweb.hawaga.org.uk/).
   6#
   7# The contained completion routines provide support for completing:
   8#
   9#    *) local and remote branch names
  10#    *) local and remote tag names
  11#    *) .git/remotes file names
  12#    *) git 'subcommands'
  13#    *) tree paths within 'ref:path/to/file' expressions
  14#
  15# To use these routines:
  16#
  17#    1) Copy this file to somewhere (e.g. ~/.git-completion.sh).
  18#    2) Added the following line to your .bashrc:
  19#        source ~/.git-completion.sh
  20#
  21#    3) You may want to make sure the git executable is available
  22#       in your PATH before this script is sourced, as some caching
  23#       is performed while the script loads.  If git isn't found
  24#       at source time then all lookups will be done on demand,
  25#       which may be slightly slower.
  26#
  27#    4) Consider changing your PS1 to also show the current branch:
  28#        PS1='[\u@\h \W$(__git_ps1 " (%s)")]\$ '
  29#
  30#       The argument to __git_ps1 will be displayed only if you
  31#       are currently in a git repository.  The %s token will be
  32#       the name of the current branch.
  33#
  34
  35__gitdir ()
  36{
  37        if [ -z "$1" ]; then
  38                if [ -n "$__git_dir" ]; then
  39                        echo "$__git_dir"
  40                elif [ -d .git ]; then
  41                        echo .git
  42                else
  43                        git rev-parse --git-dir 2>/dev/null
  44                fi
  45        elif [ -d "$1/.git" ]; then
  46                echo "$1/.git"
  47        else
  48                echo "$1"
  49        fi
  50}
  51
  52__git_ps1 ()
  53{
  54        local b="$(git symbolic-ref HEAD 2>/dev/null)"
  55        if [ -n "$b" ]; then
  56                if [ -n "$1" ]; then
  57                        printf "$1" "${b##refs/heads/}"
  58                else
  59                        printf " (%s)" "${b##refs/heads/}"
  60                fi
  61        fi
  62}
  63
  64__gitcomp ()
  65{
  66        local all c s=$'\n' IFS=' '$'\t'$'\n'
  67        local cur="${COMP_WORDS[COMP_CWORD]}"
  68        if [ $# -gt 2 ]; then
  69                cur="$3"
  70        fi
  71        for c in $1; do
  72                case "$c$4" in
  73                --*=*) all="$all$c$4$s" ;;
  74                *.)    all="$all$c$4$s" ;;
  75                *)     all="$all$c$4 $s" ;;
  76                esac
  77        done
  78        IFS=$s
  79        COMPREPLY=($(compgen -P "$2" -W "$all" -- "$cur"))
  80        return
  81}
  82
  83__git_heads ()
  84{
  85        local cmd i is_hash=y dir="$(__gitdir "$1")"
  86        if [ -d "$dir" ]; then
  87                for i in $(git --git-dir="$dir" \
  88                        for-each-ref --format='%(refname)' \
  89                        refs/heads ); do
  90                        echo "${i#refs/heads/}"
  91                done
  92                return
  93        fi
  94        for i in $(git-ls-remote "$1" 2>/dev/null); do
  95                case "$is_hash,$i" in
  96                y,*) is_hash=n ;;
  97                n,*^{}) is_hash=y ;;
  98                n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;
  99                n,*) is_hash=y; echo "$i" ;;
 100                esac
 101        done
 102}
 103
 104__git_refs ()
 105{
 106        local cmd i is_hash=y dir="$(__gitdir "$1")"
 107        if [ -d "$dir" ]; then
 108                if [ -e "$dir/HEAD" ]; then echo HEAD; fi
 109                for i in $(git --git-dir="$dir" \
 110                        for-each-ref --format='%(refname)' \
 111                        refs/tags refs/heads refs/remotes); do
 112                        case "$i" in
 113                                refs/tags/*)    echo "${i#refs/tags/}" ;;
 114                                refs/heads/*)   echo "${i#refs/heads/}" ;;
 115                                refs/remotes/*) echo "${i#refs/remotes/}" ;;
 116                                *)              echo "$i" ;;
 117                        esac
 118                done
 119                return
 120        fi
 121        for i in $(git-ls-remote "$dir" 2>/dev/null); do
 122                case "$is_hash,$i" in
 123                y,*) is_hash=n ;;
 124                n,*^{}) is_hash=y ;;
 125                n,refs/tags/*) is_hash=y; echo "${i#refs/tags/}" ;;
 126                n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;
 127                n,refs/remotes/*) is_hash=y; echo "${i#refs/remotes/}" ;;
 128                n,*) is_hash=y; echo "$i" ;;
 129                esac
 130        done
 131}
 132
 133__git_refs2 ()
 134{
 135        local i
 136        for i in $(__git_refs "$1"); do
 137                echo "$i:$i"
 138        done
 139}
 140
 141__git_refs_remotes ()
 142{
 143        local cmd i is_hash=y
 144        for i in $(git-ls-remote "$1" 2>/dev/null); do
 145                case "$is_hash,$i" in
 146                n,refs/heads/*)
 147                        is_hash=y
 148                        echo "$i:refs/remotes/$1/${i#refs/heads/}"
 149                        ;;
 150                y,*) is_hash=n ;;
 151                n,*^{}) is_hash=y ;;
 152                n,refs/tags/*) is_hash=y;;
 153                n,*) is_hash=y; ;;
 154                esac
 155        done
 156}
 157
 158__git_remotes ()
 159{
 160        local i ngoff IFS=$'\n' d="$(__gitdir)"
 161        shopt -q nullglob || ngoff=1
 162        shopt -s nullglob
 163        for i in "$d/remotes"/*; do
 164                echo ${i#$d/remotes/}
 165        done
 166        [ "$ngoff" ] && shopt -u nullglob
 167        for i in $(git --git-dir="$d" config --list); do
 168                case "$i" in
 169                remote.*.url=*)
 170                        i="${i#remote.}"
 171                        echo "${i/.url=*/}"
 172                        ;;
 173                esac
 174        done
 175}
 176
 177__git_merge_strategies ()
 178{
 179        if [ -n "$__git_merge_strategylist" ]; then
 180                echo "$__git_merge_strategylist"
 181                return
 182        fi
 183        sed -n "/^all_strategies='/{
 184                s/^all_strategies='//
 185                s/'//
 186                p
 187                q
 188                }" "$(git --exec-path)/git-merge"
 189}
 190__git_merge_strategylist=
 191__git_merge_strategylist="$(__git_merge_strategies 2>/dev/null)"
 192
 193__git_complete_file ()
 194{
 195        local pfx ls ref cur="${COMP_WORDS[COMP_CWORD]}"
 196        case "$cur" in
 197        ?*:*)
 198                ref="${cur%%:*}"
 199                cur="${cur#*:}"
 200                case "$cur" in
 201                ?*/*)
 202                        pfx="${cur%/*}"
 203                        cur="${cur##*/}"
 204                        ls="$ref:$pfx"
 205                        pfx="$pfx/"
 206                        ;;
 207                *)
 208                        ls="$ref"
 209                        ;;
 210            esac
 211                COMPREPLY=($(compgen -P "$pfx" \
 212                        -W "$(git --git-dir="$(__gitdir)" ls-tree "$ls" \
 213                                | sed '/^100... blob /s,^.*     ,,
 214                                       /^040000 tree /{
 215                                           s,^.*        ,,
 216                                           s,$,/,
 217                                       }
 218                                       s/^.*    //')" \
 219                        -- "$cur"))
 220                ;;
 221        *)
 222                __gitcomp "$(__git_refs)"
 223                ;;
 224        esac
 225}
 226
 227__git_complete_revlist ()
 228{
 229        local pfx cur="${COMP_WORDS[COMP_CWORD]}"
 230        case "$cur" in
 231        *...*)
 232                pfx="${cur%...*}..."
 233                cur="${cur#*...}"
 234                __gitcomp "$(__git_refs)" "$pfx" "$cur"
 235                ;;
 236        *..*)
 237                pfx="${cur%..*}.."
 238                cur="${cur#*..}"
 239                __gitcomp "$(__git_refs)" "$pfx" "$cur"
 240                ;;
 241        *.)
 242                __gitcomp "$cur."
 243                ;;
 244        *)
 245                __gitcomp "$(__git_refs)"
 246                ;;
 247        esac
 248}
 249
 250__git_commands ()
 251{
 252        if [ -n "$__git_commandlist" ]; then
 253                echo "$__git_commandlist"
 254                return
 255        fi
 256        local i IFS=" "$'\n'
 257        for i in $(git help -a|egrep '^ ')
 258        do
 259                case $i in
 260                add--interactive) : plumbing;;
 261                applymbox)        : ask gittus;;
 262                applypatch)       : ask gittus;;
 263                archimport)       : import;;
 264                cat-file)         : plumbing;;
 265                check-ref-format) : plumbing;;
 266                commit-tree)      : plumbing;;
 267                convert-objects)  : plumbing;;
 268                cvsexportcommit)  : export;;
 269                cvsimport)        : import;;
 270                cvsserver)        : daemon;;
 271                daemon)           : daemon;;
 272                diff-stages)      : nobody uses it;;
 273                fsck-objects)     : plumbing;;
 274                fetch-pack)       : plumbing;;
 275                fmt-merge-msg)    : plumbing;;
 276                hash-object)      : plumbing;;
 277                http-*)           : transport;;
 278                index-pack)       : plumbing;;
 279                init-db)          : deprecated;;
 280                local-fetch)      : plumbing;;
 281                mailinfo)         : plumbing;;
 282                mailsplit)        : plumbing;;
 283                merge-*)          : plumbing;;
 284                mktree)           : plumbing;;
 285                mktag)            : plumbing;;
 286                pack-objects)     : plumbing;;
 287                pack-redundant)   : plumbing;;
 288                pack-refs)        : plumbing;;
 289                parse-remote)     : plumbing;;
 290                patch-id)         : plumbing;;
 291                peek-remote)      : plumbing;;
 292                prune)            : plumbing;;
 293                prune-packed)     : plumbing;;
 294                quiltimport)      : import;;
 295                read-tree)        : plumbing;;
 296                receive-pack)     : plumbing;;
 297                reflog)           : plumbing;;
 298                repo-config)      : plumbing;;
 299                rerere)           : plumbing;;
 300                rev-list)         : plumbing;;
 301                rev-parse)        : plumbing;;
 302                runstatus)        : plumbing;;
 303                sh-setup)         : internal;;
 304                shell)            : daemon;;
 305                send-pack)        : plumbing;;
 306                show-index)       : plumbing;;
 307                ssh-*)            : transport;;
 308                stripspace)       : plumbing;;
 309                svn)              : import export;;
 310                svnimport)        : import;;
 311                symbolic-ref)     : plumbing;;
 312                tar-tree)         : deprecated;;
 313                unpack-file)      : plumbing;;
 314                unpack-objects)   : plumbing;;
 315                update-index)     : plumbing;;
 316                update-ref)       : plumbing;;
 317                update-server-info) : daemon;;
 318                upload-archive)   : plumbing;;
 319                upload-pack)      : plumbing;;
 320                write-tree)       : plumbing;;
 321                verify-tag)       : plumbing;;
 322                *) echo $i;;
 323                esac
 324        done
 325}
 326__git_commandlist=
 327__git_commandlist="$(__git_commands 2>/dev/null)"
 328
 329__git_aliases ()
 330{
 331        local i IFS=$'\n'
 332        for i in $(git --git-dir="$(__gitdir)" config --list); do
 333                case "$i" in
 334                alias.*)
 335                        i="${i#alias.}"
 336                        echo "${i/=*/}"
 337                        ;;
 338                esac
 339        done
 340}
 341
 342__git_aliased_command ()
 343{
 344        local word cmdline=$(git --git-dir="$(__gitdir)" \
 345                config --get "alias.$1")
 346        for word in $cmdline; do
 347                if [ "${word##-*}" ]; then
 348                        echo $word
 349                        return
 350                fi
 351        done
 352}
 353
 354__git_whitespacelist="nowarn warn error error-all strip"
 355
 356_git_am ()
 357{
 358        local cur="${COMP_WORDS[COMP_CWORD]}"
 359        if [ -d .dotest ]; then
 360                __gitcomp "--skip --resolved"
 361                return
 362        fi
 363        case "$cur" in
 364        --whitespace=*)
 365                __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
 366                return
 367                ;;
 368        --*)
 369                __gitcomp "
 370                        --signoff --utf8 --binary --3way --interactive
 371                        --whitespace=
 372                        "
 373                return
 374        esac
 375        COMPREPLY=()
 376}
 377
 378_git_apply ()
 379{
 380        local cur="${COMP_WORDS[COMP_CWORD]}"
 381        case "$cur" in
 382        --whitespace=*)
 383                __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
 384                return
 385                ;;
 386        --*)
 387                __gitcomp "
 388                        --stat --numstat --summary --check --index
 389                        --cached --index-info --reverse --reject --unidiff-zero
 390                        --apply --no-add --exclude=
 391                        --whitespace= --inaccurate-eof --verbose
 392                        "
 393                return
 394        esac
 395        COMPREPLY=()
 396}
 397
 398_git_add ()
 399{
 400        local cur="${COMP_WORDS[COMP_CWORD]}"
 401        case "$cur" in
 402        --*)
 403                __gitcomp "--interactive"
 404                return
 405        esac
 406        COMPREPLY=()
 407}
 408
 409_git_branch ()
 410{
 411        __gitcomp "$(__git_refs)"
 412}
 413
 414_git_checkout ()
 415{
 416        __gitcomp "$(__git_refs)"
 417}
 418
 419_git_cherry ()
 420{
 421        __gitcomp "$(__git_refs)"
 422}
 423
 424_git_cherry_pick ()
 425{
 426        local cur="${COMP_WORDS[COMP_CWORD]}"
 427        case "$cur" in
 428        --*)
 429                __gitcomp "--edit --no-commit"
 430                ;;
 431        *)
 432                __gitcomp "$(__git_refs)"
 433                ;;
 434        esac
 435}
 436
 437_git_commit ()
 438{
 439        local cur="${COMP_WORDS[COMP_CWORD]}"
 440        case "$cur" in
 441        --*)
 442                __gitcomp "
 443                        --all --author= --signoff --verify --no-verify
 444                        --edit --amend --include --only
 445                        "
 446                return
 447        esac
 448        COMPREPLY=()
 449}
 450
 451_git_diff ()
 452{
 453        __git_complete_file
 454}
 455
 456_git_diff_tree ()
 457{
 458        __gitcomp "$(__git_refs)"
 459}
 460
 461_git_fetch ()
 462{
 463        local cur="${COMP_WORDS[COMP_CWORD]}"
 464
 465        case "${COMP_WORDS[0]},$COMP_CWORD" in
 466        git-fetch*,1)
 467                __gitcomp "$(__git_remotes)"
 468                ;;
 469        git,2)
 470                __gitcomp "$(__git_remotes)"
 471                ;;
 472        *)
 473                case "$cur" in
 474                *:*)
 475                        __gitcomp "$(__git_refs)" "" "${cur#*:}"
 476                        ;;
 477                *)
 478                        local remote
 479                        case "${COMP_WORDS[0]}" in
 480                        git-fetch) remote="${COMP_WORDS[1]}" ;;
 481                        git)       remote="${COMP_WORDS[2]}" ;;
 482                        esac
 483                        __gitcomp "$(__git_refs2 "$remote")"
 484                        ;;
 485                esac
 486                ;;
 487        esac
 488}
 489
 490_git_format_patch ()
 491{
 492        local cur="${COMP_WORDS[COMP_CWORD]}"
 493        case "$cur" in
 494        --*)
 495                __gitcomp "
 496                        --stdout --attach --thread
 497                        --output-directory
 498                        --numbered --start-number
 499                        --keep-subject
 500                        --signoff
 501                        --in-reply-to=
 502                        --full-index --binary
 503                        --not --all
 504                        "
 505                return
 506                ;;
 507        esac
 508        __git_complete_revlist
 509}
 510
 511_git_ls_remote ()
 512{
 513        __gitcomp "$(__git_remotes)"
 514}
 515
 516_git_ls_tree ()
 517{
 518        __git_complete_file
 519}
 520
 521_git_log ()
 522{
 523        local cur="${COMP_WORDS[COMP_CWORD]}"
 524        case "$cur" in
 525        --pretty=*)
 526                __gitcomp "
 527                        oneline short medium full fuller email raw
 528                        " "" "${cur##--pretty=}"
 529                return
 530                ;;
 531        --*)
 532                __gitcomp "
 533                        --max-count= --max-age= --since= --after=
 534                        --min-age= --before= --until=
 535                        --root --not --topo-order --date-order
 536                        --no-merges
 537                        --abbrev-commit --abbrev=
 538                        --relative-date
 539                        --author= --committer= --grep=
 540                        --all-match
 541                        --pretty= --name-status --name-only
 542                        --not --all
 543                        "
 544                return
 545                ;;
 546        esac
 547        __git_complete_revlist
 548}
 549
 550_git_merge ()
 551{
 552        local cur="${COMP_WORDS[COMP_CWORD]}"
 553        case "${COMP_WORDS[COMP_CWORD-1]}" in
 554        -s|--strategy)
 555                __gitcomp "$(__git_merge_strategies)"
 556                return
 557        esac
 558        case "$cur" in
 559        --strategy=*)
 560                __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
 561                return
 562                ;;
 563        --*)
 564                __gitcomp "
 565                        --no-commit --no-summary --squash --strategy
 566                        "
 567                return
 568        esac
 569        __gitcomp "$(__git_refs)"
 570}
 571
 572_git_merge_base ()
 573{
 574        __gitcomp "$(__git_refs)"
 575}
 576
 577_git_name_rev ()
 578{
 579        __gitcomp "--tags --all --stdin"
 580}
 581
 582_git_pull ()
 583{
 584        local cur="${COMP_WORDS[COMP_CWORD]}"
 585
 586        case "${COMP_WORDS[0]},$COMP_CWORD" in
 587        git-pull*,1)
 588                __gitcomp "$(__git_remotes)"
 589                ;;
 590        git,2)
 591                __gitcomp "$(__git_remotes)"
 592                ;;
 593        *)
 594                local remote
 595                case "${COMP_WORDS[0]}" in
 596                git-pull)  remote="${COMP_WORDS[1]}" ;;
 597                git)       remote="${COMP_WORDS[2]}" ;;
 598                esac
 599                __gitcomp "$(__git_refs "$remote")"
 600                ;;
 601        esac
 602}
 603
 604_git_push ()
 605{
 606        local cur="${COMP_WORDS[COMP_CWORD]}"
 607
 608        case "${COMP_WORDS[0]},$COMP_CWORD" in
 609        git-push*,1)
 610                __gitcomp "$(__git_remotes)"
 611                ;;
 612        git,2)
 613                __gitcomp "$(__git_remotes)"
 614                ;;
 615        *)
 616                case "$cur" in
 617                *:*)
 618                        local remote
 619                        case "${COMP_WORDS[0]}" in
 620                        git-push)  remote="${COMP_WORDS[1]}" ;;
 621                        git)       remote="${COMP_WORDS[2]}" ;;
 622                        esac
 623                        __gitcomp "$(__git_refs "$remote")" "" "${cur#*:}"
 624                        ;;
 625                *)
 626                        __gitcomp "$(__git_refs2)"
 627                        ;;
 628                esac
 629                ;;
 630        esac
 631}
 632
 633_git_rebase ()
 634{
 635        local cur="${COMP_WORDS[COMP_CWORD]}"
 636        if [ -d .dotest ]; then
 637                __gitcomp "--continue --skip --abort"
 638                return
 639        fi
 640        case "${COMP_WORDS[COMP_CWORD-1]}" in
 641        -s|--strategy)
 642                __gitcomp "$(__git_merge_strategies)"
 643                return
 644        esac
 645        case "$cur" in
 646        --strategy=*)
 647                __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
 648                return
 649                ;;
 650        --*)
 651                __gitcomp "--onto --merge --strategy"
 652                return
 653        esac
 654        __gitcomp "$(__git_refs)"
 655}
 656
 657_git_config ()
 658{
 659        local cur="${COMP_WORDS[COMP_CWORD]}"
 660        local prv="${COMP_WORDS[COMP_CWORD-1]}"
 661        case "$prv" in
 662        branch.*.remote)
 663                __gitcomp "$(__git_remotes)"
 664                return
 665                ;;
 666        branch.*.merge)
 667                __gitcomp "$(__git_refs)"
 668                return
 669                ;;
 670        remote.*.fetch)
 671                local remote="${prv#remote.}"
 672                remote="${remote%.fetch}"
 673                __gitcomp "$(__git_refs_remotes "$remote")"
 674                return
 675                ;;
 676        remote.*.push)
 677                local remote="${prv#remote.}"
 678                remote="${remote%.push}"
 679                __gitcomp "$(git --git-dir="$(__gitdir)" \
 680                        for-each-ref --format='%(refname):%(refname)' \
 681                        refs/heads)"
 682                return
 683                ;;
 684        pull.twohead|pull.octopus)
 685                __gitcomp "$(__git_merge_strategies)"
 686                return
 687                ;;
 688        color.branch|color.diff|color.status)
 689                __gitcomp "always never auto"
 690                return
 691                ;;
 692        color.*.*)
 693                __gitcomp "
 694                        black red green yellow blue magenta cyan white
 695                        bold dim ul blink reverse
 696                        "
 697                return
 698                ;;
 699        *.*)
 700                COMPREPLY=()
 701                return
 702                ;;
 703        esac
 704        case "$cur" in
 705        --*)
 706                __gitcomp "
 707                        --global --list --replace-all
 708                        --get --get-all --get-regexp
 709                        --unset --unset-all
 710                        "
 711                return
 712                ;;
 713        branch.*.*)
 714                local pfx="${cur%.*}."
 715                cur="${cur##*.}"
 716                __gitcomp "remote merge" "$pfx" "$cur"
 717                return
 718                ;;
 719        branch.*)
 720                local pfx="${cur%.*}."
 721                cur="${cur#*.}"
 722                __gitcomp "$(__git_heads)" "$pfx" "$cur" "."
 723                return
 724                ;;
 725        remote.*.*)
 726                local pfx="${cur%.*}."
 727                cur="${cur##*.}"
 728                __gitcomp "url fetch push" "$pfx" "$cur"
 729                return
 730                ;;
 731        remote.*)
 732                local pfx="${cur%.*}."
 733                cur="${cur#*.}"
 734                __gitcomp "$(__git_remotes)" "$pfx" "$cur" "."
 735                return
 736                ;;
 737        esac
 738        __gitcomp "
 739                apply.whitespace
 740                core.fileMode
 741                core.gitProxy
 742                core.ignoreStat
 743                core.preferSymlinkRefs
 744                core.logAllRefUpdates
 745                core.repositoryFormatVersion
 746                core.sharedRepository
 747                core.warnAmbiguousRefs
 748                core.compression
 749                core.legacyHeaders
 750                core.packedGitWindowSize
 751                core.packedGitLimit
 752                color.branch
 753                color.branch.current
 754                color.branch.local
 755                color.branch.remote
 756                color.branch.plain
 757                color.diff
 758                color.diff.plain
 759                color.diff.meta
 760                color.diff.frag
 761                color.diff.old
 762                color.diff.new
 763                color.diff.commit
 764                color.diff.whitespace
 765                color.pager
 766                color.status
 767                color.status.header
 768                color.status.added
 769                color.status.changed
 770                color.status.untracked
 771                diff.renameLimit
 772                diff.renames
 773                fetch.unpackLimit
 774                format.headers
 775                gitcvs.enabled
 776                gitcvs.logfile
 777                gc.reflogexpire
 778                gc.reflogexpireunreachable
 779                gc.rerereresolved
 780                gc.rerereunresolved
 781                http.sslVerify
 782                http.sslCert
 783                http.sslKey
 784                http.sslCAInfo
 785                http.sslCAPath
 786                http.maxRequests
 787                http.lowSpeedLimit
 788                http.lowSpeedTime
 789                http.noEPSV
 790                i18n.commitEncoding
 791                i18n.logOutputEncoding
 792                log.showroot
 793                merge.summary
 794                merge.verbosity
 795                pack.window
 796                pull.octopus
 797                pull.twohead
 798                repack.useDeltaBaseOffset
 799                show.difftree
 800                showbranch.default
 801                tar.umask
 802                transfer.unpackLimit
 803                receive.unpackLimit
 804                receive.denyNonFastForwards
 805                user.name
 806                user.email
 807                user.signingkey
 808                whatchanged.difftree
 809                branch. remote.
 810        "
 811}
 812
 813_git_reset ()
 814{
 815        local cur="${COMP_WORDS[COMP_CWORD]}"
 816        case "$cur" in
 817        --*)
 818                __gitcomp "--mixed --hard --soft"
 819                return
 820                ;;
 821        esac
 822        __gitcomp "$(__git_refs)"
 823}
 824
 825_git_show ()
 826{
 827        local cur="${COMP_WORDS[COMP_CWORD]}"
 828        case "$cur" in
 829        --pretty=*)
 830                __gitcomp "
 831                        oneline short medium full fuller email raw
 832                        " "" "${cur##--pretty=}"
 833                return
 834                ;;
 835        --*)
 836                __gitcomp "--pretty="
 837                return
 838                ;;
 839        esac
 840        __git_complete_file
 841}
 842
 843_git ()
 844{
 845        local i c=1 command __git_dir
 846
 847        while [ $c -lt $COMP_CWORD ]; do
 848                i="${COMP_WORDS[c]}"
 849                case "$i" in
 850                --git-dir=*) __git_dir="${i#--git-dir=}" ;;
 851                --bare)      __git_dir="." ;;
 852                --version|--help|-p|--paginate) ;;
 853                *) command="$i"; break ;;
 854                esac
 855                c=$((++c))
 856        done
 857
 858        if [ $c -eq $COMP_CWORD -a -z "$command" ]; then
 859                case "${COMP_WORDS[COMP_CWORD]}" in
 860                --*=*) COMPREPLY=() ;;
 861                --*)   __gitcomp "--git-dir= --bare --version --exec-path" ;;
 862                *)     __gitcomp "$(__git_commands) $(__git_aliases)" ;;
 863                esac
 864                return
 865        fi
 866
 867        local expansion=$(__git_aliased_command "$command")
 868        [ "$expansion" ] && command="$expansion"
 869
 870        case "$command" in
 871        am)          _git_am ;;
 872        add)         _git_add ;;
 873        apply)       _git_apply ;;
 874        branch)      _git_branch ;;
 875        checkout)    _git_checkout ;;
 876        cherry)      _git_cherry ;;
 877        cherry-pick) _git_cherry_pick ;;
 878        commit)      _git_commit ;;
 879        config)      _git_config ;;
 880        diff)        _git_diff ;;
 881        diff-tree)   _git_diff_tree ;;
 882        fetch)       _git_fetch ;;
 883        format-patch) _git_format_patch ;;
 884        log)         _git_log ;;
 885        ls-remote)   _git_ls_remote ;;
 886        ls-tree)     _git_ls_tree ;;
 887        merge)       _git_merge;;
 888        merge-base)  _git_merge_base ;;
 889        name-rev)    _git_name_rev ;;
 890        pull)        _git_pull ;;
 891        push)        _git_push ;;
 892        rebase)      _git_rebase ;;
 893        reset)       _git_reset ;;
 894        show)        _git_show ;;
 895        show-branch) _git_log ;;
 896        whatchanged) _git_log ;;
 897        *)           COMPREPLY=() ;;
 898        esac
 899}
 900
 901_gitk ()
 902{
 903        local cur="${COMP_WORDS[COMP_CWORD]}"
 904        case "$cur" in
 905        --*)
 906                __gitcomp "--not --all"
 907                return
 908                ;;
 909        esac
 910        __git_complete_revlist
 911}
 912
 913complete -o default -o nospace -F _git git
 914complete -o default -o nospace -F _gitk gitk
 915complete -o default -o nospace -F _git_am git-am
 916complete -o default -o nospace -F _git_apply git-apply
 917complete -o default -o nospace -F _git_branch git-branch
 918complete -o default -o nospace -F _git_checkout git-checkout
 919complete -o default -o nospace -F _git_cherry git-cherry
 920complete -o default -o nospace -F _git_cherry_pick git-cherry-pick
 921complete -o default -o nospace -F _git_commit git-commit
 922complete -o default -o nospace -F _git_diff git-diff
 923complete -o default -o nospace -F _git_diff_tree git-diff-tree
 924complete -o default -o nospace -F _git_fetch git-fetch
 925complete -o default -o nospace -F _git_format_patch git-format-patch
 926complete -o default -o nospace -F _git_log git-log
 927complete -o default -o nospace -F _git_ls_remote git-ls-remote
 928complete -o default -o nospace -F _git_ls_tree git-ls-tree
 929complete -o default -o nospace -F _git_merge git-merge
 930complete -o default -o nospace -F _git_merge_base git-merge-base
 931complete -o default -o nospace -F _git_name_rev git-name-rev
 932complete -o default -o nospace -F _git_pull git-pull
 933complete -o default -o nospace -F _git_push git-push
 934complete -o default -o nospace -F _git_rebase git-rebase
 935complete -o default -o nospace -F _git_config git-config
 936complete -o default -o nospace -F _git_reset git-reset
 937complete -o default -o nospace -F _git_show git-show
 938complete -o default -o nospace -F _git_log git-show-branch
 939complete -o default -o nospace -F _git_log git-whatchanged
 940
 941# The following are necessary only for Cygwin, and only are needed
 942# when the user has tab-completed the executable name and consequently
 943# included the '.exe' suffix.
 944#
 945if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
 946complete -o default -o nospace -F _git_add git-add.exe
 947complete -o default -o nospace -F _git_apply git-apply.exe
 948complete -o default -o nospace -F _git git.exe
 949complete -o default -o nospace -F _git_branch git-branch.exe
 950complete -o default -o nospace -F _git_cherry git-cherry.exe
 951complete -o default -o nospace -F _git_diff git-diff.exe
 952complete -o default -o nospace -F _git_diff_tree git-diff-tree.exe
 953complete -o default -o nospace -F _git_format_patch git-format-patch.exe
 954complete -o default -o nospace -F _git_log git-log.exe
 955complete -o default -o nospace -F _git_ls_tree git-ls-tree.exe
 956complete -o default -o nospace -F _git_merge_base git-merge-base.exe
 957complete -o default -o nospace -F _git_name_rev git-name-rev.exe
 958complete -o default -o nospace -F _git_push git-push.exe
 959complete -o default -o nospace -F _git_config git-config
 960complete -o default -o nospace -F _git_show git-show.exe
 961complete -o default -o nospace -F _git_log git-show-branch.exe
 962complete -o default -o nospace -F _git_log git-whatchanged.exe
 963fi