Excluding files from git-diff
I am tracking a project with git. There are some Xcode project files in the working copy that I want to keep tracking, but do not want to see in diffs, because there are always dozens of changed lines that I am never interested in. Is there a simple way to have git-diff
skip these files? I’ve tried to set up a custom “silent” diff tool:
$ cat .gitattributes Project.xcodeproj/* diff=nodiff $ cat ~/.gitconfig [diff "nodiff"] command = /bin/true
But:
$ git diff external diff died, stopping at Project.xcodeproj/zoul.mode1v3.
What am I doing wrong?
The problem is that /bin/true
will return immediately without reading its input. git diff
therefore thinks, quite reasonably, that it has died prematurely.
What you really want to do is to unset the diff attribute, not set it to a bogus command. Try this in your .gitattributes
:
Project.xcodeproj/* -diff
You may use an alias in your .git/config
[alias]
mydiff = !git diff | filterdiff -x "*/Project.xcodeproj/*"
You need filterdiff (from patchutils) for this trick.
sudo apt-get install patchutils
Still the diff isn't perfect, it leaves some garbage :
yannick@yannick-desktop:~/git-filter-test$ git mydiff
diff --git a/Project.xcodeproj/dummy.txt b/Project.xcodeproj/dummy.txt
index 3e1f9e6..89dfed9 100644
diff --git a/dummy2.txt b/dummy2.txt
index 91966ce..d9588a9 100644
--- a/titi.txt
+++ b/titi.txt
@@ -1,3 +1,3 @@
aaaaaaaaaa
-bbbbbbbbb
cccccc
+ddd
Another solution that produces clean output without any external tools (add to .git/config
):
[alias]
mydiff = !git diff -- $(git diff --name-only | grep -Ev "Project.xcodeproj/")
Then run it with:
git mydiff
Note that git diff --name-only
is better than git ls-files
because it will pass a shorter list of files to git diff
, since only files that are modified will be included. I've run into trouble with exceeding the maximum number of arguments in large projects when using git ls-files
.