Вы не можете, кроме тех методов, о которых вы уже думаете.
В частности, чтобы превратить каждый коммит в zip-архив (один отдельный архив на коммит), просто переберите каждый коммит, превратив каждый в zip-архив.
Ваш метод итерации должен просто проходить все возможные коммиты, а не обходить только всех прародителей ветви master
, и вы должны использовать git archive
для каждого такого коммита. Следовательно:
git rev-list --all |
while read hash; do git archive ...options... $hash
done
Команда git rev-list --all
говорит Git распечатать каждый достижимый хеш-идентификатор фиксации в некотором порядке. Чтобы изменить порядок, используйте различные параметры сортировки, доступные для git rev-list
и git log
(например, --author-date-order
или --topo-order
).
Если вы не хотите каждый коммит - если вы хотите вместо него только прародителей мастера - вы все равно можете сделать это с помощью git rev-list
:
git rev-list --first-parent master | ...
Здесь, поскольку Git обходит только прародителей, начиная с идентификатора master
, идентификаторы хеша будут выводиться в том порядке, в котором Git рассматривает прямой порядок, т. Е. В обратном направлении через прародителей ветви:
...--o--o--o--o--o--o------o <-- master
\ \ /
\ X--X--...X <-- somebranch
\ /
X--X----X--X <-- anotherbranch
Ни один из X
коммитов не появится, так как они не находятся на линии первого родителя. (Без --first-parent
, поскольку все коммиты на somebranch
и все, кроме последнего на anotherbranch
, также на master
, вы получите все X
коммиты.)
[Basj добавляет следующее, которое, по-видимому, связано с bash из-за $((i=i+1))
:] Edit: это готовая к использованию команда для выполнения, как описано в вопросе:
git rev-list --all --reverse | while read hash; do git archive --format zip --output ../myproject-commit$((i=i+1))-$hash.zip $hash; done
[torek чувствует необходимость добавить :-): Обратите внимание, что вышеприведенное перечисляет коммиты последовательно, даже если это не обратимое отображение.]