Как заставить git-diff и git log игнорировать новые и удаленные файлы?


155

Иногда есть несколько измененных файлов вместе с некоторыми новыми, удаленными и / или переименованными файлами. При выполнении git diffили git-logя хотел бы опустить их, чтобы я мог лучше определить изменения.

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

Ответы:


217

--diff-filterОпция работает с обеими diffи бревном.

Я использую --diff-filter=Mмного, что ограничивает вывод diff только модификациями контента.

Для обнаружения переименований и копий и их использования в выводе diff вы можете использовать -Mи -Cсоответственно, Rи Cопции и для --diff-filter.


3
При использовании с git logэтим он полностью игнорирует коммиты, которые только добавляют и / или удаляют файлы.
qqx

7
Есть ли способ на самом деле исключить только один тип данных? Нечто подобное--diff-filter=!D
Камиль Дзедзич,

24
@ Камил Да, есть. Цитата из документации:Also, these upper-case letters can be downcased to exclude. E.g. --diff-filter=ad excludes added and deleted paths.
LambdaCruiser

62
  • Официальный документ:
--diff-filter=[(A|C|D|M|R|T|U|X|B)…​[*]]

Выберите только те файлы, которые добавлены (A), скопированы (C), удалены (D), изменены (M), переименованы (R), чей тип (т. Е. Обычный файл, символическая ссылка, подмодуль,…) изменен (T), Unmerged (U), Неизвестен (X), или у них было сломано соединение (B). Может использоваться любая комбинация символов фильтра (включая ни одного).

Когда * (All-or-none) добавляется в комбинацию, выбираются все пути, если есть какой-либо файл, который соответствует другим критериям в сравнении; если нет файла, соответствующего другим критериям, ничего не выбирается.

Кроме того, эти заглавные буквы могут быть исключены в нижнем регистре. Например, --diff-filter = ad исключает добавленные и удаленные пути.

Пример: показать только добавленные, измененные, измененные файлы, исключая удаленные:

git diff --diff-filter=ACM

2
Обратите внимание на использование строчных букв для исключения путей и прописных букв для включения путей.
Stuyam

-3

UPDATE: общепринятый ответ Чарльз Бейли является правильным; желаемый функционал уже встроен в git.

Я оставлю этот ответ здесь, так как он может дать идеи для вещей, которые не встроены в git.


git diffпоказывает новые и удаленные файлы, сравнивая их с /dev/null. Не должно быть слишком сложно написать что-то (я бы сам использовал Perl), которое ищет /dev/nullи отфильтровывает следующие строки вплоть до следующего diff. Потом git diff ... | the-filter.

Переименованные файлы - это другое дело; У меня (пока) нет хорошего ответа на это.


Это нормально, но в этом случае я бы потерял возможность использовать пейджер (меньше) только в случае необходимости, не так ли?
Маартин

@maaartinus: я так думаю; Я не думал об этом. (Лично я поставил мой GIT пейджера «кошка» и использования в ... | lessявном виде.) Вы можете посмотреть на less«s -Eили -Fвариант (хотя на моей системе это не позволяет мне увидеть выход).
Кит Томпсон

ОК, хорошо, но посмотри на другой ответ.
Maaartinus
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.