将二进制文件附加到Git标签

6
我正在开发移动应用程序(iPhone、Android 和 Blackberry),最近从 SVN 转换到 Git。
在 SVN 中,我发布后会给相关分支/修订版本打标签,以确保其状态得以保存,然后我会添加一个目录到该标签中,并放入已发布的二进制文件和(对于 iPhone)该精确构建的调试符号文件(以便稍后解释任何崩溃报告)。这些文件不需要进行版本控制,但将它们与代码存储在一起是为了方便存储历史文物和确保它们备份(SVN 有备份策略,而我的 CI 服务器上的构建则没有)。
我正在尝试找到 Git 中最佳的等效方法。可能最接近的方法是创建一个新分支,添加二进制文件,打标签,然后删除分支。然而,我想知道是否有更好的方法来做到这一点?
理想情况下,我想创建一个标签,然后将二进制文件作为未经版本控制的文件附加到标签上。这样,它们实际上不会出现在源代码树中,但它们存在于仓库中,与标签相关联,可以由任何具有访问权限的人根据需要检索。在 Git 中是否有类似的东西?
3个回答

7

VCS并不是存储任何交付元素(如二进制文件)的理想场所,主要原因是:

  • 它们无法从VCS的功能(分支、合并、差异等)中受益
  • 一个DVCS(分布式VCS)会在每个发布版本时使其repo的大小大幅增加,这将使得克隆该repo变得非常麻烦。

交付件最好存储在构件库中(例如Nexus),其中校验和键(SHA1、MD5)将自动计算并与这些交付件关联,确保您可以在生产中获取它们并检查其完整性。

因此,需要有一个单独的仓库(与VCS不同)来管理这些元素。


Useless答案中所述,您可以使用git notes将二进制blob与git对象(包括标签)关联起来。

原则上,注释是一个常规的Git blob,并且接受任何类型(非)格式。您可以使用git hash-object从任意文件二进制安全地创建注释:

$ cc *.c
$ blob=$(git hash-object -w a.out)
$ git notes --ref=built add -C "$blob" HEAD

唯一的问题是仓库的大小可能会失控,如果这些笔记不经常清理。
另一种方法是使用git-annex,它允许将一个git提交与一个外部内容(指可以是二进制文件,尺寸可以任意大)关联起来。

git-annex允许管理git中的文件,而不需要将文件内容检入git。
虽然这看起来似乎矛盾,但在处理比git当前能够轻松处理的文件更大的文件时非常有用,无论是由于内存、时间或磁盘空间的限制。


3
<代码>git notes的手册描述了如何将任意二进制blob与对象关联。需要链接吗,还是这已经足够了?

0

正如@VonC所说,版本控制系统不适合存储未经版本控制的二进制文件。

为了解决这个问题,您可以仅使用git创建一个单独的git存储库来存储构件,并添加需要重新创建它们的源存储库作为子模块

在每个公共发布中,将新的构件提交到存储库并更新子模块引用。子模块直接指向提交,因此您始终知道哪些源代码创建了特定的构件。

总的来说,git子模块非常令人困惑,但在这种有限的情况下(没有分支,没有直接编辑子模块),它们可能很有用。

请注意,git不太适合管理大型二进制文件。请参阅使用git管理大型二进制文件


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接