zoul
zoul

Reputation: 104065

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?

Upvotes: 66

Views: 23871

Answers (4)

CB Bailey
CB Bailey

Reputation: 791691

The problem is that /bin/true will return immediately without reading its input. git diff therefore thinks, quite reasonably, that it has died prematurely.

You really want to unset the diff attribute, not set it to a bogus command. Try this in your .gitattributes:

Project.xcodeproj/* -diff

Upvotes: 106

yanjost
yanjost

Reputation: 5441

You may use an alias in your .git/config file:

[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:

cd ~/git-filter-test
git mydiff

Output:

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

Upvotes: 8

Evolve
Evolve

Reputation: 9193

Just incase someone else has the same pain we had. We wanted to exclude a file that had already been committed.

This post was way more useful: How can I work with file '.git/info/exclude' too late?

Specifically, to ignore a file, you need to actually use the command git remove. See git rm (http://www.kernel.org/pub/software/scm/git/docs/git-rm.html)

You test it by going

git rm --dry-run *.log

(if you, say, wanted to exclude all the log files)

This will output what would be excluded if you ran it.

Then you run it by going

git rm *.log

(or whatever filename path / expression you want to)

Upvotes: 2

Connor
Connor

Reputation: 640

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.

Upvotes: 8

Related Questions