Экспортируйте все коммиты в ZIP-файлы или каталоги - PullRequest
0 голосов
/ 02 июля 2018

Как можно экспортировать все коммиты в ZIP-файлы (содержащие все файлы , а не только patch / diff):

myproject-commit1-67d91ab.zip
myproject-commit2-9283acd.zip
myproject-commit3-c57daa6.zip
...

или в каталогах:

myproject-commit1-67d91ab/
myproject-commit2-9283acd/
myproject-commit3-c57daa6/

Я думал о таких командах, как:

git archive --format zip --output myproject-commit3.zip c57daa6

из Как экспортировать определенный коммит с помощью git-archive? , но как получить все коммиты ?

Примечания:

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

  • ответ от Как я могу экспортировать наборы изменений Git из одного хранилища в другое через sneaker net (внешние файлы)? создает файл .bundle, но, кажется, невозможно получить к нему доступ без git, так что это не то, что я ищу

  • это почти работает:

    for ((i = 0;; ++i)); do git checkout master~$i || break; tar czf ../myproject-commit$i.tgz .; done
    

    , но также архивирует все файлы в текущем каталоге, которые не git add едь в репо ... Как избежать этой проблемы?

Ответы [ 2 ]

0 голосов
/ 02 июля 2018

Вы не можете, кроме тех методов, о которых вы уже думаете.

В частности, чтобы превратить каждый коммит в 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 чувствует необходимость добавить :-): Обратите внимание, что вышеприведенное перечисляет коммиты последовательно, даже если это не обратимое отображение.]

0 голосов
/ 02 июля 2018

Вы можете скачать свой проект с определенным коммитом в zip-файле, используя

https://host_url/{user_name}/{project_name}/archive/{commit_id}.zip

РЕДАКТИРОВАТЬ

Вы можете сделать это с помощью командной строки.

git archive -o commit_id.tar --remote=<repo_url> <commit_id>
...