git diffをgrepする方法は?


81

特定のパターンでフィルタリングされたgit-diffを表示する方法はありますか?

何かのようなもの

git grepdiff pattern

changed file
+++ some sentence with pattern
changed file 2
--- some other pattern

残念ながら、最も単純な解決策では十分ではありません

git diff | grep pattern 

+++ some sentence with pattern
--- some other pattern
# not an option as doesn't put the filename close to the match

awkを使用した回避策が付属しています

git diff | awk "/\+\+\+/{f = \$2}; /PATTERN/ {print f \$0} "

しかし、これにはコマンドがあることを知りたいと思います。


3
どうやらgit-diff-grepという名前のgithubプロジェクトは完全に異なることをします。
クバ2012

回答:


99

わかりませんが、git diff -G <regex>フラグはOKではありませんか?

-G <正規表現>

Look for differences whose added or removed line matches the given <regex>.

15
それは私が探しているものではありません。パターンに一致する行だけを表示したいので、パターンの変更を含むファイルの差分全体ではありません
Kuba

それなら、あなたのような簡単な解決策はないと思います
CharlesB 2012

少なくともgitdiff -Gは、完全なgitdiffよりも優れた最初のステップです。
クバ2012

1
私のバージョンには-Gフラグがありません。削除されましたか?
RedX 2014年

3
また、正規表現による影響を受けたどのファイルを参照するのに便利:git diff -G <regex> --raw
ラマン


11

もう1つの可能性は、差分全体を表示し、通常のlessコマンド(タイプ/してからパターン)を使用して出力を検索することです。

lessを使用して試合前にいくつかの行を表示するように構成した場合--jump-target=N、これは非常に便利です。このように試してください:

PAGER="/usr/bin/less --jump-target=10" git diff

これは、一致が10行目(上記の9行のコンテキストを示している)に表示される必要があることを意味します。これは、ファイル名も表示するのに十分な場合があります。

たとえば--jump-target=.5、画面の中央にマッチを配置するために使用することもできます。


3

私はを使用しますがgit log -p、これは開きにくく(構成可能ですが)、これをで検索できます/。もありgit log -S <searchword>ます。


私はそれらに精通しています-私は歴史ではなく、現在の作業の変化を見ています。
クバ2012

了解しました。同じ方法(ロビンストが引用したもの)を使用できます。出力が必要な場合は、libgit2またはgitgui / gitkを使用する任意のライブラリを使用できます。
chelmertz 2012

1

これは私のために仕事をしました、私はそれが誰かを助けることを願っています:

git diff | grep  -P '^\+|^\-'

1

「grep」diff出力へのアプローチが最善の回避策だと思います。

sedを使用して、awkスクリプトを改善できます。

colored="(^[\[[0-9;]*[a-zA-Z])"
marker="^$colored+diff"
pattern="^$colored+.*(\+|\-).*PATTERN"
git diff --color | sed -rn -e "/$marker/! H; /$marker/ ba; $ ba; b; :a; x; /$pattern/ p"
  • colored:端末の色付きの線に一致する正規表現
  • marker:異なるdiffハンクからの分割に一致するマーカー、色付きの「diff」で始まる行
  • pattern:検索するパターン、色付きの「+」または「-」で始まり、「PATTERN」を含む行

これにより、PATTERNが追加または削除された完全な差分ハンクが印刷され、有用なカラー出力も維持されます。

^[incoloredは実際の文字通りである必要があることに注意してください^[Ctrl+ VCtrl+を押すと、bashで入力できます。[


優秀な!!bashシェル以外の場所でこれを入力しようとしている人(IDEで.shファイルを編集する^[など)の場合は、同様のものを置き換える必要がcolored=$'(\e\[[0-9;]*[a-zA-Z])'あり、macOSでもbrew install gnu-sed置き換える必要がありますsed --> gsed
Anentropic

0

これは、変更内のgrepを可能にするカスタムdiffツールです(コンテキストは許可しません)。

使用法

GIT_EXTERNAL_DIFF="mydiff --grep foo" git diff

これにより、以下を含む変更の行が出力されます(変更のために消えたfoo行を含むfoo)。の代わりに任意のgrepパターンを使用できますfoo

各出力行は、次のプレフィックスで始まります。

filename: oldlinenum: newlinenum|

スクリプトは--grepオプションなしで使用することもできます。その場合、上記のように完全な差分をフォーマットする(つまり完全なコンテキストを提供する)だけです。

mydiff

#!/bin/bash

my_diff()
{
    diff --old-line-format="$1"':%6dn:      |-%L'     \
         --new-line-format="$1"':      :%6dn|+%L'     \
         --unchanged-line-format="$1"':%6dn:%6dn| %L' \
         $2 $3
}

if [[ $1 == '--grep' ]]
then
    pattern="$2"
    shift 2
    my_diff "$1" "$2" "$5"|grep --color=never '^[^|]\+|[-+].\+'"$pattern"'.*'
else
    my_diff "$1" "$2" "$5"
fi

exit 0

0

Windowsの場合、簡単な解決策は次のとおりです。

git diff -U0 | findstr string

ファイル名でグループ化する場合は、これを使用します

FOR /F "usebackq delims==" %i IN (`git diff --name-only`) do git diff -U0 %~fi | findstr string

0

私はこれを非常に満足して使用しています:)

grep -ri <MY_PATTERN> $(git diff 790e26393d --name-only) 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.