Исключение файлов из git -diff

Я отслеживаю проект с помощью git. В рабочей копии есть некоторые файлы проекта Xcode, которые я хочу отслеживать, но не хочу видеть в diff, потому что всегда есть десятки измененных строк, которые меня никогда не интересуют. Есть ли простой способ иметь git-diff пропустить эти файлы? Ive попытался настроить собственный "бесшумный" инструмент diff:

$ cat .gitattributes 
Project.xcodeproj/* diff=nodiff

$ cat ~/.gitconfig 
[diff "nodiff"]
    command = /bin/true

Но:

$ git diff
external diff died, stopping at Project.xcodeproj/zoul.mode1v3.

Что я делаю неправильно?

Ответ 1

Проблема заключается в том, что /bin/true будет немедленно возвращаться без чтения его ввода. git diff поэтому считает вполне разумным, что он умер преждевременно.

Что вы действительно хотите сделать, так это отключить атрибут diff, а не задавать его поддельной командой. Попробуйте это в .gitattributes:

Project.xcodeproj/* -diff

Ответ 2

Другое решение, которое производит чистый вывод без каких-либо внешних инструментов (добавьте к .git/config):

[alias]
    mydiff = !git diff -- $(git diff --name-only | grep -Ev "Project.xcodeproj/")

Затем запустите его с помощью

git mydiff

Обратите внимание, что git diff --name-only лучше, чем git ls-files, потому что он будет передавать более короткий список файлов на git diff, так как будут включены только файлы, которые были изменены. У меня возникли проблемы с превышением максимального количества аргументов в больших проектах при использовании git ls-files.

Ответ 3

Вы можете использовать псевдоним в своем .git/config

[alias]
        mydiff = !git diff | filterdiff -x "*/Project.xcodeproj/*"

Вам нужен filterdiff (от patchutils) для этого трюка.

sudo apt-get install patchutils

Тем не менее diff не идеален, он оставляет мусор:

[email protected]:~/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

Ответ 4

Просто у кого-то другого есть такая же боль. Мы хотели исключить файл, который уже был зафиксирован.

Этот пост был более полезным: работает с .git/info/exclude слишком поздно

В частности, что вам нужно игнорировать файл, на самом деле использовать команду git remove См. git rm (http://www.kernel.org/pub/software/scm/git/docs/git-rm.html)

вы проверяете его, перейдя

git rm --dry-run *.log
(если вы хотите исключить все файлы журнала)

будет выводиться то, что было бы исключено, если вы его запустили.

затем

вы запустите его, перейдя

git rm *.log
(или любой путь/выражение имени файла, которое вы хотите)