呼吁洞察:修订控制和二进制文件

时间:2010-11-21 08:24:56

标签: git version-control mercurial

人类编写源代码

版本控制用于记录源代码中的更改

工具处理源代码并生成机器可读的东西(exec,libs,GUI代码等)

每隔一段时间我就想保存一份工具'输出(例如保存ARM的beta版本的可执行文件)。我可以手动保存工具'输出,为其指定一个反映修订控制历史记录中的点的名称(例如,使用标记名称)。这看起来很尴尬,容易出错。

我想深入了解两件事:

  1. 使用修订控制在修订历史记录图表中的特定位置存储工具生成的输出的优缺点是什么?您使用哪些非RCS工具作为替代方案?

  2. 在mercurial,git中,在特定修订中包含工具生成的输出的最佳方法是什么?

2 个答案:

答案 0 :(得分:8)

我认为二进制文件不应与其源代码一起存储在版本控制中。

缺点:

  • 它鼓励大型项目中的错误构建实践。最佳实践是完全自动化完整构建(不仅包括源代码编译,还包括运行自动化测试,文档打包,生成设置等)。提交二进制文件使您可以忽略:“只需手动为已更改的部分进行构建”。
  • 较慢的更新和提交
  • 每次执行构建后都需要处理二进制文件冲突
  • 提交哪些更改源代码而不是相应的二进制文件将导致开发人员之间的混淆。你如何发现存在不匹配?
  • svn update将更新二进制文件的时间戳,使您的构建工具混乱,错误地认为二进制文件比源代码更改更新。
  • 它在存储库中使用更多磁盘空间。 (根据您的项目,这可能是微不足道的。)

一般来说,我认为你应该避免提交任何以确定的方式从其他版本化资源自动生成的内容。没有冗余 - >没有机会出现不一致的情况。

相反,使用持续集成服务器在每次提交时自动重建(并运行测试)。如果需要,让这个构建服务器在某个地方(SVN外部)发布二进制文件,就像网络上的共享文件夹一样。

答案 1 :(得分:4)

我建议不要将二进制文件与DVCS混合(例如git和Mercurial)。主要原因是:任何不可合并的文件都是DVCS的问题。 DVCS从根本上依赖于高质量的文件合并,以实现DVCS的概念(见this discussion on binary files in git)。

我同意二进制文件值得存储。但它们应该存储在与源版本控制系统不同的位置。也许是具有受控写访问权的服务器。如果要保留所有历史记录,可能是单独的集中式VCS存储库,例如Subversion。

为了避免这种分离像你说的那样“笨拙且容易出错”,尽量让它自动化。创建一个自动构建过程,确保源版本化/标记,完成构建,并将输出(正确命名,版本化,标记等)放入指定的存储区。