簡體   English   中英

為什么我的 git 完成分支不起作用?

[英]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 -dman ,但提供了“ git branch -Dman此外還有標記名,已更正。
git branch -Mman有同樣的問題。

請參閱Jeff King ( peff ) 的commit 27dc071commit 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.

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