2

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

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

笔记:

  • 目标是导出每个提交的所有文件,以便即使我没有git在机器上也可以访问它们

  • 如何通过运动鞋网(外部文件)将 Git 更改集从一个存储库导出到另一个存储库的答案?创建一个.bundle文件,但如果没有它似乎无法访问它git,所以这不是我要找的

  • 这几乎有效:

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

    但它也会归档当前目录中 git add编辑到 repo 的所有文件......如何避免这个问题?

4

3 回答 3

3

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

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

您的迭代方法只需要遍历所有可能的提交,而不是仅遍历master分支的所有第一父级,并且您必须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)可用的各种排序选项。

如果你不想每次提交——如果你只想要 master 的第一父母——你仍然可以这样做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 添加了以下内容,这似乎是特定于 bash 的$((i=i+1)):] 编辑:这是一个随时可用的命令,如问题中所述:

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

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

于 2018-07-02T16:02:57.090 回答
0

我稍微改进了@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 "$1" -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 "$1" -C "${1%.*}"' _ {} \; && rm tar/*.tar
于 2021-03-30T10:31:18.470 回答
0

您可以使用 zip 文件下载具有特定提交的项目

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

编辑

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

git archive -o commit_id.tar --remote=<repo_url> <commit_id>
于 2018-07-02T10:28:26.237 回答