使用正则表达式过滤diff

Cas*_*ash 10 regex git diff

似乎能够过滤差异非常方便,因此不会显示琐碎的变化.我想写一个正则表达式,它将在该行上运行,然后传递另一个字符串,使用捕获的参数生成规范形式.如果之前和之后的行产生相同的输出,那么它们将从diff中移除.

例如,我的工作在哪里数组访问的显著数写成一个PHP代码库my_array[my_key]时,他们应该是my_array["my_key"]防止如果问题my_key不断被定义.生成差异是有用的,其中线上的唯一变化是不添加一些引号.

我无法一次性更改它们,因为我们没有足够的资源来测试整个代码库,所以每当我对函数进行更改时都会修复它.我怎样才能做到这一点?还有其他类似的东西,我可以用来实现类似的结果.例如,一个更简单的方法可能是跳过规范形式,只看输入是否转换为输出.顺便说一句,我正在使用Git

Hau*_*eth 7

$ git diff --help

-G<regex>
    Look for differences whose added or removed line matches the given <regex>.
Run Code Online (Sandbox Code Playgroud)

编辑:

经过一些测试,我有类似的东西

git diff -b -w --word-diff-regex='.*\[[^"]*\]'
Run Code Online (Sandbox Code Playgroud)

然后我有输出像:

diff --git a/test.php b/test.php
index 62a2de0..b76891f 100644
--- a/test.php
+++ b/test.php
@@ -1,3 +1,5 @@
<?php

{+$my_array[my_key]+} = "test";

?>
diff --git a/test1.php b/test1.php
index 62a2de0..6102fed 100644
--- a/test1.php
+++ b/test1.php
@@ -1,3 +1,5 @@
<?php

some_other_stuff();

?>
Run Code Online (Sandbox Code Playgroud)

也许它会帮助你.我在这里找到了http://www.rhinocerus.net/forum/lang-lisp/659593-git-word-diff-regex-lisp-source.html并且有关于此主题的更多信息

编辑2:

git diff -G'\[[A-Za-z_]*\]' --pickaxe-regex
Run Code Online (Sandbox Code Playgroud)


Dan*_*ruz 6

Git的diff命令似乎没有任何选项来支持你想要做的事情.但是,您可以使用GIT_EXTERNAL_DIFF环境变量和自定义脚本(或使用首选脚本或编程语言创建的任何可执行文件)来操作修补程序.

我假设你在Linux上; 如果没有,你可以调整这个概念,以适应您的环境.假设你有一个Git仓库,其中HEAD有一个file05包含以下内容的文件:

line 26662: $my_array[my_key]
Run Code Online (Sandbox Code Playgroud)

并且文件file06包含:

line 19768: $my_array[my_key]
line 19769: $my_array[my_key]
line 19770: $my_array[my_key]
line 19771: $my_array[my_key]
line 19772: $my_array[my_key]
line 19773: $my_array[my_key]
line 19775: $my_array[my_key]
line 19776: $my_array[my_key]
Run Code Online (Sandbox Code Playgroud)

file05改为:

line 26662: $my_array["my_key"]
Run Code Online (Sandbox Code Playgroud)

你改成file06:

line 19768: $my_array[my_key]
line 19769: $my_array["my_key"]
line 19770: $my_array[my_key]
line 19771: $my_array[my_key]
line 19772: $my_array[my_key]
line 19773: $my_array[my_key]
line 19775: $my_array[my_key2]
line 19776: $my_array[my_key]
Run Code Online (Sandbox Code Playgroud)

使用以下shell脚本,让我们调用它mydiff.sh并将它放在我们的位置PATH:

#!/bin/bash
echo "$@"
git diff-files --patch --word-diff=porcelain "${5}" | awk '
/^-./ {rec = FNR; prev = substr($0, 2);}
FNR == rec + 1 && /^+./ {
    ln = substr($0, 2);
    gsub("\\[\"", "[", ln);
    gsub("\"\\]", "]", ln);
    if (prev == ln) {
        print " " ln;
    } else {
        print "-" prev;
        print "+" ln;
    }
}
FNR != rec && FNR != rec + 1 {print;}
'
Run Code Online (Sandbox Code Playgroud)

执行命令:

GIT_EXTERNAL_DIFF=mydiff.sh git --no-pager diff
Run Code Online (Sandbox Code Playgroud)

将输出:

file05 /tmp/r2aBca_file05 d86525edcf5ec0157366ea6c41bc6e4965b3be1e 100644 file05 0000000000000000000000000000000000000000 100644
index d86525e..c2180dc 100644
--- a/file05
+++ b/file05
@@ -1 +1 @@
 line 26662: 
 $my_array[my_key]
~
file06 /tmp/2lgz7J_file06 d84a44f9a9aac6fb82e6ffb94db0eec5c575787d 100644 file06 0000000000000000000000000000000000000000 100644
index d84a44f..bc27446 100644
--- a/file06
+++ b/file06
@@ -1,8 +1,8 @@
 line 19768: $my_array[my_key]
~
 line 19769: 
 $my_array[my_key]
~
 line 19770: $my_array[my_key]
~
 line 19771: $my_array[my_key]
~
 line 19772: $my_array[my_key]
~
 line 19773: $my_array[my_key]
~
 line 19775: 
-$my_array[my_key]
+$my_array[my_key2]
~
 line 19776: $my_array[my_key]
~
Run Code Online (Sandbox Code Playgroud)

该输出不显示在加引号的变化file05file06.外部diff脚本基本上使用Git diff-files命令来创建补丁,并通过GNUawk脚本过滤输出来操作它.此示例脚本不处理提及的旧文件和新文件的所有不同组合,GIT_EXTERNAL_DIFF也不输出有效的修补程序,但它应该足以让您入门.

你可以使用Perl正则表达式,Pythondifflib或任何你熟悉的东西来实现一个适合你需要的外部差异工具.


Pau*_*icz 5

来自我自己的 git --help

--word-diff-regex=<regex>

使用<regex>来决定一个词是什么,而不是考虑非空白的运行是一个字。也暗示 --word-diff 除非它已经启用。的每个非重叠匹配项都<regex>被视为一个单词。这些匹配项之间的任何内容都被视为空格并被忽略(!)以查找差异。您可能希望附加|[^[:space:]]到您的正则表达式以确保它匹配所有非空白字符。包含换行符的匹配在换行符处被静默截断(!)。也可以通过差异驱动程序或配置选项设置正则表达式,请参阅 gitattributes(1) 或 git-config(1)。明确提供它会覆盖任何差异驱动程序或配置设置。差异驱动程序覆盖配置设置。


Nag*_*ran 5

grepdiff可用于过滤diff文件中的块。

$ git diff -U1 | grepdiff 'console' --output-matching=hunk
Run Code Online (Sandbox Code Playgroud)

它仅显示与给定字符串“ console”匹配的块。