Unix & Linux
zsh git diff
Updated Sun, 07 Aug 2022 10:09:36 GMT

git diff: ignore comments


When using git diff, how can I ignore changes which start with # ? For normal diff command, I would use something like:

diff <(grep -v '^#' file1) <(grep -v '^#' file2)

But none of the suggested solutions below work!

Is there really no way to see git diff with comments omitted?

UPDATE:

I tries this in my .gitconfig:

[pager]
    cdiff = diff-highlight
[alias] 
    cdiff = "diff -w --ignore-blank-lines -I'^#'"

When I do git cdiff, I get this error:

error: invalid option: -I^#

UPDATE2:

this is so frustrating. The syntax git diff -G'^[^#]' does not work reliably. Example:

$ cat 1.txt
aaa
bbb
ccc
ddd
eee
fff
ggg
hhh
iii
jjj

initialize new git repo:

$ git init && git add . && git commit -m "initial commit" -a

add only comment on top of file:

$ cat 1.txt
# comment
aaa
bbb
ccc
ddd
eee
fff
ggg
hhh
iii
jjj

so far, it works as expected. git diff -G'^[^#]' does not show the comment as change. But if I add a real change at the last line, and then do git diff -G'^[^#]' again, it then shows the added last line (as it should), but also the first line comment which it did not show before.

So basically, as soon as I add any non-comment change, git shows everything, even comments.




Solution

Its possible to do this by filtering all files before diffing them.

First, write a small helper, and call it stripcomments (executable, somewhere on your PATH):

#!/bin/sh -
exec grep -ve '^#' -- "$@"

Then configure a git diff mode using this helper:

git config diff.nocomments.textconv stripcomments

(this will configure the current repository).

Finally, set git attributes to have this helper used on all files:

echo '* diff=nocomments' >> .gitattributes

(in the top directory of your repository).

git diff will now ignore any lines starting with #. Note that this will affect line numbering.

If you want this as an alias, rather than overriding all uses of git diff, skip the git config command above and create your alias as follows:

git config alias.cdiff '-c diff.nocomments.textconv=stripcomments diff'

Now git cdiff will run git diff with # comments stripped out.

You can configure all this globally, rather than for each repository, by using git config --global and storing attributes in $XDG_CONFIG_HOME/git/attributes (~/.config/git/attributes) instead of .gitattributes.

See man gitattributes and man git-config for details.







External Links

External links referenced by this document: