在开发过程中,拥有完整的Git修订历史记录会有很多好处。

但是我们的产品是源代码,我们使用的脚本语言不需要编译或处理,因此Git历史成为部署的负担-在我们的示例中,我们部署了干净的虚拟环境每次更改后,都可以在一台计算机上进行多次部署。

有一些方法可以减少历史记录的数量,例如浅克隆,其效率取决于分支中修订的深度,获取而不是克隆,但是您仍然可以从修订版本中获取历史记录,也可以从中获取历史记录,或者一次获取完整的存储库,然后在需要时提取,但是这在磁盘空间方面是浪费的,并且可靠性较低。

有没有办法从Git获得单个修订版本而不提供其历史记录?

评论

有关问题,请访问SOstackoverflow.com/questions/26135216/…

#1 楼

浅克隆

您确实可以使用以下方法从Git中获得浅克隆:

git clone --depth=1 <url>


这仍将克隆存储库并创建.git文件夹带有对象的对象,其大小只会更小(差异取决于总文件大小与历史记录大小)。

Git归档文件

还可以使用git-archive提取存储库的存档:


创建指定格式的存档,其中包含命名树的树结构,并将其写到标准输出中。如果指定了if,则将其添加到归档文件中的文件名之前。


在示例中显示,例如:


git archive --format=tar --prefix=git-1.4.0/ v1.4.0 | gzip >git-1.4.0.tar.gz


为v1.4.0发行版创建压缩的tarball。



托管的Git,存档API

将回购托管在GitHub上,则可以使用其存档API:

https://api.github.com/repos/<username>/<repository>/zipball/<commit_hash>

Bitbucket.org具有相同的功能:

https://bitbucket.org/<username>/<repository>/get/<branch_name|commit_hash|tag>.zip

评论


7ochem,也许gzip命令需要是gzip -c...。

–罗密欧·尼诺夫(Romeo Ninov)
17 Mar 7 '17 at 18:16

#2 楼

不要部署您的git repo。开发实际的部署方法。即使只是简单地将已部署脚本的存档(=将要部署的文件构建为工件)放在一起也是如此。

即使您浅克隆了源存储库的技巧,您可能在部署的环境中不需要单元测试,文档,lint配置文件和其他支持的临时工具。

注意:对于没有真正“构建”步骤的脚本语言存储库,发布工件的简单方法是将它们打包在一个档案中,例如tar或rpm。然后,要“部署”,请解压缩归档文件或安装rpm。这样就无需在部署链中使用git工具(并非所有prod服务器都将具有那些dev工具)。

评论


可以问(甚至挑战!)一个答案-这就是Stack Exchange出色的原因:)对于实际上没有“构建”步骤的脚本语言存储库,发布工件的简单方法是打包将它们保存在存档中,例如tar或rpm。然后,要“部署”,请解压缩归档文件或安装rpm。这样就无需在部署链中使用git工具(并非所有产品服务器都将具有那些dev工具)

– RubyTuesdayDONO
17年7月7日在19:30

@ Pierre.Vriens是的,您错过了建议归档存档时的建议,即构建一个仅包含要部署的必需文件的工件。就是说,我同意这不是一个高质量的答案,这一点应该扩大。我们处于私人测试阶段,答案应明确

–滕西拜
17年7月7日在19:32

然后,我看不到这会带来比接受的答案更多的东西,如果要指向适合的档案...这只是多余的,您应该编辑以这种方式扩展iMHo

–滕西拜
17年7月7日在19:34

请检查我对您的答案的编辑(仅整合您的有趣评论)。当然,可以随时进行改进/重做;如果根本不喜欢我的编辑,则可以回滚。顺便说一句:您的评论(=我添加的注释)使我想到“真的,那么简单吗?再次是我们如何在zOS中完成事情的示例... z零停机时间...”。我认为是时候开始通过类似的评论来质疑更多的问题/答案了...不要挑战我太多...

– Pierre.Vriens♦
17 Mar 7 '17 at 19:38



我不声称这是一个完整的或模型化的答案,但我没有看到其他人在房间里对大象讲话:如果您使用git“部署”您的项目,那么您“将经历一段糟糕的时光” ;)

– RubyTuesdayDONO
17年7月7日在19:40

#3 楼


问题是有没有办法从Git获得单个修订版本而没有它的历史吗?


要获得存储库,没有没有办法,主要是因为没有“修订”。 Git存储库提交,这是对先前状态的更改。
如果您想在特定时间点存储库,则必须在此时拖出提交及其所有祖先的提交,否则您将只获得在Git存储库中所做的更改。承诺。

为避免混淆:浅克隆是获取所需的历史记录,然后将其截断为可用空间,该树仍由历史记录构成。

对于解决方案,@ 7ochem回答确实覆盖了它们。