git diff:忽略删除或插入某些正则表达式

时间:2017-07-26 13:35:22

标签: regex git diff

如果添加或删除了以下表达式,我正在尝试使用git diff查找某个文件类型的两个版本之间的差异:

  

(****)

根据K-Frame,我正在寻找参数-G。所以我尝试了以下内容:

git diff -G '\(\*\*\*\*\)' -- *.fileEnding

不幸的是它不起作用,并且还返回了文件中的所有其他差异。我对正则表达式不是很熟悉。

编辑:我认为需要对我的问题稍微具体一点:现在我有以下情况:一个文件的更改与正则表达式匹配,更改没有。在我的脚本中,我正在尝试做这样的事情(伪代码):

if((git diff -G '\(\*\*\*\*\)' -- *.fileEnding)==(git diff -- *.fileEnding)) print "Only changes in (****)";

如果某些文件只有(****)中的更改而其他文件有不同的更改,则可以正常工作。但是,如果一个文件同时存在

,它就无法正常工作

2 个答案:

答案 0 :(得分:1)

TL; DR

Git的git diff就是不这样做。

长解释

该文档具有误导性。

-G参数对git diff绝对没有任何作用。相反,-G实际上是git log(及其姐妹命令git rev-list的参数,以及调用其他命令的任何命令;但最好只用{{1}来考虑它我认为)。

git loggit diff命令共享他们的一些文档(足够合理 - 他们共享一些代码,特别是差异生成代码{{1}用于比较任何一个提交到其父())。

git log选择提交时,您可以告诉它选择一些特定的提交(在已由修订说明符进行的选择中)。 git log参数就是一个这样的选择器,就像非常相似的git log参数一样。默认情况下,-G采用字符串而不是正则表达式;但您可以添加-S以使-S采用正则表达式。文档有一个示例,该示例直接引用--pickaxe-regex

  

-G<正则表达式>

     

查找补丁文本包含添加/删除行的差异   匹配< regex>。

     

说明-S和之间的区别   git log,考虑在同一个文件中使用以下差异进行提交:

-S<regex> --pickaxe-regex
     

-G<regex>会显示此提交,但+ return !regexec(regexp, two->ptr, 1, &regmatch, 0); ... - hit = !regexec(regexp, mf2.ptr, 1, &regmatch, 0); 不会(因为该字符串的出现次数没有变化)。

While git log -G"regexec\(regexp"命令不是git log -S"regexec\(regexp" --pickaxe-regex命令。

一般情况下,git diff的工作方式是传递一个起始提交 - 例如一个哈希ID,或一个分支或标记名称 - 并且它:

  • 向您显示提交,然后
  • 显示该提交的父级,然后
  • 显示父母的父母......

依此类推,一直回到第一次提交(或者当你厌倦了寻找并退出寻呼机时)。换句话说,至少对于这些简单的情况,有一个循环:

git log

如果您添加git log,则“显示”步骤会包含while (there is a commit $commit) parent = resolve_hash_id($commit + "^") show($commit) commit = $parent 的输出。

请注意-p比较正好两个提交(嗯,有一种特殊的差异称为组合差异用于合并提交,但是{{1默认情况下不会显示它们,git diff $parent $commit的正常用法也不会显示。 git diff的两个提交是父级和子级。如果您自己运行git log,则可以选择任意两个任意提交......但是当您这样做时,git diff 会完全忽略任何git loggit diff个参数。 (可能应该抱怨他们的存在。)

git diff-G的目的是影响-S的正常行为。通常,当我们按照-G的方式按顺序查看提交时,我们对特定文件的特定更改更感兴趣< / em>(或文件集)。我们可以使用-Sgit log告诉git log生成差异,但是如果它没有更改,则根本不显示提交。< / em>这样我们只看到那些有这些变化的提交。 (添加文件名,例如-G,也会将差异限制为这些文件。与-Sgit log不同, 部分 使用git log stop..start -- path/to/file1.txt。)

你能做什么

如果您不知道自己需要哪些修订,可以使用-S(或其面向脚本的姐妹命令-G)来筛选候选人。在这里,您可以使用git diff。你现在不必得到差异,但如果你愿意,你也可以。如果git log不仅可以获得可能的候选人,而且实际上可以获得正确的候选人,那么您已经完成了,您可以在这里停止。

如果您仍然有太多的候选人并需要完全差异来进一步削减它们,那么现在可以对第一步(git rev-list-G获得的哈希ID运行-G )。对于每个提交,您必须选择将其与之进行比较的提交:可能是候选列表中的某些提交,或者可能是在此特定候选项之前或之后的提交。现在您不再拥有git diff工具:要搜索差异,您需要一些外部搜索工具,例如git log。由你来写这部分。

答案 1 :(得分:0)

公认的答案是错误的,说-Ggit diff不起作用。它绝对可以做到:

git diff -G '\(\*\*\*\*\)'

在数百个已更改的文件中,将仅返回带有(****)作为其更改之一的文件。

原始张贴者(我认为)承认了这一点,但希望不要看到同一文件中的其他更改。只需说明git diff确实有-G,并且它可以完成困难的工作(在git 2.20.1中进行了测试)。使用-G仅显示更改的文件,而使用grep仅显示那些文件中的所需部分,将产生很少的误报:

git diff -G '\(\*\*\*\*\)' -- *yml | grep -n1 '(\*\*\*\*)'

将仅显示文本(****)已更改的行,以及一些上下文(足以查看其更改内容)。

另请参阅https://stackoverflow.com/a/53471974/1028376与diff一起使用-G