在git中添加补丁,所有帅哥都在文件中匹配正则表达式

Mar*_*sen 17 git

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

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

Von*_*onC 10

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

现在,您将需要:

相当繁琐的过程.


rap*_*sse 6

解决方案

以下一线为我工作的<regex>POSIX扩展正则表达式。这需要grepdiff,但它已经包含在我的Ubuntu发行版中。

git diff -U1 -G<regex> --pickaxe-regex \
| grepdiff -E <regex> --output-matching=hunk \
| git apply --cached
Run Code Online (Sandbox Code Playgroud)

怎么运行的

第一行显示了所有差异,它们的补丁程序文本包含与之匹配的已添加/已移除的行<regex>。问题是,这可以在文件级别进行。这意味着文件中至少包含一个匹配块的更改将被包括在内。

因此,我们需要第二行。从收到的所有grepdiff请求中,只会打印出包含匹配项的请求<regex>。这里的问题是,它不仅会匹配实际更改的行,而且还会匹配diff上下文。这就是为什么差异背景下是通过传递minimized¹ -U1git diff

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

结论

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

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


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

  • 您可以使用`git apply --cached --unidiff-zero`来应用带有零行上下文的补丁,也可以省略`-G&lt;regex&gt; --pickaxe-regex`,但由于grepdiff不区分在添加和删除之间,使用 Python 的 difflib 或 unidiff 库可能更安全。 (3认同)
  • 对于那些还没有安装 grepdiff 的人来说,它是 [patchutils](https://github.com/twaugh/patchutils) 包的一部分。 (2认同)

top*_*217 6

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

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

Run Code Online (Sandbox Code Playgroud)