[英]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”)。
注意: DWIM是D 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.