2012-09-17 233 views
37

有沒有辦法顯示由給定模式過濾的git-diff。如何grep 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} " 

但很想發現,有是這個命令。

+2

很顯然github項目名爲git-diff-grep做了一些完全不同的事情。 – Kuba

回答

55

不確定,但不是git diff -G <regex> flag ok?

-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 -p,這將打開較少(可配置的,雖然),這反過來又可以搜索與/。還有git log -S <searchword>

+0

我熟悉那些 - 我沒有看歷史,但在當前的工作變化。 – Kuba

+0

好的,那麼可以使用相同的方法(如最後引用的那樣)。如果你想要輸出,你可以使用libgit2或gitgui/gitk來使用任何庫。 – chelmertz

9

另一種可能性是查看整個差異並使用正常的less命令(類型/然後模式)搜索輸出。

當您將less配置爲在比賽前使用--jump-target=N顯示某些行時,這非常有用。嘗試這樣的:

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

這意味着匹配應該在第10行顯示(9條示出了線的上方的情況下),其可以是足以還看到的文件名。

您也可以使用例如--jump-target=.5使它在屏幕中間定位匹配。

0

這裏是一個自定義的diff工具,它允許改變內部grepping(但不是上下文):

使用

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

該做的工作了我希望它能幫助別人:

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