2

我正在尝试创建 svn 分支的逻辑进展,其中较新的分支具有指向前一个分支中的文件的指针,而不是这些文件的副本。一旦您在较新的分支中更改了文件,它将与旧分支中的副本断开连接。(因此,写时复制)实际文件不是源代码,而是文本文件。我正在探索这里的可能性,并希望对此提议的布局提供反馈。

我们从一个典型的颠覆场景开始,在根级别有分支。当我们创建一个新分支时,它将作为最新分支的副本开始生命。例如:

^/branches/1/A
^/branches/1/B

分支 1 现在处于维护模式;分支 2 继续进行新的开发。

svn copy ^/branches/1 ^/branches/2

产量

^/branches/2/A (a copy of ^/branches/1/A)
^/branches/2/B (a copy of ^/branches/1/B)

我想要的是,不是让 A 和 B 成为断开连接的副本,而是让它们成为指针

^/branches/2/A -> ^/branches/1/A
^/branches/2/B -> ^/branches/1/B

因此,分支 2 中的文件 A 无缝地“跟踪”分支 1 中的文件 A。当分支 2 中的文件 A 必须与分支 1 中的文件 A 不同时,我们“断开链接”,创建一个实际的副本文件,然后从那里开始。

根据我的阅读,这可能与 svn:externals 一起实现。而不是 svn copy,我会编写脚本将分支 1 的目录结构复制到分支 2,然后对于每个包含文件的目录,在该目录上创建一个 svn:externals 属性,其中包含指向前一个分支的文件的 URL。

这是我的问题/问题:

  • 我希望不可能从分支/2/A 中的 svn:externals 副本更改分支/1/A。我相信这只有通过将 svn:externals 定义与修订联系起来才有可能,这违背了整个目的。有没有类似 svn:readonly 的东西?(不是我能找到的)

  • svn:externals 定义不是递归的。换句话说, ^/branches/3/A -> ^/branches/2/A (它本身指向) -> ^/branches/1/A 是不可能的。当有 3 个分支时,3 和 2 必须都明确指向分支 1。

我想要完成的主要事情是,一旦在某个分支中创建了文件,进一步的分支总是会自动更改该文件。这些文件的维护者必须采取一些明确的行动才能“破坏该链接”

有没有更好的方法来设置它?

4

2 回答 2

2

这种写时复制功能是 FSFS 数据库在下面所做的,但不通过客户端/服务器公开。

有一个项目 AutoMerger 可以在 SVN 中模拟 gerrit 为 git 所做的事情。https://github.com/liveperson/Auto-Merger

我所知道的其他本地执行此操作的 SCM 是 StarTeam。可能 Perforce 和 Mercurial 也可以做到这一点。

于 2013-10-24T18:32:56.407 回答
0

最后,我决定不采用这种方法,原因如下:

  • 重量级分支 - 是的,它可以编写脚本,但这需要维护,本质上意味着脚本编写者负责创建分支

  • 从一个分支到另一个分支重新组织文件/目录变得非常复杂。

  • 没有“递归外部”之类的东西。每个连续分支中的每个副本都必须指向实际文件。见第 2 点。

相反,我将采用类似于(但不是)AutoMerger 的自动合并方法。

于 2013-10-29T16:15:05.137 回答