Хотите исключить файл из "git diff"

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

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

Ответ 1

OMG, драйверы и awk, чтобы исключить паршивый файл? С git 1.9 вы можете:

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

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

Ответ 2

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

Создайте специальный драйвер diff хранилища с помощью этой команды

git config diff.nodiff.command /bin/true

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

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

Затем назначьте новый драйвер diff тем файлам, которые вы хотите игнорировать в вашем файле .git/info/attributes.

irrelevant.php    diff=nodiff

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

Ответ 3

Вы также можете использовать filterdiff программу patchutils, чтобы исключить некоторые части различия. Например:

git diff | filterdiff -p 1 -x db/irrelevant.php

Ответ 4

Это однострочное решение не требует других utils/downloads:

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

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

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

Ответ 5

Этот метод короче принятых ответов.

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

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

Ответ 6

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

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

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

file-not-to-diff.bin -diff

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

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

Ответ 7

похож на решение Ben Roux, но все равно поделитесь:

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

Ответ 8

Это очень просто, вы можете исключить то, что вы хотите, используя стандартные команды Unix, эти команды доступны в git bash даже в среде Windows. В следующем примере показано, как исключить diff для файлов pom.xml, сначала проверьте, что diff для master только для имен файлов, затем с помощью 'grep -v' исключите ненужные файлы, а затем снова запустите diff для master с предварительно подготовленным списком:

git diff master 'git diff --name-only master | grep -v pom.xml'

Ответ 9

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

Во-первых, настройте инструмент сравнения, если вы еще этого не сделали.

$ git config --global diff.tool = meld

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

$ git difftool --dir-diff

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