この引用されたgitエイリアスを機能させるにはどうすればよいですか?

この引用されたgitエイリアスを機能させるにはどうすればよいですか?

変更された行(色)のみを表示するgit diffエイリアスを作成したいと思います。

[alias]
    mdiff = diff --color | grep --color=never $'^\e\[3[12]m'

明らかに、パイプはgitエイリアスでは利用できないので動作しませんが、この答えは解決策を示しています:

[alias]
    mdiff = ! git diff --color | grep --color=never $'^\e\[3[12]m'

ただし、この方法も機能せず、次のエラーが発生します。fatal: bad config line 17 in file /home/me/.config/git/config

この回答の下のコメントは、問題が引用符によるものであることを示しています。

ベストアンサー1

!Git自体で実行されるGitエイリアスはありません。エイリアスに文字が含まれている場合、|これはただ1つの|文字です。ケーシングは含まれていないので、|配管は意味がありません。

次に始まる Git エイリアスは!シェルで実行されます。 Gitは(一部の引用の解析を実行した後)シェルで次のエントリを実行して、!最後に引数を渡します。 2回目の試みは機能しません。なぜなら、Gitはバックスラッシュを解析し、それを2倍にしなければなら[ないのです。\\[\[

mdiff = ! git diff --color | grep --color=never $'\\e\\\\[3[12]m'

しかし、これはgit mdiff fooシェルコマンドを実行するのと同じであるため、間違っています。

git diff --color | grep --color=never $'\\e\\\\[3[12]m' foo

gitに渡されるパラメータを準備する必要があります。関数を定義して実行します。;引用が必要なので注意が必要です。これはGit側で動作します。

mdiff = ! "f () { git diff --color \"$@\" | grep --color=never $'\\e\\\\[3[12]m'; }; f"

しかし、これは/bin/shダッシュではなくbashでのみ機能します。ダッシュは$'…'エスケープ構文をサポートしていません。/bin/shダッシュの場合は、エスケープ文字を生成する必要がありますprintf

mdiff = ! "f () { git diff --color \"$@\" | grep --color=never $(printf '\\033\\\\[3[12]'); }; f"

コンテキストだけを削除したいが、ファイル名と場所の表示は維持したい場合は組み込み:git diff -U0

おすすめ記事