如何防止Subversion合并二进制文件?

3
我们需要将.dll文件保存在代码库中。我们的团队经常遇到有关.dll文件的SVN冲突问题,这非常令人烦恼。尽管设置了.dll文件的mime类型为application/octet-stream,但由于某种原因,SVN仍然尝试合并它们。
根据我在这里找到的信息(我发誓以前的情况是如此),只要mime类型不是文本,SVN就不会尝试合并它们。但是查看我的dll文件告诉我,SVN也在合并我的application/octet-stream文件(至少我认为是SVN在合并,不确定为什么没有合并就会出现冲突)。 SVN为什么要尝试合并二进制文件?这太蠢了...
是否有人遇到这个问题?
我的目标是找到一个解决方案,允许二进制文件成为代码库的一部分,但永远不会有冲突。我希望SVN只需用最新的二进制文件替换旧的就可以了。
请不要讨论我是否应该将二进制文件放入代码库中-我必须这样做,而且不想遇到冲突问题。
附带说明:我同时使用Tortoise 1.5.0和Ankh。

不是答案,只是重新阐述似乎在您的环境中违反的政策:http://subversion.tigris.org/faq.html#binary-files - Michael Petrotta
2
你怎么知道它正在尝试合并它们?冲突并不意味着它正在尝试合并它们。 - Sander Rijken
1
我只是假设他们正在尝试合并,因为有些更新不会造成冲突,而有些会。我希望停止冲突 - 如果无法比较/合并,那么冲突的意义不确定。 - Mario
1
谢谢你指出那个政策,Michael。在我发布之前,我已经找到了它,但它并没有提到任何有关冲突二进制文件的内容。 - Mario
有一个提交钩子,可以防止检入没有锁定的二进制文件。svn:lock会告诉AnkhSVN自动锁定二进制文件。作为副作用,如果您锁定了一个文件,另一个人将无法修改和检入此二进制文件而不先将文件签出。同时,您已经将其签出。与Source-Safe或TFS非常相似。但是如果需要,您可以窃取锁定。pre-commit-hook - TamusJRoyce
5个回答

3
为了确保我正确理解您的意思,让我们重新概括一下:
  • 您在svn中检入了二进制文件
  • 这些文件可以在客户端和存储库中进行更改
  • 每当两者都发生更改时,应该选择存储库的更改
据我所知,svn的做法是:
  • 对二进制文件运行' svn update --accept theirs-full '
  • 在整个本地副本上运行常规的'svn update'
我认为这不能用一个命令完成,也不应该用一个命令完成,因为第一个命令可能会丢失有价值的数据。

文件在代码库中永远不会更改,它们只有在客户端更新存储库中的文件时才会发生更改。由于它们是二进制文件(例如Word文档或图表),因此永远不应该合并它们,而是应该直接替换。也许我描述这个问题不够准确,但我想做的就是让svn永远不要尝试合并,而是获取二进制文件的最新版本。 - Mario
这正是此答案所描述的内容;--accept theirs-full 会在有新的更改时丢弃任何本地更改。这意味着,如果您有一个修改过的 Word 文档,而其他人也对其进行了更改,并且您使用 svn update --accept theirs-full 命令,则您的版本将被覆盖,更新为同事的版本。 - Sander Rijken

1

我们在某些文件上遇到了同样的问题。

CVS很好地处理了这个问题,但不幸的是,我的公司正在转向Subversion。

某些配置文件每次运行应用程序时都会被修改,但当开发人员检入新更改时,我们希望它们始终覆盖用户存储库。

.CVSwrappers文件中,输入*.fileext -k b -m COPY。这告诉CVS始终在本地存储库中制作文件的备份副本,并在冲突时下载新版本。如此优雅。

SVN没有相应的设置。如果有人知道如何设置,请发布一下。


1

如果文件在服务器上和本地同时被更改,显然会发生冲突。当然,更新工作副本包括更新二进制文件,因为它们是版本的一部分。这并不意味着svn试图合并它们,但你肯定会得到一个冲突。如果这些文件经常更改,我猜它们也经常被生成--可能是编译器输出文件。这样的文件根本不应该存在于代码库中。

如果您需要存档发布的二进制文件(或类似文件),则应该在标记或发布分支而不是主干上进行。


标记源代码就足以重新创建二进制文件。归档二进制文件不是源代码控制的任务。 - Sander Rijken
虽然我完全同意这一点,但公司/经理们似乎有不同的想法。至少从我的经验来看,这就是我的评论所在之处。 - bluebrother
1
你可能不想经常重新编译核心库。所以在这些情况下,我认为将dll放入svn中是有意义的。 - Ryu
1
这并没有回答我的问题 - 我需要将二进制文件放入svn而不必创建标签或主干。这也没有解释为什么有时它们不会冲突,只是被替换,但其他时候它们会冲突。还有更多的想法吗? - Mario
也许你应该解释一下为什么需要将二进制文件放入主干。这样可能有可能找到其他解决方案来解决你的问题。如果你经常遇到二进制文件冲突,那么你的存储模型似乎不适合你的问题。至于另一个问题:如果没有冲突(即两个文件在二进制级别上完全相同),它们将被替换。如果重新构建dll并且结果与svn中的文件完全相同,则在svn中更新文件时不会发生冲突(因为它只在一个位置更改)。 - bluebrother

0

你确定它正在尝试合并它们吗?听起来更像是因为Subversion不知道如何合并它们而导致冲突(无论如何,你也不希望它这样做)。

如果你有一个本地修改的dll文件,而另外一个人在你之前提交了相同的dll文件,你希望发生什么?你期望发生什么?这显然是一个冲突,Subversion不知道你想使用你的dll文件还是他们的dll文件。


1
由于它们是二进制文件,我希望 SVN 更新它们,就这样。没有冲突,不尝试合并 - 什么也不做。只需用最新的文件替换它。 - Mario
在这种情况下,您可能可以编写一个预提交挂钩脚本,检查冲突,如果找到冲突,则使用更新的文件解决它。不幸的是,我从未编写过挂钩脚本,所以在那方面无法提供太多帮助。 - Niki Yoshiuchi
一个预提交钩子脚本无法解决这个问题,因为这是一个服务器端脚本。冲突和合并发生在客户端更新时。 - Sander Rijken

-1

这些dll文件,它们是实际项目的构建输出吗?

如果是这样的话,它们根本不应该放在svn中。Subversion应该只包含源文件,而构建服务器/开发机可以从那里构建dll。


2
我宁愿保持这个话题——如何防止冲突的二进制文件。 - Mario
不必要时不给构建输出版本控制是防止二进制文件冲突的好方法。 如果您的副本和服务器上的副本都已更改,则无法防止冲突。 - Sander Rijken

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