版本化文件的svn写时复制语义:svn:externals用例?

版本化文件的svn写时复制语义:svn:externals用例?,svn,svn-externals,copy-on-write,Svn,Svn Externals,Copy On Write,我正在尝试创建svn分支的逻辑进程,其中较新的分支具有指向上一个分支中的文件的指针,而不是这些文件的副本。更改较新分支中的文件后,它将与较旧分支中的副本断开连接。(因此,写时复制)实际文件不是源代码,而是文本文件。我在这里探索各种可能性,并希望得到有关这一拟议布局的反馈 我们从一个典型的subversion场景开始,该场景在根级别有分支。当我们创建一个新分支时,它将作为最新分支的副本开始使用。例如: ^/branches/1/A ^/branches/1/B 分支1现在处于维护模式;第二分部继

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

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

^/branches/1/A
^/branches/1/B
分支1现在处于维护模式;第二分部继续有新的发展

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是断开连接的拷贝,而是让它们成为指针

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

从我的阅读,这可能与svn:externals。我将用脚本将分支1的目录结构复制到分支2,而不是svncopy,然后为每个包含文件的目录创建一个svn:externals属性,其中包含指向上一个分支的文件的URL

以下是我的问题:

  • 我希望不可能从Branchs/2/A中的svn:externals副本对Branchs/1/A进行更改。我认为,只有将svn:externals定义与修订挂钩才能实现这一点,这会破坏整个目的。是否有类似svn:readonly的内容?(我找不到)

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

我试图完成的主要任务是,一旦在某个分支中创建了一个文件,以后的分支总是自动对该文件进行更改。这些文件的维护者必须采取一些明确的行动来“打破这种联系”


有更好的设置方法吗?

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

有一个项目AutoMerge可以在SVN中模仿gerrit为git所做的事情


我所知道的其他SCM是StarTeam。Perforce和Mercurial可能也能做到这一点。

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

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

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

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

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

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