簡體   English   中英

在 Git Bash 中禁用遠程分支的自動完成?

[英]Disable auto-completion of remote branches in Git Bash?

我正在開發一個相當大的 git 存儲庫,其中包含數千個(遠程)分支。 我習慣於在控制台中使用自動完成(使用 [TAB])(在這種情況下是 Git Bash),所以我也無意識地對 git 命令這樣做了。

例如,我會輸入

git checkout task[TAB]

效果是控制台經常停頓幾分鍾。 有沒有辦法將自動完成限制在本地分支機構?

使用 Git 2.13(2017 年第二季度),您可以禁用(部分)分支完成。

git checkout --no-guess ...
# or:
export GIT_COMPLETION_CHECKOUT_NO_GUESS=1

請參閱Jeff King ( peff )提交 60e71bb (2017 年 4 月 21 日)。
(由Junio C Hamano -- gitster --提交 b439747中合並,2017 年 5 月 1 日)

contrib/completion/git-completion.bash中所述:

您可以設置以下環境變量來影響完成例程的行為:

 GIT_COMPLETION_CHECKOUT_NO_GUESS

當設置為“1”時,不要在git-checkout完成中包含“DWIM”建議(例如,當“origin/foo”存在時完成“foo”)。

注意: DWIMD o W hat I Mean 的縮寫,系統試圖預測用戶打算做什么,自動糾正微不足道的錯誤,而不是盲目地執行用戶顯式但可能不正確的輸入。

completion :可選擇禁用結帳 DWIM

當我們完成“ git checkout ”的分支名稱時,我們還完成了可能觸發 DWIM 行為的遠程分支名稱。 根據您的工作流程和項目,這可能很方便,也可能很煩人。

例如,我的gitster.git克隆包含 74 個本地“ jk/* ”分支,但 origin 包含另外 147 個。
當我想簽出一個本地分支但記不住名稱時,選項卡完成會顯示 251 個條目。 更糟糕的是,對於一個已經為 pu 挑出來的話題,上游分支名稱很可能和我的很相似,導致我很可能選錯了,不小心創建了一個新的分支。


注意:“pick up for pu”:請參閱git.git中的烹飪內容:它以:

以“ - ”為前綴的提交僅在pu ”(建議的更新)中,而以“ + ”為前綴的提交在“ next ”中。

這是Git 工作流畢業過程的一部分。

pu (提議的更新)是一個集成分支,用於尚未准備好包含的內容


此補丁為用戶添加了一種方法來告訴完成代碼不要包含 DWIM 結帳建議。
這已經可以通過鍵入:

 git checkout --no-guess jk/<TAB>

但這很麻煩。

當然,缺點是當您確實想要調用 DWIM 行為時,您不再獲得完成支持。
但是根據您的工作流程,這可能不是一個很大的損失(例如,在 git.git 中,我更有可能想要分離,所以我會鍵入“ git checkout origin/jk/<TAB> ”檢查。

我假設您使用的是git-completion.bash腳本,並且您關心git checkout

為此,我只是在git-completion.bash中的_git_checkout () function 的定義中更改了一行:

<       __gitcomp_nl "$(__git_refs '' $track)"
---
>       __gitcomp_nl "$(__git_heads '' $track)"

我的理解是,這只會影響 tab-completion 操作(因為它在 switch-case 語句的* case 中的位置)。

你可以破解 /etc/bash_completion.d/git

您需要編輯__git_refs ()

請注意,行為的變化將適用於所有地方(因此即使在您可能不希望的地方使用 git 推/拉)。 當然,您可以復制 function 或傳遞一個額外的參數,但我將其留給您

如果您通過自制軟件安裝了 git-completion,它位於: /usr/local/etc/bash_completion.d/git-completion.bash

按照上面erik.weathers 的回答,我進行了以下更改,以便自動完成功能可以根據當前前綴在本地和遠程工作。 默認情況下,它只會搜索本地,但如果我指定origin/…它會知道我也想搜索遠程分支。

_git_checkout ()方法中,更改

    __gitcomp_nl "$(__git_refs '' $track)"

至:

    # only search local branches instead of remote branches if origin isn't specified
    if [[ $cur == "origin/"* ]]; then
        __gitcomp_nl "$(__git_refs '' $track)"
    else
        __gitcomp_nl "$(__git_heads '' $track)"
    fi

當然,您可以將origin更改為其他內容,或者如果您有超過 1 個,您可以讓它通過遠程前綴列表進行搜索。

您可以認為您只是具有別名co的本地分支和具有完整命令checkout的所有分支。

您可以執行以下操作。 在 your.bashrc 中,重新定義_git_checkout() function。 你讓這個 function 不變,除了結尾:

if [ $command -eq "co" ]; then
  __gitcomp "$(__git_refs_local '' $track)"
else
  __gitcomp "$(__git_refs '' $track)"
fi

然后,您只需要定義一個新的 function, __git_refs_local ,在其中刪除遠程內容。

Carey Metcalfe 寫了一篇博客文章,其中包含一個解決方案,該解決方案還編輯了自動完成 function,但代碼比其他答案稍新。 他還定義了一個別名checkoutr ,以保留舊的自動完成行為,以備不時之需。

簡而言之,首先使用以下命令創建checkoutr別名:

git config --global alias.checkoutr checkout

然后找到git-completion.bash ,將_git_checkout function 復制到 shell 的 RC 文件中,以便重新定義它,然后在 ZC1C425268E68385D1AB50741C 中替換此行:

__git_complete_refs $track_opt

使用以下幾行:

if [ "$command" = "checkoutr" ]; then
    __git_complete_refs $track_opt
else
    __gitcomp_direct "$(__git_heads "" "$cur" " ")"
fi

有關代碼的更多詳細信息和潛在更新,請參閱博客文章

修改$(brew --prefix)/etc/bash_completion.d/git-completion.bash不是一個好主意,因為每次通過 Homebrew 更新 Git 時都會覆蓋它。

結合所有答案,我在采購完成文件后僅覆蓋.bash_profile中的完成文件中的_git_checkout function :

_git_checkout ()
{
  __git_has_doubledash && return

  case "$cur" in
    --conflict=*)
      __gitcomp "diff3 merge" "" "${cur##--conflict=}"
      ;;
    --*)
      __gitcomp "
      --quiet --ours --theirs --track --no-track --merge
      --conflict= --orphan --patch
      "
      ;;
    *)
      # check if --track, --no-track, or --no-guess was specified
      # if so, disable DWIM mode
      local flags="--track --no-track --no-guess" track=1
      if [ -n "$(__git_find_on_cmdline "$flags")" ]; then
        track=''
      fi
      # only search local branches instead of remote branches if origin isn't
      # specified
      if [[ $cur == "origin/"* ]]; then
        __gitcomp_nl "$(__git_refs '' $track)"
      else
        __gitcomp_nl "$(__git_heads '' $track)"
      fi
      ;;
  esac
}

FWW 這里是對 __git_complete_refs 的破解,它可以解決問題

__git_complete_refs ()

{ 本地遠程跟蹤 pfx cur_="$cur" sfx=""

while test $# != 0; do
    case "$1" in
    --remote=*) remote="${1##--remote=}" ;;
    --track)    track="yes" ;;
    --pfx=*)    pfx="${1##--pfx=}" ;;
    --cur=*)    cur_="${1##--cur=}" ;;
    --sfx=*)    sfx="${1##--sfx=}" ;;
    *)      return 1 ;;
    esac
    shift
done
echo cur_ $cur_ > a
 if [[  $GIT_COMPLETION_CHECKOUT_NO_GUESS != 1 || $cur_ == "origin"* ]]; then
    __gitcomp_direct "$(__git_refs "$remote" "$track" "$pfx" "$cur_" "$sfx")"
  else
    __gitcomp_direct "$(__git_heads  "" "$cur_")"
  fi

}

I'm not using Git Bash myself, but if this is the same as mentioned in http://tekrat.com/2008/04/30/bash-autocompletion-git-super-lazy-goodness/ , you should be able to用普通的git 分支替換 git分支 -a

_complete_git() {
  if [ -d .git ]; then
    branches=`git branch -a | cut -c 3-`
    tags=`git tag`
    cur="${COMP_WORDS[COMP_CWORD]}"
    COMPREPLY=( $(compgen -W "${branches} ${tags}" -- ${cur}) )
  fi
}
complete -F _complete_git git checkout

(在 your.profile 或類似文件中)並得到你想要的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM