Это довольно легко сделать, используя tar или zip для разархивирования архивов:
- Используйте
git rev-list
, чтобы сгенерировать список идентификаторов ha sh для каждого коммита. - Используйте
git archive
, чтобы превратить каждый моментальный снимок фиксации в архив. - Используйте
tar
или unzip
, чтобы превратить каждый архив в дерево исходных кодов в пронумерованной папке p/
.
В сценарии оболочки (bash, более или менее) это:
step=1
git rev-list --reverse --topo-order $last |
while read rev; do
mkdir /path/to/p$step
git archive $rev | tar -C /path/to/p$step -xf -
: $((step+=1))
done
(примечание: приведенное выше не проверено).
Изменить, чтобы упомянуть забытую часть : установите last
выше для последнего коммита, который вы хотите экспортировать. Используйте необработанный идентификатор ha sh, если хотите, или название ветви, если хотите. Имя ветви Git просто называет последний коммит в ветви (всегда по определению). L oop автоматически нумерует извлеченные папки последовательно в соответствии с результатом списка оборотов, поэтому если при запуске с последнего коммита и при работе в обратном направлении насчитывается 5000 коммитов, вы получите 5000 папок, пронумерованных начиная с 1 (по запросу) .
Обратите внимание, что каждый коммит - это требуемый снимок - коммиты не содержат изменений, они содержат моментальные снимки - но коммит в репозитории Git хранит свои файлы в специальном, Только для чтения, Git -только формат архива, сжатый таким образом, что идентичные файлы сразу же дублируются, а подобные файлы в конечном итоге (хотя и не сразу) занимают очень мало места. Вы хотели каждый снимок как обычные файлы. Это означает, что вы должны получить от Git до extract их.
Команда git checkout
делает именно это: она извлекает файлы . Но он делает слишком много: он делает это в одном рабочем дереве вместе с ведением информации, так что git commit
или другой git checkout
могут быть сделаны позже. Если вы сделаете еще один git checkout
, Git удалит и заменит все эти файлы на файлы из следующего , зафиксированного вами. Так что git checkout
- это не та команда, которую мы расширяем для снимка в нормальные файлы.
(на самом деле это не git archive
, но как только мы превратим снимок в стандартный архив tar или zip, мы можем использовать стандартный инструмент tar или unzip для извлечения файлов где-то, что является , а не рабочим деревом, где эти файлы защищены от случайного забивания другим git checkout
.)