gitコマンドをオーバーライドすると、gitオートコンプリート機能は中断されます。

gitコマンドをオーバーライドすると、gitオートコンプリート機能は中断されます。

最近、git branch <tab>次のエラーが表示され始めました。

$ git branch bash: -c: line 0: syntax error near unexpected token `('
bash: -c: line 0: `/usr/bin/git --git-dir=.git for-each-ref --format=%(refname:short) refs/tags refs/heads refs/remotes'
HEAD bash: -c: line 0: syntax error near unexpected token `('
bash: -c: line 0: `/usr/bin/git --git-dir=.git for-each-ref --format=%(refname:short) refs/tags refs/heads refs/remotes'
HEAD ^C

どうすれば解決できますか?

私は次のような行を持っています~/.bashrc

git() {
    cmd=$1
    shift
    extra=""

    quoted_args=""
    whitespace="[[:space:]]"
    for i in "$@"
    do
        if [[ $i =~ $whitespace ]]
        then
            i=\"$i\"
        fi
        quoted_args="$quoted_args $i"
    done

    cmdToRun="`which git` "$cmd" $quoted_args"
    cmdToRun=`echo $cmdToRun | sed -e 's/^ *//' -e 's/ *$//'`
    bash -c "$cmdToRun"
    # Some mad science here
}

ベストアンサー1

あなたのスクリプトは引用符を保持しません。完了後に実行される元の行は次のとおりです。

git --git-dir=.git for-each-ref '--format=%(refname:short)' refs/tags refs/heads refs/remotes

スクリプトを使用すると、次のようになります。

bash -c '/usr/bin/git --git-dir=.git for-each-ref --format=%(refname:short) refs/tags refs/heads refs/remotes'

次のような不足している引用符を参照してください。

--format=%(refname:short)

実際に何をしているのか見たことはありませんが、

quoted_args="$quoted_args \"$i\""
#                         |  |
#                         +--+------- Extra quotes.

これにより、次のような結果が生成されます。

bash -c '/usr/bin/git --git-dir=.git "for-each-ref" "--format=%(refname:short)" "refs/tags" "refs/heads" "refs/remotes"'

または:

quoted_args="$quoted_args '$i'"
#                         |  |
#                         +--+------- Extra quotes.

bash -c '/usr/bin/git --git-dir=.git '\''for-each-ref'\'' '\''--format=%(refname:short)'\'' '\''refs/tags'\'' '\''refs/heads'\'' '\''refs/remotes'\'''

%qフォーマットを確認したい場合がありますprintf

おすすめ記事