Вопрос по git – Хотите исключить файл из «git diff»

160

Я пытаюсь исключить файл (db/irrelevant.php) из Git diff. Я пытался положить файл вdb подкаталог называется.gitattributes с линиейirrelevant.php -diff и я также попытался создать файл с именем.git/info/attributes содержащийdb/irrelevant.php.

Во всех случаяхdb/irrelevant.php Файл включен в diff как двоичный патч Git. Я хочу, чтобы изменения в этом файле игнорировались командой diff. Что я делаю неправильно?

Ваш Ответ

8   ответов
215

мерзавец 1.9 что-то вы можете:

git diff -- . ':(exclude)db/irrelevant.php' ':(exclude)db/irrelevant2.php'

Ах, элегантность! Смотрите цитируемый ответ и подробностиэтот ответ @torek

windows syntax : git diff -- . ":(exclude)db/irrelevant.php" (двойные кавычки вместо одинарных кавычек)
Исключить больше файлов, например У меня есть файлы * .min.css и * .min.js, которые нужно избегать в git diff. Итак, я использую командуgit diff -- . ':(exclude)*.min.js' ':(exclude)*.min.css'
ПРИМЕЧАНИЕ. Если вы хотите исключить конкретное имя файла, вам необходимо добавить префикс «звездочка», отличный от.gitignore Синтаксис файла. Например.:!*shrinkwrap.yaml вместо:!shrinkwrap.yaml.
Спасибо! Такой эзотерический синтаксис ... Я должен искать его каждый раз.
1

Бен Ру решение, но в любом случае делиться:

git status --porcelain | grep -v $PATTERN_TO_EXCLUDE | awk '{print $2}' | xargs git diff

или, если изменения уже были зафиксированы локально:

git diff --name-only origin/master | grep -v $PATTERN_TO_EXCLUDE | xargs git diff origin/master

Примеры:

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
0

визуальный инструмент diff (например,сливаться) позволит вам сделать это с помощью короткой команды, которую легко запомнить.

Сначала настройте инструмент сравнения, если вы этого еще не сделали.

$ git config --global diff.tool = meld

Затем вы можете запустить каталог diff.

$ git difftool --dir-diff

Вы сможете просматривать различия (по файлам) в Meld (или по вашему выбору). Просто не открывайте файл, который хотите игнорировать.

17

git diff `git status -s |grep -v ^\ D |grep -v file/to/exclude.txt |cut -b4-`

кудаfile/to/exclude.txt конечно, это имя файла, который вы хотели бы исключить.

Изменить: кредитksenzee для исправления удаленных файлов, нарушающих различие.

Я пытаюсь адаптировать ваш лайнер кgit diff --stat master без особого успеха - не могли бы вы помочь?
14

git diff 987200fbfb 878cee40ba --stat -- ':!*.cs'

Для получения дополнительной информации о различных возможностях включения / исключения читайтеэтот другой пост

59

назначить его тем файлам, которые следует игнорировать.

Create a repository specific diff driver с этой командой

git config diff.nodiff.command /bin/true

или для всех ваших репо с--global.

(Если/bin/true в MacOS не существует, альтернативы будут использовать/usr/bin/true или жеecho).

Then, assign the new diff driver to those files you want ignored в вашем.git/info/attributes файл.

irrelevant.php    diff=nodiff

Если этим состоянием предполагается поделиться с другими разработчиками, вы можете использовать.gitattributes вместо.git/info/attributes и поделитьсяgit config Команда с вашими коллегами (через файл документации или что-то).

просто дополнение: если вы хотите, чтобы git diff отображал его, используйте--no-ext-diff
Это именно то, что я искал - как описано вkerneltrap.org/mailarchive/git/2008/10/17/3711254 Я отредактировал ~ / .gitconfig, добавив:[diff "nodiff"]    `command = / bin / true`, и затем я создал файл с именем .git / info / attribute, в который я добавил:irrelevant.php diff=nodiff Michael
Этот ответ работал намного лучше для меня:stackoverflow.com/questions/1016798/…
Интересно, что этот подход не работает сgit diff --stat, В этом случае можно использоватьgit diff ... | diffstat как обходной путь.
@ Майкл, эта ссылка, похоже, не работает, есть другая?
34

filterdiff программаpatchutils коллекция программ для исключения некоторых частей различий. Например:

git diff | filterdiff -p 1 -x db/irrelevant.php
Обратите внимание, что-pиз man-страницы (1) есть & quot ;-p n, --strip-match = n При сопоставлении игнорировать первые n компонентов пути. & quot; Мне понадобилось время, чтобы поймать это-p 1 удалялdb часть от пути OP. Если вы просто хотите указать имя файла и игнорировать все возможности path / dir, вы можете использовать-p 99.
6

KurzedMetal за то, что мне нужно было сделать, - это способность видеть, что файл изменился, но не генерировать diff, который мог бы быть огромным, в моем случае.

Но мой коллега предложил подход, который был еще проще и работал для меня:

добавление.gitattributes файл в каталоге, где файл будет игнорироватьсяgit diff находится со следующим содержанием:

file-not-to-diff.bin -diff

Это все еще позволяетgit status & Quot; см & Quot; если файл изменился.git diff также будет "видеть" что файл изменился, но он не будет генерироватьdiff.

Тот.bin Расширение для файла в примере было преднамеренным. Я понимаю, что это стандартное поведение git для двоичных файлов, и оно не требует специальной обработки.gitattributes, Но в моем случае эти файлы были распознаны как текстовые файлы с помощью git и & quot; file & quot; утилита, и это сделало свое дело.

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