I am trying to exclude a file (db/irrelevant.php
) from a Git diff. I have tried putting a file in the db
subdirectory called .gitattributes
with the line irrelevant.php -diff
and I have also tried creating a file called .git/info/attributes
containing db/irrelevant.php
.
In all cases, the db/irrelevant.php
file is included in the diff as a Git binary patch. What I want is for the changes to that file to be ignore by the diff command. What am I doing wrong?
Omg, drivers and awk to exclude a lousy file ? Since git 1.9 something you can:
git diff -- . ':(exclude)db/irrelevant.php' ':(exclude)db/irrelevant2.php'
Ah, elegance! See the quoted answer and for details this answer by @torek
You could set up a custom diff driver with a no op command and assign it to those files that should be ignored.
Create a repository specific diff driver with this command
git config diff.nodiff.command /bin/true
or for all your repos with --global
.
(If /bin/true
doesn't exist in MacOS, alternatives would be using /usr/bin/true
or echo
).
Then, assign the new diff driver to those files you want ignored in your .git/info/attributes
file.
irrelevant.php diff=nodiff
If this state is supposed to be shared with other developers you could use .gitattributes
instead of .git/info/attributes
and share the git config
command with your peers (through a documentation file or something).
You can also use filterdiff program of the patchutils program collection to exclude some parts of a diff. For example:
git diff | filterdiff -p 1 -x db/irrelevant.php
This method is shorter than the accepted answers.
git diff 987200fbfb 878cee40ba --stat -- ':!*.cs'
For more information about the different inclusion/exclusion possibilities read this other post
This one-line solution requires no other utils/downloads:
git diff `git status -s |grep -v ^\ D |grep -v file/to/exclude.txt |cut -b4-`
Where file/to/exclude.txt
is the name of the file you would like to exclude, of course.
Edit: credit ksenzee for fixing deleted files breaking the diff.
Really good answer from KurzedMetal for what I needed to do, which was ability to see that the file has changed, but not to generate the diff, which could have been huge, in my case.
But a colleague of mine suggested approach that was even simpler and worked for me:
adding .gitattributes
file in the directory where the file to be ignored by git diff
resides with the following content:
file-not-to-diff.bin -diff
That still lets git status
"see" if the file changed. git diff
will also "see" that the file changed, but it will not generate the diff
.
That .bin
extension for the file in the example was deliberate. I do realize that this is the default behavior of git for binary files, and it does not require special handling with .gitattributes
. But in my case, these files were recognized as text files by git and "file" utility and this did the trick.
similar to Ben Roux's solution, but sharing anyway:
git status --porcelain | grep -v $PATTERN_TO_EXCLUDE | awk '{print $2}' | xargs git diff
or, if the changes have already be committed locally:
git diff --name-only origin/master | grep -v $PATTERN_TO_EXCLUDE | xargs git diff origin/master
Examples:
git status --porcelain | grep -v docs | awk '{print $2}' | xargs git diff origin/master
git diff --name-only origin/master | grep -v docs | xargs git diff origin/master
It's very simple, you can exclude what you want using standard unix commands, those commands are available under git bash even under windows environment. Below example shows how to exclude diff for pom.xml files, first check diff to master only for filenames, then using 'grep -v' exclude files which you don't want and then run again diff to master with prepapred list:
git diff master `git diff --name-only master | grep -v pom.xml`
I do the following:
git add *pattern_to_exclude*
git diff
git reset HEAD .
I know it's not an elegant solution and it sometimes canot be used (eg. if you already have stuff staged) , but it does the trick without having to type a complicated command
If you want to do this only to visually inspect the diff, a visual diff tool (like Meld) will let you do it with a short command that's easy to remember.
First, set up a diff tool if you haven't already.
$ git config --global diff.tool = meld
Then, you can run a directory diff.
$ git difftool --dir-diff
You'll be able to browse diffs (by file) in Meld (or your tool of choice). Simply don't open the file you want to ignore.
来源:https://stackoverflow.com/questions/10415100/want-to-exclude-file-from-git-diff