2015-05-13 4 views
1

Я пишу программу, которая должна одновременно извлекать разные коммиты из одного и того же репозитория (например, в this question, но одновременно).Git plumbing: экспортировать дерево при фиксации без касания HEAD/index

Фарфоровые команды, такие как git checkout и git archive, работают с индексом, поэтому в любое время, когда необходимо будет выполнить фиксацию, ему нужно будет переместить HEAD и/или пройти сначала по индексу.

Есть ли простой способ просто сбрасывать объект Git tree в каталог в файловой системе?

+2

'git archive' не работает с индексом и не требует внесения изменений в HEAD, индекс или рабочий каталог. 'git archive -o /tmp/somefile.tar sha1-of-old-commit', вероятно, то, что вы хотите. Тег, имя ветви или другая форма ref (например, 'dev @ {3 дня назад}') одинаково подходят для аргумента sha1. – twalberg

ответ

0

Один из способов сделать это программно - использовать git cat-file.

При запуске в пакетном режиме (--batch) вы можете передавать идентификаторы фиксации на свой стандартный вход, и он немедленно выгружает объект в стандартный вывод (включая заголовок, указывающий тип и длину объекта). Таким образом, вы можете рекурсивно пересечь результирующий объект commit, создавая процесс git cat-file, записывая объекты (blob и sub-tree) SHA на свой стандартный вход, записывая капли на диск и рекурсивные для древовидных объектов.

Обратите внимание, что древовидные объекты будут сбрасываться в двоичном формате; вы можете найти описание формата в this answer.

0

Вы можете использовать git archive экспортировать tar архив конкретной фиксации, и сразу же извлечь его в какой-то целевой каталог:

git archive <commit> | tar -xf - -C <output-directory> 

Это также будет работать для любого объекта дерева, вместо <commit>.