我有一个巨大的补丁,我想将它分成多个逻辑 git 提交。大量更改只是更改变量名称或函数调用,以便可以使用 grep 轻松定位它们。如果我可以将与正则表达式匹配的任何更改添加到索引中,然后在 git gui 中进行清理,它将为我节省大量的手动工作。有没有一种好方法可以使用 git 中的正则表达式或 grep 的某些输出(例如行号)逐行更新索引?
我发现了一个类似的问题,但我不确定如何从正则表达式搜索构建临时文件。
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
我-U0
在 diff 上使用以避免获得不相关的更改。您可能需要调整此值以适应您的情况。
更简单地说,您可以使用git add -p
并利用该/
选项在您的差异中搜索要添加的补丁。它不是完全自动化的,但比我发现的其他替代方案更容易。
你可以先运行:
git status | \grep "your_pattern"
如果输出符合预期,则将文件添加到索引中:
git add $(git status | \grep "your_pattern")
我现在正在 Windows 上使用 Git-Bash,我遇到了类似的问题:我不需要从“未暂存的提交文件列表”中添加一些文件:
$ git status
On branch Bug_#292400_buggy
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: the/path/to/the/file333.NO
modified: the/path/to/the/file334.NO
modified: the/path/to/the/file1.ok
modified: the/path/to/the/file2.ok
modified: the/path/to/the/file3.ok
modified: the/path/to/the/file4.ok
....................................
modified: the/path/to/the/file666.ok
首先,我检查了文件选择是否是我想要的:
$ git status | grep ok
modified: the/path/to/the/file1.ok
modified: the/path/to/the/file2.ok
modified: the/path/to/the/file3.ok
modified: the/path/to/the/file4.ok
....................................
modified: the/path/to/the/file666.ok
我尝试了这个 dorum 中描述的一个想法,以便使用 git 添加相同的文件列表,如下所示:
$ git add $(git status | \grep "your_pattern")
但这对我不起作用(记住:Windows10 上的 Git-Bash)
至少,我直接尝试了,效果很好:
$ git add *ok
$ git status
On branch Bug_#292400_buggy
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: the/path/to/the/file1.ok
modified: the/path/to/the/file2.ok
modified: the/path/to/the/file3.ok
modified: the/path/to/the/file4.ok
....................................
modified: the/path/to/the/file666.ok
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: the/path/to/the/file333.NO
modified: the/path/to/the/file334.NO
准备提交,所以。
xargs 是您正在寻找的。尝试这个:
grep -irl 'regex_term_to_find' * | xargs -I FILE git add FILE
由管道决定的|
是用于搜索所有文件的标准 grep 命令*
。选项是:
i
- 不区分大小写r
- 通过目录递归l
- 仅列出文件名xargs
语句的一部分FILE
是用于 grep 命令传递的每个参数/匹配的变量的名称。然后在适当的地方使用变量输入所需的命令。