contrib / completion / git-completion.bashon commit Merge branch 'master' of git://repo.or.cz/git-gui (ea44949)
   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                fast-import)      : import;;
 274                fsck-objects)     : plumbing;;
 275                fetch-pack)       : plumbing;;
 276                fmt-merge-msg)    : plumbing;;
 277                hash-object)      : plumbing;;
 278                http-*)           : transport;;
 279                index-pack)       : plumbing;;
 280                init-db)          : deprecated;;
 281                local-fetch)      : plumbing;;
 282                mailinfo)         : plumbing;;
 283                mailsplit)        : plumbing;;
 284                merge-*)          : plumbing;;
 285                mktree)           : plumbing;;
 286                mktag)            : plumbing;;
 287                pack-objects)     : plumbing;;
 288                pack-redundant)   : plumbing;;
 289                pack-refs)        : plumbing;;
 290                parse-remote)     : plumbing;;
 291                patch-id)         : plumbing;;
 292                peek-remote)      : plumbing;;
 293                prune)            : plumbing;;
 294                prune-packed)     : plumbing;;
 295                quiltimport)      : import;;
 296                read-tree)        : plumbing;;
 297                receive-pack)     : plumbing;;
 298                reflog)           : plumbing;;
 299                repo-config)      : plumbing;;
 300                rerere)           : plumbing;;
 301                resolve)          : dead dont use;;
 302                rev-list)         : plumbing;;
 303                rev-parse)        : plumbing;;
 304                runstatus)        : plumbing;;
 305                sh-setup)         : internal;;
 306                shell)            : daemon;;
 307                send-pack)        : plumbing;;
 308                show-index)       : plumbing;;
 309                ssh-*)            : transport;;
 310                stripspace)       : plumbing;;
 311                svn)              : import export;;
 312                svnimport)        : import;;
 313                symbolic-ref)     : plumbing;;
 314                tar-tree)         : deprecated;;
 315                unpack-file)      : plumbing;;
 316                unpack-objects)   : plumbing;;
 317                update-index)     : plumbing;;
 318                update-ref)       : plumbing;;
 319                update-server-info) : daemon;;
 320                upload-archive)   : plumbing;;
 321                upload-pack)      : plumbing;;
 322                write-tree)       : plumbing;;
 323                verify-tag)       : plumbing;;
 324                *) echo $i;;
 325                esac
 326        done
 327}
 328__git_commandlist=
 329__git_commandlist="$(__git_commands 2>/dev/null)"
 330
 331__git_aliases ()
 332{
 333        local i IFS=$'\n'
 334        for i in $(git --git-dir="$(__gitdir)" config --list); do
 335                case "$i" in
 336                alias.*)
 337                        i="${i#alias.}"
 338                        echo "${i/=*/}"
 339                        ;;
 340                esac
 341        done
 342}
 343
 344__git_aliased_command ()
 345{
 346        local word cmdline=$(git --git-dir="$(__gitdir)" \
 347                config --get "alias.$1")
 348        for word in $cmdline; do
 349                if [ "${word##-*}" ]; then
 350                        echo $word
 351                        return
 352                fi
 353        done
 354}
 355
 356__git_whitespacelist="nowarn warn error error-all strip"
 357
 358_git_am ()
 359{
 360        local cur="${COMP_WORDS[COMP_CWORD]}"
 361        if [ -d .dotest ]; then
 362                __gitcomp "--skip --resolved"
 363                return
 364        fi
 365        case "$cur" in
 366        --whitespace=*)
 367                __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
 368                return
 369                ;;
 370        --*)
 371                __gitcomp "
 372                        --signoff --utf8 --binary --3way --interactive
 373                        --whitespace=
 374                        "
 375                return
 376        esac
 377        COMPREPLY=()
 378}
 379
 380_git_apply ()
 381{
 382        local cur="${COMP_WORDS[COMP_CWORD]}"
 383        case "$cur" in
 384        --whitespace=*)
 385                __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
 386                return
 387                ;;
 388        --*)
 389                __gitcomp "
 390                        --stat --numstat --summary --check --index
 391                        --cached --index-info --reverse --reject --unidiff-zero
 392                        --apply --no-add --exclude=
 393                        --whitespace= --inaccurate-eof --verbose
 394                        "
 395                return
 396        esac
 397        COMPREPLY=()
 398}
 399
 400_git_add ()
 401{
 402        local cur="${COMP_WORDS[COMP_CWORD]}"
 403        case "$cur" in
 404        --*)
 405                __gitcomp "--interactive"
 406                return
 407        esac
 408        COMPREPLY=()
 409}
 410
 411_git_bisect ()
 412{
 413        local i c=1 command
 414        while [ $c -lt $COMP_CWORD ]; do
 415                i="${COMP_WORDS[c]}"
 416                case "$i" in
 417                start|bad|good|reset|visualize|replay|log)
 418                        command="$i"
 419                        break
 420                        ;;
 421                esac
 422                c=$((++c))
 423        done
 424
 425        if [ $c -eq $COMP_CWORD -a -z "$command" ]; then
 426                __gitcomp "start bad good reset visualize replay log"
 427                return
 428        fi
 429
 430        case "$command" in
 431        bad|good|reset)
 432                __gitcomp "$(__git_refs)"
 433                ;;
 434        *)
 435                COMPREPLY=()
 436                ;;
 437        esac
 438}
 439
 440_git_branch ()
 441{
 442        __gitcomp "$(__git_refs)"
 443}
 444
 445_git_checkout ()
 446{
 447        __gitcomp "$(__git_refs)"
 448}
 449
 450_git_cherry ()
 451{
 452        __gitcomp "$(__git_refs)"
 453}
 454
 455_git_cherry_pick ()
 456{
 457        local cur="${COMP_WORDS[COMP_CWORD]}"
 458        case "$cur" in
 459        --*)
 460                __gitcomp "--edit --no-commit"
 461                ;;
 462        *)
 463                __gitcomp "$(__git_refs)"
 464                ;;
 465        esac
 466}
 467
 468_git_commit ()
 469{
 470        local cur="${COMP_WORDS[COMP_CWORD]}"
 471        case "$cur" in
 472        --*)
 473                __gitcomp "
 474                        --all --author= --signoff --verify --no-verify
 475                        --edit --amend --include --only
 476                        "
 477                return
 478        esac
 479        COMPREPLY=()
 480}
 481
 482_git_diff ()
 483{
 484        __git_complete_file
 485}
 486
 487_git_diff_tree ()
 488{
 489        __gitcomp "$(__git_refs)"
 490}
 491
 492_git_fetch ()
 493{
 494        local cur="${COMP_WORDS[COMP_CWORD]}"
 495
 496        case "${COMP_WORDS[0]},$COMP_CWORD" in
 497        git-fetch*,1)
 498                __gitcomp "$(__git_remotes)"
 499                ;;
 500        git,2)
 501                __gitcomp "$(__git_remotes)"
 502                ;;
 503        *)
 504                case "$cur" in
 505                *:*)
 506                        __gitcomp "$(__git_refs)" "" "${cur#*:}"
 507                        ;;
 508                *)
 509                        local remote
 510                        case "${COMP_WORDS[0]}" in
 511                        git-fetch) remote="${COMP_WORDS[1]}" ;;
 512                        git)       remote="${COMP_WORDS[2]}" ;;
 513                        esac
 514                        __gitcomp "$(__git_refs2 "$remote")"
 515                        ;;
 516                esac
 517                ;;
 518        esac
 519}
 520
 521_git_format_patch ()
 522{
 523        local cur="${COMP_WORDS[COMP_CWORD]}"
 524        case "$cur" in
 525        --*)
 526                __gitcomp "
 527                        --stdout --attach --thread
 528                        --output-directory
 529                        --numbered --start-number
 530                        --keep-subject
 531                        --signoff
 532                        --in-reply-to=
 533                        --full-index --binary
 534                        --not --all
 535                        "
 536                return
 537                ;;
 538        esac
 539        __git_complete_revlist
 540}
 541
 542_git_gc ()
 543{
 544        local cur="${COMP_WORDS[COMP_CWORD]}"
 545        case "$cur" in
 546        --*)
 547                __gitcomp "--prune"
 548                return
 549                ;;
 550        esac
 551        COMPREPLY=()
 552}
 553
 554_git_ls_remote ()
 555{
 556        __gitcomp "$(__git_remotes)"
 557}
 558
 559_git_ls_tree ()
 560{
 561        __git_complete_file
 562}
 563
 564_git_log ()
 565{
 566        local cur="${COMP_WORDS[COMP_CWORD]}"
 567        case "$cur" in
 568        --pretty=*)
 569                __gitcomp "
 570                        oneline short medium full fuller email raw
 571                        " "" "${cur##--pretty=}"
 572                return
 573                ;;
 574        --*)
 575                __gitcomp "
 576                        --max-count= --max-age= --since= --after=
 577                        --min-age= --before= --until=
 578                        --root --not --topo-order --date-order
 579                        --no-merges
 580                        --abbrev-commit --abbrev=
 581                        --relative-date
 582                        --author= --committer= --grep=
 583                        --all-match
 584                        --pretty= --name-status --name-only
 585                        --not --all
 586                        "
 587                return
 588                ;;
 589        esac
 590        __git_complete_revlist
 591}
 592
 593_git_merge ()
 594{
 595        local cur="${COMP_WORDS[COMP_CWORD]}"
 596        case "${COMP_WORDS[COMP_CWORD-1]}" in
 597        -s|--strategy)
 598                __gitcomp "$(__git_merge_strategies)"
 599                return
 600        esac
 601        case "$cur" in
 602        --strategy=*)
 603                __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
 604                return
 605                ;;
 606        --*)
 607                __gitcomp "
 608                        --no-commit --no-summary --squash --strategy
 609                        "
 610                return
 611        esac
 612        __gitcomp "$(__git_refs)"
 613}
 614
 615_git_merge_base ()
 616{
 617        __gitcomp "$(__git_refs)"
 618}
 619
 620_git_name_rev ()
 621{
 622        __gitcomp "--tags --all --stdin"
 623}
 624
 625_git_pull ()
 626{
 627        local cur="${COMP_WORDS[COMP_CWORD]}"
 628
 629        case "${COMP_WORDS[0]},$COMP_CWORD" in
 630        git-pull*,1)
 631                __gitcomp "$(__git_remotes)"
 632                ;;
 633        git,2)
 634                __gitcomp "$(__git_remotes)"
 635                ;;
 636        *)
 637                local remote
 638                case "${COMP_WORDS[0]}" in
 639                git-pull)  remote="${COMP_WORDS[1]}" ;;
 640                git)       remote="${COMP_WORDS[2]}" ;;
 641                esac
 642                __gitcomp "$(__git_refs "$remote")"
 643                ;;
 644        esac
 645}
 646
 647_git_push ()
 648{
 649        local cur="${COMP_WORDS[COMP_CWORD]}"
 650
 651        case "${COMP_WORDS[0]},$COMP_CWORD" in
 652        git-push*,1)
 653                __gitcomp "$(__git_remotes)"
 654                ;;
 655        git,2)
 656                __gitcomp "$(__git_remotes)"
 657                ;;
 658        *)
 659                case "$cur" in
 660                *:*)
 661                        local remote
 662                        case "${COMP_WORDS[0]}" in
 663                        git-push)  remote="${COMP_WORDS[1]}" ;;
 664                        git)       remote="${COMP_WORDS[2]}" ;;
 665                        esac
 666                        __gitcomp "$(__git_refs "$remote")" "" "${cur#*:}"
 667                        ;;
 668                *)
 669                        __gitcomp "$(__git_refs2)"
 670                        ;;
 671                esac
 672                ;;
 673        esac
 674}
 675
 676_git_rebase ()
 677{
 678        local cur="${COMP_WORDS[COMP_CWORD]}"
 679        if [ -d .dotest ] || [ -d .git/.dotest-merge ]; then
 680                __gitcomp "--continue --skip --abort"
 681                return
 682        fi
 683        case "${COMP_WORDS[COMP_CWORD-1]}" in
 684        -s|--strategy)
 685                __gitcomp "$(__git_merge_strategies)"
 686                return
 687        esac
 688        case "$cur" in
 689        --strategy=*)
 690                __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
 691                return
 692                ;;
 693        --*)
 694                __gitcomp "--onto --merge --strategy"
 695                return
 696        esac
 697        __gitcomp "$(__git_refs)"
 698}
 699
 700_git_config ()
 701{
 702        local cur="${COMP_WORDS[COMP_CWORD]}"
 703        local prv="${COMP_WORDS[COMP_CWORD-1]}"
 704        case "$prv" in
 705        branch.*.remote)
 706                __gitcomp "$(__git_remotes)"
 707                return
 708                ;;
 709        branch.*.merge)
 710                __gitcomp "$(__git_refs)"
 711                return
 712                ;;
 713        remote.*.fetch)
 714                local remote="${prv#remote.}"
 715                remote="${remote%.fetch}"
 716                __gitcomp "$(__git_refs_remotes "$remote")"
 717                return
 718                ;;
 719        remote.*.push)
 720                local remote="${prv#remote.}"
 721                remote="${remote%.push}"
 722                __gitcomp "$(git --git-dir="$(__gitdir)" \
 723                        for-each-ref --format='%(refname):%(refname)' \
 724                        refs/heads)"
 725                return
 726                ;;
 727        pull.twohead|pull.octopus)
 728                __gitcomp "$(__git_merge_strategies)"
 729                return
 730                ;;
 731        color.branch|color.diff|color.status)
 732                __gitcomp "always never auto"
 733                return
 734                ;;
 735        color.*.*)
 736                __gitcomp "
 737                        black red green yellow blue magenta cyan white
 738                        bold dim ul blink reverse
 739                        "
 740                return
 741                ;;
 742        *.*)
 743                COMPREPLY=()
 744                return
 745                ;;
 746        esac
 747        case "$cur" in
 748        --*)
 749                __gitcomp "
 750                        --global --list --replace-all
 751                        --get --get-all --get-regexp
 752                        --add --unset --unset-all
 753                        "
 754                return
 755                ;;
 756        branch.*.*)
 757                local pfx="${cur%.*}."
 758                cur="${cur##*.}"
 759                __gitcomp "remote merge" "$pfx" "$cur"
 760                return
 761                ;;
 762        branch.*)
 763                local pfx="${cur%.*}."
 764                cur="${cur#*.}"
 765                __gitcomp "$(__git_heads)" "$pfx" "$cur" "."
 766                return
 767                ;;
 768        remote.*.*)
 769                local pfx="${cur%.*}."
 770                cur="${cur##*.}"
 771                __gitcomp "url fetch push" "$pfx" "$cur"
 772                return
 773                ;;
 774        remote.*)
 775                local pfx="${cur%.*}."
 776                cur="${cur#*.}"
 777                __gitcomp "$(__git_remotes)" "$pfx" "$cur" "."
 778                return
 779                ;;
 780        esac
 781        __gitcomp "
 782                apply.whitespace
 783                core.fileMode
 784                core.gitProxy
 785                core.ignoreStat
 786                core.preferSymlinkRefs
 787                core.logAllRefUpdates
 788                core.repositoryFormatVersion
 789                core.sharedRepository
 790                core.warnAmbiguousRefs
 791                core.compression
 792                core.legacyHeaders
 793                core.packedGitWindowSize
 794                core.packedGitLimit
 795                color.branch
 796                color.branch.current
 797                color.branch.local
 798                color.branch.remote
 799                color.branch.plain
 800                color.diff
 801                color.diff.plain
 802                color.diff.meta
 803                color.diff.frag
 804                color.diff.old
 805                color.diff.new
 806                color.diff.commit
 807                color.diff.whitespace
 808                color.pager
 809                color.status
 810                color.status.header
 811                color.status.added
 812                color.status.changed
 813                color.status.untracked
 814                diff.renameLimit
 815                diff.renames
 816                fetch.unpackLimit
 817                format.headers
 818                gitcvs.enabled
 819                gitcvs.logfile
 820                gc.reflogexpire
 821                gc.reflogexpireunreachable
 822                gc.rerereresolved
 823                gc.rerereunresolved
 824                http.sslVerify
 825                http.sslCert
 826                http.sslKey
 827                http.sslCAInfo
 828                http.sslCAPath
 829                http.maxRequests
 830                http.lowSpeedLimit
 831                http.lowSpeedTime
 832                http.noEPSV
 833                i18n.commitEncoding
 834                i18n.logOutputEncoding
 835                log.showroot
 836                merge.summary
 837                merge.verbosity
 838                pack.window
 839                pull.octopus
 840                pull.twohead
 841                repack.useDeltaBaseOffset
 842                show.difftree
 843                showbranch.default
 844                tar.umask
 845                transfer.unpackLimit
 846                receive.unpackLimit
 847                receive.denyNonFastForwards
 848                user.name
 849                user.email
 850                user.signingkey
 851                whatchanged.difftree
 852                branch. remote.
 853        "
 854}
 855
 856_git_remote ()
 857{
 858        local i c=1 command
 859        while [ $c -lt $COMP_CWORD ]; do
 860                i="${COMP_WORDS[c]}"
 861                case "$i" in
 862                add|show|prune) command="$i"; break ;;
 863                esac
 864                c=$((++c))
 865        done
 866
 867        if [ $c -eq $COMP_CWORD -a -z "$command" ]; then
 868                __gitcomp "add show prune"
 869                return
 870        fi
 871
 872        case "$command" in
 873        show|prune)
 874                __gitcomp "$(__git_remotes)"
 875                ;;
 876        *)
 877                COMPREPLY=()
 878                ;;
 879        esac
 880}
 881
 882_git_reset ()
 883{
 884        local cur="${COMP_WORDS[COMP_CWORD]}"
 885        case "$cur" in
 886        --*)
 887                __gitcomp "--mixed --hard --soft"
 888                return
 889                ;;
 890        esac
 891        __gitcomp "$(__git_refs)"
 892}
 893
 894_git_show ()
 895{
 896        local cur="${COMP_WORDS[COMP_CWORD]}"
 897        case "$cur" in
 898        --pretty=*)
 899                __gitcomp "
 900                        oneline short medium full fuller email raw
 901                        " "" "${cur##--pretty=}"
 902                return
 903                ;;
 904        --*)
 905                __gitcomp "--pretty="
 906                return
 907                ;;
 908        esac
 909        __git_complete_file
 910}
 911
 912_git ()
 913{
 914        local i c=1 command __git_dir
 915
 916        while [ $c -lt $COMP_CWORD ]; do
 917                i="${COMP_WORDS[c]}"
 918                case "$i" in
 919                --git-dir=*) __git_dir="${i#--git-dir=}" ;;
 920                --bare)      __git_dir="." ;;
 921                --version|--help|-p|--paginate) ;;
 922                *) command="$i"; break ;;
 923                esac
 924                c=$((++c))
 925        done
 926
 927        if [ $c -eq $COMP_CWORD -a -z "$command" ]; then
 928                case "${COMP_WORDS[COMP_CWORD]}" in
 929                --*=*) COMPREPLY=() ;;
 930                --*)   __gitcomp "--git-dir= --bare --version --exec-path" ;;
 931                *)     __gitcomp "$(__git_commands) $(__git_aliases)" ;;
 932                esac
 933                return
 934        fi
 935
 936        local expansion=$(__git_aliased_command "$command")
 937        [ "$expansion" ] && command="$expansion"
 938
 939        case "$command" in
 940        am)          _git_am ;;
 941        add)         _git_add ;;
 942        apply)       _git_apply ;;
 943        bisect)      _git_bisect ;;
 944        branch)      _git_branch ;;
 945        checkout)    _git_checkout ;;
 946        cherry)      _git_cherry ;;
 947        cherry-pick) _git_cherry_pick ;;
 948        commit)      _git_commit ;;
 949        config)      _git_config ;;
 950        diff)        _git_diff ;;
 951        diff-tree)   _git_diff_tree ;;
 952        fetch)       _git_fetch ;;
 953        format-patch) _git_format_patch ;;
 954        gc)          _git_gc ;;
 955        log)         _git_log ;;
 956        ls-remote)   _git_ls_remote ;;
 957        ls-tree)     _git_ls_tree ;;
 958        merge)       _git_merge;;
 959        merge-base)  _git_merge_base ;;
 960        name-rev)    _git_name_rev ;;
 961        pull)        _git_pull ;;
 962        push)        _git_push ;;
 963        rebase)      _git_rebase ;;
 964        remote)      _git_remote ;;
 965        reset)       _git_reset ;;
 966        show)        _git_show ;;
 967        show-branch) _git_log ;;
 968        whatchanged) _git_log ;;
 969        *)           COMPREPLY=() ;;
 970        esac
 971}
 972
 973_gitk ()
 974{
 975        local cur="${COMP_WORDS[COMP_CWORD]}"
 976        case "$cur" in
 977        --*)
 978                __gitcomp "--not --all"
 979                return
 980                ;;
 981        esac
 982        __git_complete_revlist
 983}
 984
 985complete -o default -o nospace -F _git git
 986complete -o default -o nospace -F _gitk gitk
 987complete -o default -o nospace -F _git_am git-am
 988complete -o default -o nospace -F _git_apply git-apply
 989complete -o default -o nospace -F _git_bisect git-bisect
 990complete -o default -o nospace -F _git_branch git-branch
 991complete -o default -o nospace -F _git_checkout git-checkout
 992complete -o default -o nospace -F _git_cherry git-cherry
 993complete -o default -o nospace -F _git_cherry_pick git-cherry-pick
 994complete -o default -o nospace -F _git_commit git-commit
 995complete -o default -o nospace -F _git_diff git-diff
 996complete -o default -o nospace -F _git_diff_tree git-diff-tree
 997complete -o default -o nospace -F _git_fetch git-fetch
 998complete -o default -o nospace -F _git_format_patch git-format-patch
 999complete -o default -o nospace -F _git_gc git-gc
1000complete -o default -o nospace -F _git_log git-log
1001complete -o default -o nospace -F _git_ls_remote git-ls-remote
1002complete -o default -o nospace -F _git_ls_tree git-ls-tree
1003complete -o default -o nospace -F _git_merge git-merge
1004complete -o default -o nospace -F _git_merge_base git-merge-base
1005complete -o default -o nospace -F _git_name_rev git-name-rev
1006complete -o default -o nospace -F _git_pull git-pull
1007complete -o default -o nospace -F _git_push git-push
1008complete -o default -o nospace -F _git_rebase git-rebase
1009complete -o default -o nospace -F _git_config git-config
1010complete -o default -o nospace -F _git_remote git-remote
1011complete -o default -o nospace -F _git_reset git-reset
1012complete -o default -o nospace -F _git_show git-show
1013complete -o default -o nospace -F _git_log git-show-branch
1014complete -o default -o nospace -F _git_log git-whatchanged
1015
1016# The following are necessary only for Cygwin, and only are needed
1017# when the user has tab-completed the executable name and consequently
1018# included the '.exe' suffix.
1019#
1020if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
1021complete -o default -o nospace -F _git_add git-add.exe
1022complete -o default -o nospace -F _git_apply git-apply.exe
1023complete -o default -o nospace -F _git git.exe
1024complete -o default -o nospace -F _git_branch git-branch.exe
1025complete -o default -o nospace -F _git_cherry git-cherry.exe
1026complete -o default -o nospace -F _git_diff git-diff.exe
1027complete -o default -o nospace -F _git_diff_tree git-diff-tree.exe
1028complete -o default -o nospace -F _git_format_patch git-format-patch.exe
1029complete -o default -o nospace -F _git_log git-log.exe
1030complete -o default -o nospace -F _git_ls_tree git-ls-tree.exe
1031complete -o default -o nospace -F _git_merge_base git-merge-base.exe
1032complete -o default -o nospace -F _git_name_rev git-name-rev.exe
1033complete -o default -o nospace -F _git_push git-push.exe
1034complete -o default -o nospace -F _git_config git-config
1035complete -o default -o nospace -F _git_show git-show.exe
1036complete -o default -o nospace -F _git_log git-show-branch.exe
1037complete -o default -o nospace -F _git_log git-whatchanged.exe
1038fi