Git通过grep / regex添加行索引

时间:2013-03-05 21:30:24

标签: regex git git-add

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

我找到a similar question,但我不确定如何从正则表达式搜索构建临时文件。

5 个答案:

答案 0 :(得分:17)

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以避免获得无关的更改。您可能需要调整此值以适应您的情况。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

您可以先运行:

git status | \grep "your_pattern"

如果输出符合预期,则将文件添加到索引:

git add $(git status | \grep "your_pattern")

答案 3 :(得分:0)

我现在正在通过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

随时可以提交。

答案 4 :(得分:-1)

xargs就是你要找的东西。试试这个:

grep -irl 'regex_term_to_find' * | xargs -I FILE git add FILE

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

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

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