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

Export all commits into ZIP files or directories

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

来自 How do I export a specific commit with git-archive?,但如何获得 所有提交

备注:

您可以使用

下载具有特定提交的 zip 文件的项目
https://host_url/{user_name}/{project_name}/archive/{commit_id}.zip

编辑

您可以使用命令行执行此操作。

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

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

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

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

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)。

如果你想要每次提交——如果你只想要first-parents master——你仍然可以用git rev-list做到这一点:

git rev-list --first-parent master | ...

在这里,由于 Git 仅从 master 标识的任何提交开始 first-parents 行走,因此哈希 ID 将按照 Git 认为的正向顺序输出,即, 向后穿过分支的 first-parents:

...--o--o--o--o--o--o------o   <-- master
      \        \          /
       \        X--X--...X   <-- somebranch
        \         /
         X--X----X--X   <-- anotherbranch

None 的 X 提交将出现,因为它们不在 first-parent 沿袭中。 (没有 --first-parent,因为 somebranch 上的所有提交,以及 anotherbranch 上除最后一个以外的所有提交,都是 master ,您将获得所有 X 提交。)

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

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

[torek 觉得有必要补充 :-) : 注意上面列举的是顺序提交,即使这不是可逆映射。]

我稍微改进了@torek 的解决方案。
这个导出提交,使用 git log“通常可见”(所有提交都导出到文件夹 zip):

mkdir zip && git log --format=%h --reverse |
    while read hash;
    do git archive --format zip --output zip/$((i=i+1))-project-$hash.zip $hash;
done

如果您还需要日期和时间(不带“项目”),请使用这个:

mkdir zip && git log --format="%h %ad" --date=format:"%d.%m.%Y-%H.%M" --reverse |
    while read hash date;
    do git archive --format zip --output zip/$((i=i+1))-$hash-$date.zip $hash;
done

或者,如果您想将所有提交导出到文件夹(而不是 zip 存档),请使用这个:

mkdir zip && git log --format="%h %ad" --date=format:"%d.%m.%Y-%H.%M" --reverse |
    while read hash date;
    do git archive --format zip --output zip/$((i=i+1))-$hash-$date.zip $hash;
done && find zip -name '*.zip' -exec sh -c 'unzip "" -d "${1%.*}"' _ {} \; && rm zip/*.zip

无论如何,如果您还想保留文件模式 (chmod),请使用此模式。它使用 tar 档案而不是 zip 档案:

mkdir tar && git log --format="%h %ad" --date=format:"%d.%m.%Y-%H.%M" --reverse |
    while read hash date;
    do git archive --format tar --output tar/$((i=i+1))-$hash-$date.tar $hash;
done && find tar -name '*.tar' -exec sh -c 'mkdir ${1%.*} && tar -xvf "" -C "${1%.*}"' _ {} \; && rm tar/*.tar