我使用 svn 来处理我与其他几个开发人员一起工作的项目。Svn 对于源代码控制工作得很好,但是当我们提交 dll 时,我们总是会遇到冲突。

当我这样做时,我解决了冲突(这会删除我的 dll,因为 diff 程序无法处理二进制文件),然后必须重建才能提交。你打算如何解决这样的冲突?

编辑:

这些 dll 位于单独的 svn 文件夹中,因为该项目是一个游戏 mod,非程序员需要访问最新版本。

有帮助吗?

解决方案

正如其他答案中提到的:你不应该首先对生成的 dll 进行版本控制。但如果你真的 对它们进行版本控制,然后您可以解决冲突,而无需使用 diff 工具来删除您的 dll 文件:

对于每个冲突文件,Subversion 会在您的工作副本中放置三个额外的未版本化文件:

文件名.我的

这是您更新工作副本之前存在于工作副本中的文件,即没有冲突标记。该文件仅包含您的最新更改。(如果 Subversion 认为该文件不可合并,则不会创建 .mine 文件,因为它与工作文件相同。)

文件名.rOLDREV

这是您更新工作副本之前的基本修订版文件。即,您在进行最新编辑之前签出的文件。

文件名.rNEWREV

这是您更新工作副本时 Subversion 客户端刚刚从服务器收到的文件。该文件对应于存储库的 HEAD 修订版。

这里 OLDREV 是 .svn 目录中文件的修订号,NEWREV 是存储库 HEAD 的修订号。

现在,要解决此类冲突,请删除您不需要的其他文件:

  • 如果你想保留自己的dll,请删除文件filename.rOLDREV、filename.rNEWREV
  • 如果要从存储库中保留 dll,请删除文件 filename.rOLDREV 和 filename.mine,然后将 filename.rNEWREV 复制到 filename

之后,执行

svn resolved filename

告诉 Subversion 您自己解决了冲突。

其他提示

如果它是你正在构建的DLL(而不是你没有源代码的外部源代码)那么源应该在源代码控制中,而不是二进制代码。

如果您不想将其包含在该特定存储库中,则可以将其包含为svn:external。

通常,您根本不会将自己编译的 DLL 存储在源代码管理中。您有需要这样做的具体原因吗?

我设置了我的开发环境,以便任何人都可以独立于其他人构建我的任何项目组件。这样,我的源代码控制系统中唯一的东西就是我的 来源 代码。这样做有很多好处:

  • 尝试签入 DLL 或 EXE 时避免二进制文件冲突
  • 源代码控制系统跟踪的数据量要小得多,速度更快
  • 当开发人员总是构建自己的 DLL 时,他们可以合理地确定他们拥有的源代码与编译的文件相匹配。如果您使用的是其他人构建的东西,那么您永远无法确定。

正如评论中提到的,将第三方 DLL 存储在源代码控制系统中是完全合理的,特别是如果您实际上没有它们的源代码。我还参与过存储分发文件的项目(.tar.gz 等)对于源代码控制中的各种开源库,然后有一个完整的系统 Makefile建造的 那些 库作为构建一切目标的一部分。

对于二进制文件,大多数情况下,您希望接受它的任一版本。例如,如果有问题的文件是可执行工具,那么通常一个版本可能比另一个版本更新,并且可能是您要使用的版本。

要接受您要合并的分支中的版本,请使用:

svn resolve --accept=theirs-full path/to/filename

要接受以前在当前分支中的版本,请使用:

svn resolve --accept=mine-full path/to/filename

有时,SVN会拒绝使用 theirs-full 并发出警告:

svn:warning:W195024:为冲突路径提供了不适用的冲突解决方案

因为在合并时SVN是一块糟糕的东西。在这种情况下,您必须手动复制文件,如接受的答案 https://stackoverflow.com/a/410767/2279059,而不是使用针对您尝试执行的操作的命令行选项。如果你知道两个文件都是相同的(但SVN仍然因为已经说明的原因将它们标记为冲突),你也可以使用

svn resolve --accept=working path/to/filename

虽然这在相同文件的情况下实际上与所有其他命令相同,但SVN不会怯懦地拒绝执行它。这有意义吗?不,它没有。处理它。

在版本控制中也有二进制文件是合理的:

  • 它避免了只使用二进制文件的人重建的麻烦。

  • 当你发布时,二进制文件就被确定了。

为了使这项工作正常进行,二进制文件需要始终与源相对应。因此,如果您合并了来源,则需要从它们中重建二进制文件,从合并版本中挑选其中一个二进制文件,则不会。

确保您的dll将 svn:mime-type 属性设置为 application / octet-stream 或其他一些非文本类型。

svn propget *.dll
svn propset svn:mime-type application/octet-stream *.dll

发生冲突时,您仍然必须解决冲突。

并检查文件内容类型文档章节。

因此,如果您将* .dll放在一个单独的文件夹中,则更容易完成,如下所示:

  1. 在您构建更改更新之前,* .dll文件夹更好地更新您的源,如果您信任,您的同事只提交可编译的源代码。 (如果发生冲突(当你在更新到最新修订版之前更改了某些内容时,那将是你的错))
  2. 做你的构建。
  3. 直接提交结果。
  4. 可替换地:

    不要构建到目录中的路径,构建到外面的某个地方,直到你对任何结果感到满意为止。

    然后按以下步骤进行:

    1. 更新dlls文件夹的工作副本(如果您的错误存在任何冲突并通过“保留他们的”来解决冲突)
    2. 将您的工作.dll复制到工作副本
    3. 告知您的同事您将提交新版本(您可以放弃此步骤)
    4. 如果有任何冲突,请提交您的工作,这应该是他们的错。
    5. 现在有两种可能性:

      5a上。你是一个非常可憎的人,通过保持我的方式解决问题。

      5b中。你的工作应该工作...阅读日志文件,找出在短时间内你需要将工作复制到文件夹并按下提交的人。跟那位同事说话。同意进一步的行动方案。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top