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

标签 git export git-archive

如何将所有提交导出到 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-listgit 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/

相关文章:

git - 是否可以在两个工作站之间使用 Git,而无需 "central"存储库?

git - 是否可以创建一个 git 存储库,其中分支是来自其他存储库的克隆?

git - 是否可以在 Github 和 Gitlab 上放置一个 Git 存储库?

Git:从远程服务器获取特定修订

git - 通过 https 克隆最新版本的 git 存储库

git - Jenkins 的工作被 GitHub webhook 戳了,但没有启动

java - - 使用 Windows 终端导出 x509 证书时文件选项错误

svg - 在浏览器中将 Google Geochart 转换为图像(JPEG、PNG 等)或 PDF

python - 如何在 flask-admin 中导出具有关系的列

git - 做一个 "git export"(比如 "svn export")?