Как получить список каталогов, удаленных в моем git-репозитории? - PullRequest
4 голосов
/ 31 августа 2009

Я должен сгенерировать список изменений в git-репозитории за несколько минут. Для этого я отметил идентификатор фиксации и сравнил его с последним HEAD, чтобы сгенерировать список изменений в репозитории git. Например:

$ git diff --name-status OLD_COMMIT..HEAD

Это дает список изменений в репозитории git.

Но недавно я заметил недостаток в этом подходе, поскольку он не перечисляет удаленный каталог. Хотя в нем правильно перечислены удаленные файлы.

Как я могу получить правильный список удалений в репозитории git? (Как если бы он мог перечислить удаленный каталог, то подразумевается, что все файлы были удалены внутри него. Следовательно, не будет огромный список удаленных файлов, а будет одна строка, показывающая удаленный каталог !!!) 1008 *

1 Ответ

7 голосов
/ 31 августа 2009

git отслеживает объекты дерева, которые являются его представлением каталогов. Хотя технически это возможно с точки зрения объектной модели, git не хранит пустые деревья. Вместо этого git удалит любую запись для пустого дерева из его родительского дерева.

Команда git diff-tree создает вывод, который показывает, как все записи дерева изменились между деревьями.

git diff-tree origin/master master

Это выведет, как изменились все записи в данном дереве (то есть корневое дерево данного коммита в этом примере).

Формат описан в справочной странице git-diff-tree , но в основном любой каталог, который был создан или удален, будет иметь 040000 во втором или первом столбце и 000000 в первом или втором столбце соответственно. Это «режимы» записи дерева для левой и правой записей.

Если вы хотите просматривать и искать записи дерева в поддеревьях, вы должны использовать опцию -t, а не только опции -r, так как по умолчанию -r показывает вложенные записи дерева вместо записи дерева сам по себе -t покажет оба.

Если вас интересуют каталоги, которые изменились (добавлены или удалены, или изменены на другой тип или, например, символическую ссылку), а не просто другое содержимое, то вам, вероятно, нужно отфильтровать записи, начинающиеся с :040000 040000.

Вот возможная командная строка, которая делает это.

git diff-tree -t origin/master master | grep 040000 | grep -v -E '^:040000 040000'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...