Фильтр git diff по типу изменения - PullRequest
96 голосов
/ 30 июля 2011

Есть ли способ ограничить git diff измененными файлами?

Я хотел бы увидеть различия между двумя коммитами, но исключить пути, которых нет ни в одном, ни в другом (дополнения /делеции).Следующая однострочная строка Perl иллюстрирует большую часть того, что я хочу:

git diff master.. | perl -lnwe 'print unless /^(new|deleted) file/../^diff/ and not /^diff/'

Но это оставляет diff --git a/path b/path строк для файлов, которые были новыми или удалены.Кроме того, было бы гораздо приятнее, если бы мне не приходилось анализировать (также не удается, если какой-либо кусок содержит что-либо, например, совпадающее с / ^ diff /).

Другой вариант, который я попробовал, был:

git diff --name-status (args) | perl -lnwe 'print if s/^M\s+//' | xargs git diff (args) --

Его вывод лучше, но он все еще кажется хакерским.

Ответы [ 5 ]

169 голосов
/ 30 июля 2011

Вы ищете --diff-filter=M, чтобы показать только файлы * M * odified между двумя ветвями.

С man git-diff

--diff-filter=[ACDMRTUXB*]

Выберите только те файлы, которые

  • A Добавлено
  • C Скопировано
  • D Удалено
  • M Изменено
  • R Переименовано
  • T имеют свой тип (режим) изменено
  • U Unmerged
  • X Неизвестно
  • B их соединение сломано
  • * Все или ничего

Может использоваться любая комбинация символов фильтра.

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

15 голосов
/ 11 августа 2016

Как напоминает нам Git 2.10 (3 квартал 2016 года), существует более простой способ «показать все, кроме добавленных / удаленных файлов». (фактически начиная с Git 1.8.5, июль 2013 г.)

 git diff --diff-filter=ad master..

См. коммит 16726cf (14 июля 2016 г.) от Junio ​​C Hamano (gitster) .
(Объединено Junio ​​C Hamano - gitster - в коммит 2f8c654 , 08 августа 2016 г.)

diff: документ diff-filter исключение

В версии 1.8.5 7f2ea5f (diff: разрешить указывать строчную букву какое изменение класса исключить, 2013-07-17) преподавал "--diff-filter" механизм принятия строчных букв в качестве исключения , но мы забыли документируйте это.

Итак документация по diff-options теперь (наконец) включает:

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

4 голосов
/ 30 июля 2011

Вы можете использовать флаг --diff-filter, чтобы сделать именно это.git diff --diff-filter=CMRTUXB master.. должно показать все, кроме добавленных / удаленных файлов.

1 голос
/ 20 сентября 2011

Для просмотра всех измененных и новых файлов вы можете использовать

git diff --name-only --diff-filter=ACMR PREV_VERSION master

PREV_VERSION - это хэш вашего первого коммита.

Чтобы получить экспорт в формате zip, используйте этот код

git archive --output=export.zip HEAD $(git diff --name-only --diff-filter=ACMR PREV_VERSION HEAD)

Примечание: .gitignore не входит export.zip

0 голосов
/ 02 сентября 2014

Я использовал Notepad ++ (Windows) и эти регулярные выражения для фильтрации типов расширений и определенных путей из файла diff.

^Index.*\.(dll|pdb|exe|txt|zip|log|ism|resx|tlog|htm|lib)$[\s\S.]*?^Index
^Index: Shared/.+$[\s\S.]*?^Index
^Index: Next/source/Utility/.+$[\s\S.]*?^Index

Единственная проблема в том, когда она достигает конца. Вы должны нажать Ctrl + Home и идти снова, пока ничего не найдете.

(заменить найденное на «Индекс»)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...