Git通过grep/regex添加行索引

Faz*_*ton 17 regex git git-add

我有一个巨大的补丁,我想打破多个逻辑git提交.大量的更改只是更改变量名称或函数调用,以便可以使用grep轻松定位它们.如果我可以向索引添加任何与正则表达式相匹配的更改然后在git gui中清理,它将为我节省大量的手动工作.是否有一种很好的方法可以在git中使用正则表达式或从grep的某些输出(例如行号)逐行更新索引?

我发现了一个类似的问题,但我不确定如何从正则表达式搜索构建临时文件.

Gar*_*rwe 18

patchutils有一个grepdiff可用于实现此目的的命令.

# check that the regex search correctly matches the changes you want.
git diff -U0 | grepdiff 'regex search' --output-matching=hunk  

# then apply the changes to the index
git diff -U0 | grepdiff 'regex search' --output-matching=hunk | git apply --cached --unidiff-zero 
Run Code Online (Sandbox Code Playgroud)

-U0在diff上使用以避免获得无关的更改.您可能希望调整此值以适应您的情况.

  • 这对我来说效果很好,但请注意,如果您修改了与正则表达式不匹配的相邻行,`hunk` 并不能真正提供足够的粒度。 (3认同)

小智 5

更简单地说,您可以使用git add -p并利用该/选项来搜索差异以查找要添加的补丁。它不是完全自动化的,但它比我发现的其他替代方案更容易。


RDL*_*RDL -1

xargs 就是您要寻找的。尝试这个:

grep -irl 'regex_term_to_find' * | xargs -I FILE git add FILE
Run Code Online (Sandbox Code Playgroud)

管道上方|是用于搜索所有文件的标准 grep 命令*。选项有:

  • i- 不区分大小写
  • r- 递归遍历目录
  • l- 仅列出文件名

xargs语句的一部分是FILE用于 grep 命令传递的每个参数/匹配的变量名称。然后在适当的情况下使用变量输入所需的命令。

  • 谢谢,但我只想添加文件的一部分,而不是整个文件。 (10认同)