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

时间:2018-07-02 08:02:28

标签: 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已进入仓库...如何避免此问题?

3 个答案:

答案 0 :(得分:1)

除了已经在考虑的方法之外,您不能。

具体来说,要将每个提交都转换为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)。

如果您希望每次提交-如果您只希望母版的前辈-您仍然可以使用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觉得有必要添加:-):请注意,即使这不是可逆的映射,以上也按顺序枚举提交。]

答案 1 :(得分:0)

您可以使用

下载带有zip文件中特定提交的项目。
if (this.props.loading) {
  <Timeout ms={SHOW_LOADING_AFTER}><p>Loading...</p></Timeout>
}

编辑

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

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

答案 2 :(得分: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

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

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