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>,

Другие вопросы по тегам