[英]Why does my git completion of branches not work?
我正在嘗試實現我自己的 git-extras 版本git delete-branch
。
#!/usr/bin/env bash
# Assert there is at least one branch provided
test -z $1 && echo "branch required." 1>&2 && exit 1
for branch in "$@"
do
remote=$(git config branch.$branch.remote)
test -z $remote && remote="origin"
ref=$(git config branch.$branch.merge)
test -z $ref && ref="refs/heads/$branch"
git branch -D $branch
git branch -d -r $remote/$branch
git push $remote :$ref
done
取自此處: https : //github.com/tj/git-extras/blob/master/bin/git-delete-branch
當然,如果我們沒有用它完成分支的完成,那將沒有多大意義,這由以下代碼表示:
_git_delete_branch(){
__gitcomp "$(__git_heads)"
}
取自此處: https : //github.com/tj/git-extras/blob/master#L_51/etc/bash_completion.sh
在安裝 git-extras 以嘗試該代碼后,它工作得很好,但正如我在問題中所述,我想實現我自己的方式,因為我想在刪除它們之前檢查分支是否已集成到stable
。
由於我不想將我的腳本放在bash_completion.d
文件夾中,我創建了這個腳本:
#!/bin/bash
_delete_git_branch(){
__gitcomp "$(__git_heads)"
}
complete -o bashdefault -o default -o nospace -F _delete_git_branch delete_git_branch
這是通過source
包含在我的~/.bash_profile
。 如果我現在在終端中輸入delete_git_branch [TAB][TAB]
,我會得到我的分支。 但是,如果我嘗試通過鍵入delete_git_branch 1[TAB][TAB]
來限制完成的結果,我會得到與第一個完全相同的結果。
我想我在這里缺少一些參數,但我不確定。
你能想到我遺漏了什么嗎? 除了使用bash_completion.d
文件夾而不是complete
命令之外,我看不出我的腳本與 git-extras 使用的腳本之間的區別。
由於我問了多個問題(對不起),我將這個答案分開:
好的,我似乎找到了為什么這不能按預期工作的答案。
Git 完成正在包裝git
命令。 這個 wrap 調用__git_func_wrap
,它具有以下代碼行:
_get_comp_words_by_ref -n =: cur words cword prev
此行將參數分配給其命名的對應項。 據我了解, $cur
變量是在整個 git 完成腳本中用於確定要完成的字符串的變量。 如果那個賦值函數沒有被調用,我們將一直有一個空的$cur
並且沒有限制的完成。
所以這就是我的完成文件現在的樣子:
#!/bin/bash
_delete_git_branch(){
_get_comp_words_by_ref -n =: cur words cword prev
__gitcomp "$(__git_heads)"
}
complete -o bashdefault -o default -o nospace -F _delete_git_branch delete_git_branch
這當然很臟,但是例如調用_git
導致重復調用,從而導致與以前相同的問題(順便說一下,我不知道為什么)。
我知道這很臟,但我很高興收到您對我的解決方案的反饋。
關於為什么 git-extras 的完成開箱即用並且不使用complete
:它當然不能在沒有complete
情況下complete
工作。 但是因為它只是一個git
子命令,所以它也被 git 完成包裹。
似乎如果您正在為子命令運行 git completion,它會嘗試猜測它的函數名稱https://github.com/git/git/blob/master/contrib/completion/git-completion.bash# L2606 。
然后它執行函數。 就那么簡單 :)
哦,是的,我忘記了道德:如果你真的,真的,真的需要在 git 子命令之外創建一個帶有 git 完成的命令,你可以這樣做(或者更好地結合這個和我來的評論到這個答案)。 但在任何其他情況下,您應該盡可能接近 git 子命令實現。 只是為了省去這樣的麻煩;)
git branch
的完成應該與 Git 2.31(2021 年第一季度)配合得更好:命令行完成(在contrib/
)完成了帶有分支名稱的“ git branch -d
” ( man ) ,但提供了“ git branch -D
” ( man )此外還有標記名,已更正。
“ git branch -M
” ( man )有同樣的問題。
請參閱Jeff King ( peff
) 的commit 27dc071 、 commit bca362c (03 Feb 2021) 和commit a534cf4 (02 Feb 2021 ) 。
(由Junio C gitster
合並-- gitster
-- in commit 006c5f7 ,2021 年 2 月 12 日)
completion
:處理“branch -m”的其他變體簽字人:Jeff King
我們沒有將“
branch -M
”(大寫 M)與“branch -m
”相同,也沒有任何“--copy
”變體。
結果,這些提供了任何 ref 作為下一個候選者,而不僅僅是分支名稱。請注意,我重新包裝了 case-arm 線,因為它現在很長,為了保持一致性,下面的線也是如此。
我還對現有的“-D
”進行了重新排序,以使案例如何組合在一起更加明顯。
和:
completion
:以與“branch -d
”相同的方式對待“branch -D
”報告人:保羅·喬利
簽字人:Jeff King
前者不僅提供分支,還提供作為完成候選者的標簽。
模仿“
branch -d
”如何將其建議限制為分支名稱。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.