将二进制文件提交到SVN

9

我搜索了一下,但没有找到令人满意的答案,所以我想听听你们对此的看法。

我有几个工具需要定期更新和部署到几台服务器上。源代码存储在SVN仓库中。

为了避免通过FTP或类似方式将二进制文件复制到生产服务器(我没有在服务器上构建项目的手段),我考虑在仓库中创建一个区域来提交它们。这样,每当我需要它们时,我可以从svn服务器检索可执行文件的最新版本。

由于我不一定想在每次处理源代码时都更新/提交二进制文件,因此我不会将存储二进制文件的文件夹创建为项目的子文件夹。提交二进制文件应该是一个单独的、有意识的行为。

--- trunk
    --- project1
    --- project2
--- built
    --- project1
    --- project2

据我所知,这种设置应该没有问题。我真正想要的是给源代码版本和二进制文件都打上一个标签,以便一次性检索所有属于同一组的内容。
--- tags/project1/release2/ 
         includes files from 
--- trunk/project1/ revision 487 and
--- built/project1/ revision 488 

我想知道我所追求的是否可能,以及我该如何实现它? 或者我应该寻找解决这个问题的其他方法吗?

可能是[SVN和二进制文件]的重复问题(https://dev59.com/gHVC5IYBdhLWcg3ww0Hr)。 - Dour High Arch
5个回答

9
你的设置并没有什么奇怪的地方(当我需要保留精确位时,我也会使用构建工具和构建工件)。你想要的布局肯定是可行的——要在tags/project1/release2中“包含”其他分支或标记的特定版本,您只需要在tags/project1/release2上设置svn:externals属性,引用您想要拉入的源URL和修订版本,然后就可以了。

5

虽然我不能直接回答你的问题,但我可以告诉你一种替代方法。

我们有一个专门的文件服务器用于二进制发布,备份策略类似于SVN服务器,并且每个项目都有一个目录,包括不在SVN中的任何项目相关内容,包括一个发布目录。整个二进制发布历史记录都存储在此目录中,因此您可以从任何地方获取二进制文件(在我们的网络内),而无需使用SVN,即将其复制到某些生产服务器,发送给客户或下载以在VM中进行测试。无需检出或重新构建。

我发现这种设置比将二进制文件提交到SVN中更容易管理。如果您需要具有特定版本的确切二进制文件,则只需提供该版本即可(但是,为什么需要从未见过阳光的二进制文件呢?)。


2

我认为这可以通过使用"外部文件"来处理。不过,这样做存在一些问题,而且我还没有找到自己满意的解决方案。对于我的源代码库,我会按照你的建议进行操作,但我仍然需要手动完成。


1

虽然从技术上讲,这种方法完全可行,但我个人不会使用SVN来存储二进制文件。

我有两个原因:

首先,我认为SVN遵循了CVS的步伐,并没有存储二进制差异,但事实证明我错了。无论如何:

0)“从技术上讲”,您不需要将生成的文件存储下来,因为如果需要,它们可以重新构建。显然,在现实生活中,这是不切实际的,但在我看来,您仍然应该考虑“如何为生成的内容构建缓存”。 SVN并不真正适合这种用法模式。这不是一个独立的观点,但我的意思是,“将某些东西放入SVN意味着您关心它并希望对其进行归档”-如果您不关心它,您不应该传达这个信息,无论是隐含还是明示。

1)这很烦人。如果有人检出您的repo顶部,他们也会得到所有的二进制文件。如果您有超过一兆或两兆,这将使人们不得不等待那些东西(并使用他们的磁盘空间),而没有任何好处。这可以通过设置单独的存储库来解决,但一旦您这样做了,在我看来,您可能会考虑设置单独的Web服务器。

2) SVN 旨在永久保留所有文件。从存储库中完全删除东西非常繁琐耗时, 这使得存储不必要的内容成为值得商榷的做法。

我建议您使用 Web 服务器来存储二进制文件,而不是使用 SVN(毕竟 SVN 就是一个 Web 服务器**)。您可以将尽可能多的旧二进制文件保留在服务器上并备份,但是一旦不再需要它们,就可以将其删除。

** 是的,我知道它使用 DAV,因此实际上它并不只是一个普通的 Web 服务器,但是从向生产机器部署的角度来看,这个过程是“我使用 http 从 http://blah 下载一些文件”,因此它可能也是一个Web服务器。


@Orion Edwards:1)事实上,我认为那不是正确的。SVN只存储差异,而不考虑文件内容(文本/二进制)。1b)这正是我建议的结构的原因,不将二进制文件存储为我的项目的子文件夹,而是在存储库的自己独立区域中。这样,您只在真正需要它们时才会得到它们。 - Tom Juergens
1
@Orion Edwards:下次发帖前请确保您仔细核对事实;来自:http://subversion.tigris.org/faq.html#binary-files “Subversion使用一种差异化方法,可以同样适用于二进制和文本文件”。 - Miquella
就像米奎拉指出的那样,SVN非常擅长处理二进制差异。版本化二进制文件所占用的空间远远不如你想象的那样大,并且根据你的链接器(增量),它们可能会很好地进行差异比较。此外,SVN绝不是“Web服务器”。你混淆了SVN和DAV。 - Mihai Limbășan

0

不确定为什么您不想将二进制文件放在trunk/project1/binaries树下? 话虽如此,您可以让树看起来像这样:

  • trunk
    • project1
    • project2
  • built
    • project1
    • project2
  • tags
    • project1
    • <tag id>
      • <code as usual>
      • binaries

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