【问题标题】:How do I use git diff -G?如何使用 git diff -G?
【发布时间】:2011-07-02 14:43:54
【问题描述】:

我正在编写一个小测试套件,该套件运行该工具以对一堆输入文件进行测试。对于每个输入文件,该工具正在创建一个相应的输出文件(两者都是 XML 格式)。输入和输出文件在 Git 存储库中签入。

输出文件带有编译工具的时间,所以输出文件在被测试工具重新创建后肯定会被修改。

为了快速了解输出是否已更改(当我修改工具的源代码时),我想检查节点 OutputFingerprint 的内容是否已更改(对相关内容的简单哈希部分输出文件)。

阅读git-diff的手册,我发现有一个-G选项:

-G
查找添加或删除的行与给定 匹配的差异。

不幸的是,它们没有提供如何使用-G 选项的示例。

我的第一个想法是简单地写

git diff -GOutputFingerprint

但那是错误的:

> git diff -GOutputFingerprint
error: invalid option: -GOutputFingerprint

接下来的想法是将正则表达式放在斜杠中,这也不成功:

> git diff -G/OutputFingerprint/
error: invalid option: -GC:/Program Files/Git/OutputFingerprint/

另外,简单地在-GOutputFingerprint 之间放置一个空格是行不通的:

> git diff -G OutputFingerprint
fatal: ambiguous argument 'OutputFingerprint': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions

当我在没有任何参数的情况下调用git diff 时,我得到了修改:

-    <OutputFingerprint>e45807ca76fc5bb78e9e928c6fb7eed6</OutputFingerprint>
+    <OutputFingerprint>d0846851bc9d52b37f7919def78660a2</OutputFingerprint>

另一个想法是使用git diff -S".*OutputFingerprint.*" --pickaxe-regex,但这也不成功。

git --version 给我git version 1.7.3.1.msysgit.0 如果这是相关的。

当我询问git diff --help 时,提供的手册显示-G 选项。

那么,谁能给我一个如何正确使用git diff -G 的例子?

【问题讨论】:

  • 尝试在G 和正则表达式之间添加一个空格?
  • 嘿,我的 git 1.7.1 没有 -G 选项——我想知道你的是否有 -G 支持?您可能需要更新的版本来支持您想做的事情。
  • 只是为了确保是否有实际的更改需要报告?如果没有未提交的更改,即使没有-G,我也会遇到“未知修订”之类的错误...只需确保在尝试过滤之前获得某种类型的差异。
  • 语法 git diff -G OutputFingerprint 在 MacOSX 上为我工作,git 版本 1.7.4.1。

标签: git msysgit git-diff


【解决方案1】:
git diff -Garegex

在 msysgit 1.7.4 上运行良好,但仅在 bash 会话中(在 DOS 会话中,它不返回任何内容)

如果正则表达式与暂存版本中添加删除的行匹配,它将显示diff
添加已删除未更改
在你的情况下,它不起作用

OP eckes 报告它有效(仅适用于 msysgit1.7.4+),并补充说 diff man page for -G 选项包括:

"查找添加删除行与给定正则表达式匹配的差异",
这与差异输出有关将更改的行打印为添加的行和删除的行


示例:我添加了一个新行“aaa”(没有git add:只是一个简单的编辑)

$ git diff -Gaaa

diff --git a/conf/fragments/xxx_repos.conf b/conf/fragments/xxx_repos.coindex 263fa85..3475f9b 100644
--- a/conf/fragments/xxx_repos.conf
+++ b/conf/fragments/xxx_repos.conf
@@ -10,3 +10,4 @@ repo xxx-sdsfwk
     RW+                                = vonc user1 user2
     RW                                 = @xxx_users
 xxx-sdsfwk "Owner" = "for..."
+aaa

请注意,对于 Git 2.33(2021 年第三季度),使用 --pickaxe-regex(通常为 -S 保留)将无法使用 -G(反正已经使用正则表达式)。

commit 5d93460commit 22233d4commit f97fe35commit fa59e7bcommit 9e20442commit a8d5eb6commit 5b0672acommit 5d35a95commit 52e011ccommit d90d441、@9876543334 @,commit 102fdd2commit a47fcbecommit d26ec88commit 188e9e2commit 7cd5d5bcommit 064952fcommit 69ae930commit c960939commit 6d0a401commit ecbff14(187654344commit ecbff14(187654344@) .
(2021 年 7 月 13 日由 Junio C Hamano -- gitster --commit 4da281e 中合并)

pickaxe:当-G--pickaxe-regex 组合时死亡

签字人:Ævar Arnfjörð Bjarmason

-G--pickaxe-regex 选项组合在一起时,我们会忽略--pickaxe-regex 选项。
让我们按照文档的建议去死吧,因为-G 始终是一个正则表达式。

--pickaxe-regex被添加到d01d8c6(“支持镐匹配正则表达式”,2006-03-29,Git v1.3.0-rc4 -- merge)时,只存在-S选项。 然后当-G 被添加到f506b8e ("git log/diff: add -G that greps in the patch text", 2010-08-23, Git v1.7.4-rc0 -- merge)对于--pickaxe-regex 进行了相应的更新,也没有添加类似这样的断言。

自从5bc3f0b ("diffcore-pickaxe doc: document -S and -G proper", 2013-05-31, Git v1.8.4-rc0 -- merge) 我们声称--pickaxe-regex 应该只能和-S一起使用,却默默容忍和-G结合,让我们去死吧。

【讨论】:

  • @eckes:我已经通过说明和示例更新了我的答案。对于更改,相信一个简单的“git diff | grep ...”就足够了;)
  • 将我指向 msysgit 1.7.4 是正确的方法! git diff -GOutputFingerprint 现在告诉我OutputFingerprint更改。正是我需要的。谢谢!
  • @VonC: 如果我不能单独使用 git 手段,回到grep 将是我的选择。但是现在,没有必要了……
  • @eckes:比我想象的还要好。很棒。
  • @VonC:我认为,当您认为您误解了文档时,它不会起作用:显然,查找添加或删除的行与给定正则表达式匹配的差异 与差异输出相关,其中更改的行打印为 addedremoved 行...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-09
  • 2013-03-02
  • 1970-01-01
  • 1970-01-01
  • 2011-01-12
  • 1970-01-01
相关资源
最近更新 更多