Git plumbing: экспортировать дерево при коммите без касания HEAD/index
Я пишу программу, которая должна одновременно извлекать различные коммиты из одного и того же хранилища (как в этом вопросе, но одновременно).
Фарфоровые команды, такие как git checkout
а также git archive
работать с индексом, поэтому каждый раз, когда необходимо извлечь коммит, ему нужно будет перемещать HEAD и / или сначала проходить по индексу.
Есть ли простой способ просто сбросить объект дерева Git в каталог в файловой системе?
2 ответа
Один из способов сделать это программно - использовать git cat-file
,
При запуске в пакетном режиме (--batch
), вы можете передать идентификаторы коммитов на его стандартный ввод, и он сразу же сбросит объект на стандартный вывод (включая заголовок, указывающий тип и длину объекта). Таким образом, вы можете рекурсивно перебирать объект дерева коммитов, порождая git cat-file
обрабатывать, записывать объектные SHA-объекты (BLOB-объекты и поддеревья) на стандартный ввод, записывать BLOB-объекты на диск и рекурсивно обрабатывать объекты дерева.
Обратите внимание, что объекты дерева будут выгружаться в двоичном формате; Вы можете найти описание формата в этом ответе.
Ты можешь использовать git archive
экспортировать tar
архив определенного коммита, и немедленно распакуйте его в какой-то целевой каталог:
git archive <commit> | tar -xf - -C <output-directory>
Это также будет работать для любого объекта дерева, вместо <commit>
,