2012-09-17 21 views
37

与えられたパターンでフィルタリングされたgit-diffを表示する方法はありますか?git diffをgrepするには?

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} " 

を使用してこの問題を回避してきた。しかしそこにいることを知るのが大好きですこれのためのコマンドです。

+2

明らかにgit-diff-grepという名前のgithubプロジェクトは、まったく別のことをしています。 – Kuba

答えて

55

わからないが、git diff -G <regex>フラグOK?私は順番に/を用いて検索することができる(ただし、設定可能)以下を開くgit log -pを、使用

-G <正規表現>

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

これは私が探しているものではなく、パターンと一致する線のみを表示したいからです。パターンの変更を含むファイルの差分ではありません。 – Kuba

+0

あなたのシンプルな解決策はありません。 – CharlesB

+0

少なくともgit diff -Gは完全なgit diffより良い最初のステップです。 – Kuba

3

git log -S <searchword>もあります。

+0

私はそれらをよく知っています。私は履歴を見ていないのですが、現在の作業の変更点です。 – Kuba

+0

さて、同じ方法(引用符で囲まれたrobinst)を使うことができました。出力が必要な場合は、おそらくlibgit2またはgitgui/gitkを使用して任意のライブラリを使用できます。 – chelmertz

7

git diff -S<string>またはgit diff -G".*string.*"を試しましたか?それらが同等ではないことに注意してください.Sが何をするかについてはthe documentation about pickaxeを参照してください。

9

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

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

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

これはマッチライン10上に示されるべきであることを意味する(番組上記コンテキストの9行)また、ファイル名を参照するのに十分であってもよいです。

たとえば、 --jump-target=.5を使用して、画面の中央に一致するようにします。ここで

0

変更(ただし、文脈)の内側にgrepを可能にするカスタム差分ツールです:

使用

GIT_EXTERNAL_DIFF="mydiff --grep foo" git diff

この意志出力fooが含まれている変更でこれらの行(あなたの変更のためにfooが消えた行を含む)。 fooの代わりに任意のgrepパターンを使用できます。

各出力ラインは、次のプレフィックスで開始:

filename: oldlinenum: newlinenum| 

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

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

、簡単な解決策は以下のとおりです。

git diff -U0 | findstr string 

ファイル名でグループ化したい場合は、これがために仕事をしたこの

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

を使用私は誰かを助けることを願っています:

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