ignoring changes matching a string in git diff

前端 未结 4 1268
不思量自难忘°
不思量自难忘° 2020-12-08 06:53

I\'ve made a single simple change to a large number of files that are version controlled in git and I\'d like to be able to check that no other changes are slipping into thi

相关标签:
4条回答
  • 2020-12-08 07:25

    No more grep needed!

    With Git 2.30 (Q1 2021), "git diff"(man) family of commands learned the "-I<regex>" option to ignore hunks whose changed lines all match the given pattern.

    See commit 296d4a9, commit ec7967c (20 Oct 2020) by Michał Kępień (kempniu).
    (Merged by Junio C Hamano -- gitster -- in commit 1ae0949, 02 Nov 2020)

    diff: add -I<regex> that ignores matching changes

    Signed-off-by: Michał Kępień

    Add a new diff option that enables ignoring changes whose all lines (changed, removed, and added) match a given regular expression.
    This is similar to the -I/--ignore-matching-lines option in standalone diff utilities and can be used e.g. to ignore changes which only affect code comments or to look for unrelated changes in commits containing a large number of automatically applied modifications (e.g. a tree-wide string replacement).

    The difference between -G/-S and the new -I option is that the latter filters output on a per-change basis.

    Use the 'ignore' field of xdchange_t for marking a change as ignored or not.
    Since the same field is used by --ignore-blank-lines, identical hunk emitting rules apply for --ignore-blank-lines and -I.
    These two options can also be used together in the same git invocation (they are complementary to each other).

    Rename xdl_mark_ignorable() to xdl_mark_ignorable_lines(), to indicate that it is logically a "sibling" of xdl_mark_ignorable_regex() rather than its "parent".

    diff-options now includes in its man page:

    -I<regex>

    --ignore-matching-lines=<regex>

    Ignore changes whose all lines match <regex>.
    This option may be specified more than once.

    Examples:

    git diff --ignore-blank-lines -I"ten.*e" -I"^[124-9]"
    
    0 讨论(0)
  • 2020-12-08 07:30

    Use git difftool to run a real diff.

    Example: https://github.com/cben/kubernetes-discovery-samples/commit/b1e946434e73d8d1650c887f7d49b46dcbd835a6
    I've created a script running diff the way I want to (here I'm keeping curl --verbose outputs in the repo, resulting in boring changes each time I rerun the curl):

    #!/bin/bash
    diff --recursive --unified=1 --color \
         --ignore-matching-lines=serverAddress \
         --ignore-matching-lines='^\*  subject:' \
         --ignore-matching-lines='^\*  start date:' \
         --ignore-matching-lines='^\*  expire date:' \
         --ignore-matching-lines='^\*  issuer:' \
         --ignore-matching-lines='^< Date:' \
         --ignore-matching-lines='^< Content-Length:' \
         --ignore-matching-lines='--:--:--' \
         --ignore-matching-lines='{ \[[0-9]* bytes data\]' \
         "$@"
    

    And now I can run git difftool --dir-diff --extcmd=path/to/above/script.sh and see only interesting changes.

    An important caveat about GNU diff -I aka --ignore-matching-lines: this merely prevents such lines from making a chunk "intersting" but when these changes appear in same chunk with other non-ignored changes, it will still show them. I used --unified=1 above to reduce this effect by making chunks smaller (only 1 context line above and below each change).

    0 讨论(0)
  • 2020-12-08 07:31

    Try the following:

    $ git diff > full_diff.txt
    $ git diff -G "your pattern" > matching_diff.txt
    

    You can then compare the two like so:

    $ diff matching_diff.txt full_diff.txt
    

    If all changes match the pattern, full_diff.txt and matching_diff.txt will be identical, and the last diff command will not return anything.

    If there are changes that do not match the pattern, the last diff will highlight those.


    You can combine all of the above steps and avoid having to create two extra files like so:

    diff <(git diff -G "your pattern") <(git diff)  # works with other diff tools too
    
    0 讨论(0)
  • 2020-12-08 07:42

    I think that I have a different solution using pipes and grep. I had two files that needed to be checked for differences that didn't include @@ and g:, so I did this (borrowing from here and here and here:

    $ git diff -U0 --color-words --no-index file1.tex file2.tex | grep -v -e "@@" -e "g:"
    

    and that seemed to do the trick. Colors still were there.

    So I assume you could take a simpler git diff command/output and do the same thing. What I like about this is that it doesn't require making new files or redirection (other than a pipe).

    0 讨论(0)
提交回复
热议问题