2012-05-02 3 views
100

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

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

ответ

93

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

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

А, элегантность!См. Приведенный ответ и для получения более подробной информации. this answer by @torek

+5

Что делать, если мне нужно исключить несколько файлов? – itsashis4u

+4

@ itsashis4u 'git diff -. ': (исключить) db/unwlevant.php' ': (exclude) db/another_irrelevant.php'' – tokland

+0

ПРИМЕЧАНИЕ. Если вы хотите исключить определенное имя файла, вы должны иметь префикс со звездочкой, отличный от файла '.gitignore' синтаксис. Например. ':! * shrinkwrap.yaml' вместо':! shrinkwrap.yaml'. – vaughan

30

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

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

Обратите внимание, что '-p', из manpage (1), является« -p n, -strip-match = n При совпадении игнорируйте первые n компонентов пути ». Мне потребовалось некоторое время, чтобы поймать, что '-p 1' удаляет часть' db' с пути OP. Если вы просто хотите указать имя файла и игнорировать все возможности path/dir, вы можете использовать '-p 99'. –

51

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

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

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 команду со своими коллегами (через файл документации или что-то).

+2

Это именно то, что я искал - как описано в http://kerneltrap.org/mailarchive/git/2008/10/17/3711254 я редактировал ~/.gitconfig добавления: '[диф "nodiff"] ' команда' =/bin/true' , а затем я создал файл с именем .git/Информация/атрибутов, в которые я добавил: 'irrelevant.php дифф = nodiff' – Michael

+8

Этот ответ работал намного лучше для меня: http://stackoverflow.com/questions/1016798/excluding-files-from-git-diff –

+3

Интересно, что этот подход не работает с 'git diff -stat'. В этом случае можно использовать 'git diff ... | diffstat' как обходной путь. – ddkilzer

17

Это одна линии решение не требует никаких других Utils/загрузок:

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

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

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

+0

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

0

похож на Ben Roux's решение, но обмен в любом случае:

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 
2

Этот метод короче, чем принятый андер.

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

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

0

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

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

$ git config --global diff.tool = meld 

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

$ git difftool --dir-diff 

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