如何将所有提交导出到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
已进入仓库...如何避免此问题?
答案 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-list
和git 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