26

有没有办法在匹配正则表达式的文件中添加所有大块?

我知道我可以用 / 搜索给定的块,但只能找到第一个块。我想添加所有匹配。

4

3 回答 3

14

解决方案

以下单线对我有用,其中<regex>POSIX Extended Regular Expression。这需要grepdiff但它已经包含在我的 Ubuntu 发行版中。

git diff -U1 -G<regex> --pickaxe-regex \
| grepdiff -E <regex> --output-matching=hunk \
| git apply --cached

这个怎么运作

第一行显示所有差异,其补丁文本包含匹配的添加/删除行<regex>。问题是这适用于文件级别。这意味着将包含文件中至少有一个匹配块的任何更改。

因此我们需要第二行。从它收到的所有帅哥中,grepdiff只会打印那些包含<regex>. 这里的问题是,它不仅会匹配实际更改的行,还会匹配差异上下文。这就是为什么差异上下文通过传递-U1到最小化¹ git diff

最后,第三行采用过滤后的差异并将其应用于索引,例如对其进行分级。

结论

总而言之,这意味着在某些极端情况下,这会增加超出预期的数量。但是这些可能可以通过稍微调整正则表达式来避免。

感谢@VonC 提供指向其他 SO 问题的链接。它有所有的部分,它们只需要适当地组合在一起。


¹:您也可以通过-U0完全省略上下文。虽然这完全消除了第一行中预过滤的需要,但生成的补丁将不再适用于第三行。

于 2018-09-18T21:12:05.437 回答
13

可悲的是,2011 年 7 月的补丁现在无处可去。
它会引入一个git add --hunks=magic选项。

现在,您将不得不处理:

  • 根据您的正则表达式提取补丁:请参阅“使用正则表达式过滤差异
  • git stash 你的更改
  • 应用你的补丁和git add
  • 重置您的索引并应用您的存储 ( git stash pop)

相当繁琐的过程。

于 2012-11-02T10:29:46.323 回答
7

除了@raphinesse 的答案和@rubystallion 的评论之外,除了有关如何从此处格式化它的提示之外,我还创建了一个 git 函数来使用正则表达式作为唯一输入来执行此操作。只需将其输入到您的 gitconfig 中(我使用了我的全局 gitconfig)并将其与git regexadd <regex>.

[alias]
        regexadd = "!f() { git diff -U0 \
                | grepdiff -E $1 --output-matching=hunk \
                | git apply --cached --unidiff-zero; }; f"

于 2020-08-26T08:34:49.723 回答