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

时间:2012-11-02 09:32:50

标签: git

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

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

3 个答案:

答案 0 :(得分:10)

可悲的是,patch in July 2011目前无处可去 它会引入git add --hunks=magic选项。

目前,您必须这样做:

  • 根据您的正则表达式提取补丁:请参阅“Filtering a diff with a regular expression
  • git存储您的更改
  • 应用您的补丁和git add
  • 重置您的索引并应用您的存储空间(git stash pop

相当繁琐的过程。

答案 1 :(得分:4)

解决方案

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

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

工作原理

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

因此,我们需要第二行。它从所有请求中收到grepdiff的请求,只会打印出包含<regex>匹配项的请求。这里的问题是,它不仅会匹配实际更改的行,而且还会匹配diff上下文。这就是为什么通过将-U1传递到git diff来使diff上下文最小化的原因。

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

结论

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

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


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

答案 2 :(得分:1)

除了@raphinesse的答案和@rubystallion的评论外,除了有关如何从here对其进行格式化的提示外,我还制作了一个git函数,使用正则表达式作为唯一输入。只需将其输入到您的gitconfig中(我使用了全局gitconfig),然后将其与git regexadd <regex>一起使用即可。

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