从Git获取单个修订版而不获取其历史记录

89次阅读
没有评论

问题描述

在开发过程中,拥有完整的Git修订历史记录有很多好处。然而,对于我们的产品,我们使用的是不需要编译或处理的脚本语言,此时Git的历史记录变成了部署的负担。在我们的示例中,我们在每次更改后都会部署一个干净的虚拟环境,同一台机器上可能有多个部署。

有一些方法可以减少历史记录的数量,例如浅克隆,其效率取决于修订在分支中的深度;使用fetch而不是clone,但这仍然会从修订版和其之前的历史记录中获取;或者在需要时获取整个仓库,但这在磁盘空间方面是浪费的,而且往往不太可靠。

是否有一种方法可以从Git中获取单个修订版而不获取其历史记录?

解决方案

请注意以下操作可能涉及版本差异及风险,做好备份和测试。

方案1:浅克隆

你可以通过使用git clone --depth=1 <url>来进行浅克隆。这将克隆仓库并创建一个包含对象的.git文件夹,但大小会较小(根据总文件大小与历史记录大小的差异)。

方案2:Git存档

你还可以使用git-archive命令来提取仓库的存档。通过这种方式,你可以在指定的格式中创建一个存档,包含指定树的树结构,并将其写入标准输出。

以下是使用示例:

git archive --format=tar --prefix=<prefix>/ <commit_hash> | gzip > <output_file>.tar.gz

方案3:托管的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

方案4:开发实际部署方法

不要使用Git来部署你的项目,而是开发一个真正的部署方法。即使简单地将部署的脚本制作成一个归档文件,这个文件中只包含需要部署的必要文件,也是可行的。

考虑到对于没有真正”构建”步骤的脚本语言仓库,制作一个归档文件(例如tar或rpm)来发布一个构建物可能是一个简单的方式。然后,在”部署”时,解压缩归档文件或安装rpm。这将在部署链中消除对Git工具的需求(并非所有的生产服务器都会有这些开发工具)。

请注意,这并不是一个完整或理想的解决方案,但是这是一个可以考虑的方法,特别是对于脚本语言的仓库。

方案5:提取指定时间点的提交

要获取一个特定时间点的仓库状态,需要拉取该时间点及其之前的所有提交。因为Git存储的是提交,每个提交都是相对于前一个状态的变化。

请注意:浅克隆会获取所需的历史记录,然后将其截断以释放空间,但树仍然是基于历史记录的。

总结来说,上述方案中,浅克隆、Git存档和存档API是从Git获取单个修订版的方式,而不获取完整的历史记录。同时,开发实际的部署方法也是一个考虑的方向,尤其是对于脚本语言的仓库。

注意:以上操作可能涉及版本差异或风险,务必在操作前做好备份和测试。

(注:此文档中使用的示例和方案仅供参考,具体操作可能需要根据实际情况进行调整。)

正文完