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

60

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

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

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

Но:

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

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

Ваш Ответ

4   ответа
7

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

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

sudo apt-get install patchutils

Тем не менее, разница не идеальна, она оставляет некоторый мусор:

[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
Ах, да, | Colordiff | меньше -р. zoul
Это очень мило, спасибо. Мусор просто отлично, по крайней мере, я знаю, что эти файлы изменились. Но я теряю окраску, есть ли способ вернуть его? Я попытался использовать git diff --color, чтобы заставить его, но затем filterdiff сбивается с толку, избегая цвета и останавливая фильтрацию. zoul
Спасибо за ответы на этот вопрос - filterdiff почти удовлетворяет мои потребности - однако & quot; мусор & quot; оставшееся вызывает у меня проблемы - есть ли способ сказать "полностью удалить все ссылки на файл"? используя filterdiff?
0

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

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

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

Вы проверяете это, идя

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

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

затем

вы запускаете это, идя

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

85

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

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

Project.xcodeproj/* -diff
Исключение всего каталога мне не помогло, потому что многие файлы находятся в более глубоких подкаталогах. Вместо этого * .xcuserstate -diff был полезен для игнорирования часто меняющегося файла.
Если вы также хотите исключить подкаталоги, сделайте этоProject.xcodeproj/**/* -diff вместо.
Я использую Git 1.9.4 и добавляю-diff теперь заставляет diff обрабатывать файлы, которые я хочу исключить, как двоичные файлы, а не игнорировать их ...
Множество похожих вопросов по SO, не смогли найти такой простой и эффективный ответ!
Конечно, просто хотел включить это, так как это может помочь любому, кто читает это, чтобы решить их ситуацию.
7

которое производит чистый вывод без каких-либо внешних инструментов (добавить в.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.

Я столкнулся с проблемами со сложными путями с этим. Я подозреваю, что было бы лучше, если бы вы использовали ключ -z: не изменяйте пути и не используйте NUL в качестве ограничителей выходного поля & quot ;.

Похожие вопросы