1

独自のバージョンの 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

stableそのコードを試すためにgit-extrasをインストールした後、それはかなりうまくいきましたが、質問で述べたように、ブランチが削除される前にブランチが統合されているかどうかを確認したいので、独自の方法を実装したいと思います。

bash_completion.dスクリプトをフォルダーに入れたくないので、次のスクリプトを作成しました。

#!/ビン/バッシュ

_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コマンドの代わりにフォルダーを使用することを除いて、私のスクリプトと git-extras が使用するスクリプトの違いはわかりませんcomplete

4

2 に答える 2

0

複数の質問をしたので(申し訳ありません)、この回答を分割します。

非作業部分完了

さて、これが期待どおりに機能しない理由を見つけたようです。

Git 補完はコマンドをラップしていますgit。このラップ呼び出し__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。ただし、これは単なるgitサブコマンドであるため、git 補完によってラップされます。

サブコマンドの git 補完を実行している場合、その関数名を推測しようとするようですhttps://github.com/git/git/blob/master/contrib/completion/git-completion.bash# L2606 .

そして、関数を実行します。そのような単純な :)

道徳の

そうそう、私は教訓を忘れていました: 本当に、本当に、本当に git サブコマンドの外で git 補完を使用してコマンドを作成する必要がある場合は、これを行うことができます (または、これと私のコメントの組み合わせを使用することをお勧めします)この答えに)。ただし、それ以外の場合は、できるだけ git サブコマンドの実装に近づける必要があります。そのような面倒を省くためだけに;)

于 2015-06-08T10:45:07.807 に答える