Add patch in git, all hunks matching regex in file

前端 未结 3 548
花落未央
花落未央 2021-02-04 01:46

Is there a way to add all hunks in a file matching a regex?

I know I can search for a given hunk with /, but that only finds the first. I want to add all matching.

3条回答
  •  醉话见心
    2021-02-04 02:19

    The Solution

    The following one-liner worked for me where is a POSIX Extended Regular Expression. This requires grepdiff but it was already included in my Ubuntu distribution.

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

    How it works

    The first line shows all differences whose patch text contains added/removed lines that match . The problem is that this works on a file-level. That means that any changes in a file with at least one matching hunk will be included.

    Thus we need line two. From all the hunks it receives grepdiff will only print those that include a match for . the problem here is, that it will not only match the lines that have actually been changed, but also the diff context. That's why the diff context is minimized¹ by passing -U1 to git diff.

    Finally line three takes the filtered diff and applies it to the index, e.g. stages it.

    Conclusion

    All in all this means that there are edge cases where this will add more than desired. But those can probably avoided by tweaking the regex a bit.

    Thanks to @VonC for providing the link to that other SO question. It had all the pieces, they just had to be put together appropriately.


    ¹: You can also pass -U0 to omit the context altogether. While that completely removes the need for the pre-filtering in line one, the resulting patch won't apply anymore in line three.

提交回复
热议问题