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

#git #git-diff

#git #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
  

… но как я могу получить «дополнительную» информацию о различиях в корневом каталоге? Т.е. этот вывод:

 $ 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>[^/]*$
  

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

Комментарии:

1. git diff <branchA>..<branchB> -- <path> у меня сработало.

Ответ №2:

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

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

Комментарии:

1. Вывод git diff --name-status — это не файл исправления, а только список измененных файлов, так что, похоже, filterdiff это не помогает.

Ответ №3:

Если запущена Linux или совместимая оболочка с find available, вы можете использовать find для генерации списка файлов вне каталога в текущем (или другом) каталоге, затем передать это в git diff , например:

 git diff --stat --other-git-diff-args -- $(find . -type f -depth 1 -print0 | tr '' ' ')