変更された行(色)のみを表示する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
。