変更された行の新しいバージョンのみを取得しようとしていますが、git diffが表示する他のすべての情報は取得していません。
ために:
git diff HEAD --no-ext-diff --unified=0 --exit-code -a --no-prefix
それが示している:
diff --git file1 file2
index d9db605..a884b50 100644
--- file1
+++ file2
@@ -16 +16 @@ bla bla bla
-old text
+new text
私が見たいのは、
new text
出来ますか?
追加された行だけがすべての場合に意味をなすわけではありません。テキストのブロックを置き換えて、たまたまそこにあった1行を含めた場合、gitは一致して推測する必要があります。 -通常、git diff
の出力は、後でpatch
の入力として使用できるため、意味があります。 gitが推測しなければならない場合があるため、追加された行だけが正確に定義されていません。
それでもそれが必要な場合は、先頭の+
記号だけを信頼することはできません。緑の線をすべてフィルタリングする方が良いでしょう:
git diff --color=always|Perl -wlne 'print $1 if /^\e\[32m\+\e\[m\e\[32m(.*)\e\[m$/'
すべての赤い線に対して削除された線フィルターのみ:
git diff --color=always|Perl -wlne 'print $1 if /^\e\[31m-(.*)\e\[m$/'
使用できる出力のカラーコードを検査するには:
git diff --color=always|Ruby -wne 'p $_'
特にnew text
部分のみが必要な場合は、以下を使用します。
git diff HEAD --no-ext-diff --unified=0 --exit-code -a --no-prefix | egrep "^\+"
これは基本的にはコードであり、正規表現を使用してegrep
コマンドにパイプされます。正規表現は、プラス記号で始まる行のみをフィルタリングします。
以下を使用できます。
git diff -U0 <commit-hash> | grep "^\+\""
これはあなたの出力を「+新しいテキスト」として与えます
これがgrep
を使った答えです。読みやすいように、元の赤/緑の色を保持します。構文にいくつかのバリエーションを提供しました:
git diff --color | grep --color=never $'^\e\[3[12]m'
git diff --color | grep --color=never $'^\033\[3[12]m'
git diff --color | grep --color=never -P '^\e\[3[12]m'
git diff --color | grep --color=never -P '^\033\[3[12]m'
説明:
git diff --color
は、gitがパイピング時に色を無効にしないようにするために必要です。grep --color=never
は、grepが一致した文字列を強調表示しないようにします(元のコマンドから元の色が削除されます)。\e[31m
)または緑(\e[32m
)のエスケープコードで始まる行に一致します。$'...'
(ANSI-C引用構文)または-P
(Perl構文)は、grep
に\e
または\033
をESC
文字。