将所有提交导出到 ZIP 文件或目录中

Bas*_*asj 4 git export git-archive

如何将所有提交导出到 ZIP 文件(包含所有文件,而不仅仅是 patch/diff):

myproject-commit1-67d91ab.zip
myproject-commit2-9283acd.zip
myproject-commit3-c57daa6.zip
...
Run Code Online (Sandbox Code Playgroud)

或进入目录:

myproject-commit1-67d91ab/
myproject-commit2-9283acd/
myproject-commit3-c57daa6/
Run Code Online (Sandbox Code Playgroud)

我正在考虑这样的命令:

git archive --format zip --output myproject-commit3.zip c57daa6
Run Code Online (Sandbox Code Playgroud)

来自如何使用 git-archive 导出特定提交?,但是如何获得所有提交

笔记:

tor*_*rek 5

你不能,除非通过你已经在考虑的方法。

\n\n

具体来说,要将每个提交转换为 zip 存档(每个提交一个单独的存档),只需迭代每个提交,将每个提交转换为 zip 存档即可。

\n\n

您的迭代方法只需要遍历所有可能的提交,而不是仅遍历分支的所有第一父级master,并且您必须git archive在每个此类提交上使用。因此:

\n\n
git rev-list --all |\n    while read hash; do git archive ...options... $hash\ndone\n
Run Code Online (Sandbox Code Playgroud)\n\n

该命令git rev-list --all告诉 Git 按某种顺序打印出每个可到达的提交哈希 ID。要更改顺序,请使用git rev-list和均可用的各种排序选项git log(例如,--author-date-order--topo-order)。

\n\n

如果您想要每个提交\xe2\x80\x94,如果您只想要 master\xe2\x80\x94 的第一父母,您仍然可以这样做git rev-list

\n\n
git rev-list --first-parent master | ...\n
Run Code Online (Sandbox Code Playgroud)\n\n

在这里,由于 Git 仅从任何提交master标识开始遍历第一父级,因此哈希 ID 将以 Git 认为的正向顺序输出,即向后穿过分支的第一父级:

\n\n
...--o--o--o--o--o--o------o   <-- master\n      \\        \\          /\n       \\        X--X--...X   <-- somebranch\n        \\         /\n         X--X----X--X   <-- anotherbranch\n
Run Code Online (Sandbox Code Playgroud)\n\n

任何X提交都不会出现,因为它们不在第一父系上。(如果没有--first-parent,因为 上的所有提交somebranch以及除最后一个之外的所有提交anotherbranch也在上,因此master您将获得所有X提交。)

\n\n

[Basj 添加了以下内容,这似乎是 bash 特定的,因为$((i=i+1)):] 编辑:这是一个随时可用的命令,可以按照问题中的描述执行此操作:

\n\n
git rev-list --all --reverse | while read hash; do git archive --format zip --output ../myproject-commit$((i=i+1))-$hash.zip $hash; done\n
Run Code Online (Sandbox Code Playgroud)\n\n

[torek 觉得需要添加:-) :请注意,上面按顺序枚举提交,即使这不是可逆映射。]

\n