如何将所有提交导出到 ZIP 文件(包含所有文件,而不仅仅是补丁/差异):
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
来自 How do I export a specific commit with git-archive? ,但是如何获取所有提交呢?
注意事项:
目标是对每次提交的所有文件进行导出,这样即使我没有
git
也可以访问它们在机器上来自 How can I export Git change sets from one repository to another via sneaker net (external files)? 的答案创建一个
.bundle
文件,但如果没有git
似乎无法访问它,所以这不是我要找的东西这几乎可以工作:
for ((i = 0;; ++i)); do git checkout master~$i || break; tar czf ../myproject-commit$i.tgz .; done
但它也会归档当前目录中所有不的文件
git add
到 repo... 如何避免这个问题?
最佳答案
你不能,除非你已经在考虑的方法。
具体来说,要将每个 提交转换为一个 zip 存档(每个提交一个单独的存档),只需迭代每个提交,将每个提交转换为一个 zip 存档。
您的迭代方法只需要遍历所有可能的提交,而不是仅遍历 master
分支的所有第一父级,并且您必须在每个分支上使用 git archive
这样的 promise 。因此:
git rev-list --all |
while read hash; do git archive ...options... $hash
done
命令 git rev-list --all
告诉 Git 按某种顺序打印出每个可达的提交哈希 ID。要更改顺序,请使用 git rev-list
和 git log
可用的各种排序选项(例如,--author-date-order
或 --topo-order
)。
如果您不想要每次提交——如果您只想要 master 的第一 parent ——您仍然可以使用 git rev-list
来做到这一点:
git rev-list --first-parent master | ...
在这里,由于 Git 仅遍历从 master
标识的任何提交开始的第一个父级,因此哈希 ID 将按照 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 添加了以下内容,由于 $((i=i+1))
似乎是特定于 bash 的:] 编辑:这是一个随时可用的命令问题中描述:
git rev-list --all --reverse | while read hash; do git archive --format zip --output ../myproject-commit$((i=i+1))-$hash.zip $hash; done
[torek 觉得有必要添加 :-):请注意,上面列举的是顺序提交,即使这不是可逆映射。]
关于git - 将所有提交导出到 ZIP 文件或目录中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51131530/