Как я могу ограничить git -diff только одним каталогом, без его дочерних элементов?

Я использую git diff --name-status для отслеживания, какие файлы были изменены/добавлены/удалены/переименованы/скопированы между двумя коммитами, и он отлично работает.

Теперь предположим, что я перемещаю файл file1 в newdir/file1, фиксирую, а затем запускаю git diff, я получаю следующее:

$ git diff --name-status -C HEAD~1 HEAD
R100    file1    newdir/file1

Есть ли способ попросить git ограничить себя списком изменений внутри данного каталога, но не его дочерними? Я хотел бы узнать точные изменения как для корневого каталога, так и для каталога newdir, отдельно. Для newdir легко:

$ git diff --name-status -C HEAD~1 HEAD -- newdir
A       newdir/file1

... но как я могу получить "дополнительную" информацию diff в корневом каталоге? I.e., этот выход:

$ git diff ???
D       file1

Обратите внимание, что я хочу сохранить параметр -C для обнаружения переименований и копий внутри одного каталога.

Ответ 1

Пропустите его до grep:

git diff --name-status HEAD..HEAD~1 . | grep ^[^/]*$

Это отфильтрует все, что содержит вспомогательную директорию, если вам нужно что-то получить от этого глубже:

git diff --name-status HEAD..HEAD~1 <path> | grep ^<path>[^/]*$

Вы можете легко создать псевдоним, если хотите.

Ответ 2

Я знаю, что это возможно в git, но у меня возникло бы желание использовать программы filterdiff/grepdiff из patchutils что-то вроде этого должно работать нормально

git diff -C .... | filterdiff --clean -x '*/*/**'