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


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

во всех случаях!--0--> файл включен в diff как двоичный патч Git. Я хочу, чтобы изменения в этом файле игнорировались командой diff. Что я делаю не так?

7 137

7 ответов:

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

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

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

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

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

git config diff.nodiff.command /bin/true

или для всех ваших РЕПО с --global.

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

затем назначьте новый драйвер diff для тех файлов, которые вы хотите проигнорировать in ваш .

irrelevant.php    diff=nodiff

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

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

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

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

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

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

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

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

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

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

аналогично Бен ру!--5--> решение, но обмен в любом случае:

git status --porcelain | grep -v $PATTERN_TO_EXCLUDE | awk '{print }' | 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 }' | xargs git diff origin/master

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

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

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

$ git config --global diff.tool = meld

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

$ git difftool --dir-diff

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