#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 '' ' ')