我正在开发移动应用程序(iPhone,Android和Blackberry),最近从SVN转换为Git。
在我发布版本后的SVN中,我标记相关的分支/修订以确保其状态被保留,然后我将一个目录添加到此标记并放入已发布的二进制文件中,并且(对于iPhone)调试符号文件也是确切的构建(用于表示以后的任何崩溃报告)。这些文件不需要进行版本控制,但它是一个方便的位置,可以将历史工件与代码一起存储,以确保它们得到备份(SVN具有备份策略,而CI服务器上的构建则不会)。 / p>
我正试图找出Git中最好的等价物。可能最接近的是创建一个新分支,添加二进制文件,标记它,并删除分支。但是,我想知道是否有更好的方法可以做到这一点?
理想情况下,我想创建一个标记,然后将二进制文件作为未版本控制的文件附加到标记中。这样,它们实际上不会出现在源代码树中,但它们存在于存储库中,与标记关联,以供有权访问存储库的任何人进行检索。在Git中有什么相同的东西吗?
答案 0 :(得分:6)
VCS不是存储任何传递元素(如二进制文件)的理想位置,主要是因为:
交付更好地存储在人工制品库(例如Nexus)中,其中checksum键(SHA1,MD5)将自动计算并与这些交付相关联,确保您可以将它们取回在检查其完整性的同时将它们用于生产中。
这意味着有一个单独的存储库(来自VCS存储库)以便管理这些元素。
如Useless的answer中所述,您可以使用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的文件当前可以轻松处理时,无论是由于内存,时间还是磁盘空间的限制,它都很有用。
答案 1 :(得分:2)
git notes
的联机帮助页描述了如何使用它们将任意二进制blob与对象相关联。想要一个链接,还是足够继续?
答案 2 :(得分:0)
作为@VonC says VCS不适合存储未版本化的二进制文件。
要仅使用git解决问题,您可以为人工制品创建单独的git存储库,并添加将其重新创建为submodules所需的源存储库。
在每个公开发布中,将新的工件提交到存储库并更新子模块引用。子模块指向直接提交,因此您始终知道哪些源创建了特定的工件。
一般来说,git子模块使用起来非常混乱,但在这种有限的情况下(没有分支,没有直接编辑子模块)它们可能很有用。
当心git不太适合管理大二进制文件。请参阅Managing large binary files with git。