似乎能够过滤差异非常方便,因此不会显示琐碎的变化.我想写一个正则表达式,它将在该行上运行,然后传递另一个字符串,使用捕获的参数生成规范形式.如果之前和之后的行产生相同的输出,那么它们将从diff中移除.
例如,我的工作在哪里数组访问的显著数写成一个PHP代码库my_array[my_key]
时,他们应该是my_array["my_key"]
防止如果问题my_key
不断被定义.生成差异是有用的,其中线上的唯一变化是不添加一些引号.
我无法一次性更改它们,因为我们没有足够的资源来测试整个代码库,所以每当我对函数进行更改时都会修复它.我怎样才能做到这一点?还有其他类似的东西,我可以用来实现类似的结果.例如,一个更简单的方法可能是跳过规范形式,只看输入是否转换为输出.顺便说一句,我正在使用Git
$ 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)
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)
该输出不显示在加引号的变化file05
和file06
.外部diff脚本基本上使用Git diff-files
命令来创建补丁,并通过GNUawk
脚本过滤输出来操作它.此示例脚本不处理提及的旧文件和新文件的所有不同组合,GIT_EXTERNAL_DIFF
也不输出有效的修补程序,但它应该足以让您入门.
你可以使用Perl正则表达式,Pythondifflib
或任何你熟悉的东西来实现一个适合你需要的外部差异工具.
来自我自己的 git --help
--word-diff-regex=
<regex>
使用
<regex>
来决定一个词是什么,而不是考虑非空白的运行是一个字。也暗示 --word-diff 除非它已经启用。的每个非重叠匹配项都<regex>
被视为一个单词。这些匹配项之间的任何内容都被视为空格并被忽略(!)以查找差异。您可能希望附加|[^[:space:]]
到您的正则表达式以确保它匹配所有非空白字符。包含换行符的匹配在换行符处被静默截断(!)。也可以通过差异驱动程序或配置选项设置正则表达式,请参阅 gitattributes(1) 或 git-config(1)。明确提供它会覆盖任何差异驱动程序或配置设置。差异驱动程序覆盖配置设置。
grepdiff可用于过滤diff文件中的块。
$ git diff -U1 | grepdiff 'console' --output-matching=hunk
Run Code Online (Sandbox Code Playgroud)
它仅显示与给定字符串“ console”匹配的块。