Svn 从CVS(NT)迁移到Subversion:What';(虚拟)模块的等价物是什么?

Svn 从CVS(NT)迁移到Subversion:What';(虚拟)模块的等价物是什么?,svn,migration,cvs,module,Svn,Migration,Cvs,Module,我们目前正在考虑从CVSNT转移到Subversion(因为我们已经在使用trac,它为SVN集成做好了充分的准备)。由于我们已经相当广泛地使用了一些不太常见的CVS(NT)特性,所以很早就出现了几个问题。这只是第一次 以下是场景: (对于不耐烦的人:我的实际问题在这篇文章的最底部,在水平尺下面。) 我们所有的“项目”都有一些共同的代码。CVS存储库中的目录层次结构看起来有点像这样(简化-希望不会太简单): 自由基 Lib1 Lib2 外部的 ExtLib1 文件 来源 ExtLib

我们目前正在考虑从CVSNT转移到Subversion(因为我们已经在使用trac,它为SVN集成做好了充分的准备)。由于我们已经相当广泛地使用了一些不太常见的CVS(NT)特性,所以很早就出现了几个问题。这只是第一次

以下是场景: (对于不耐烦的人:我的实际问题在这篇文章的最底部,在水平尺下面。)

我们所有的“项目”都有一些共同的代码。CVS存储库中的目录层次结构看起来有点像这样(简化-希望不会太简单):

  • 自由基
    • Lib1
    • Lib2
  • 外部的
    • ExtLib1
      • 文件
      • 来源
    • ExtLib2
      • 文件
      • 来源
  • 项目A
  • 项目B
…例如,ProjectA可能依赖于Lib1、Lib2、ExtLib1和ExtLib2,ProjectB依赖于Lib1和ExtLib1(实际上这可能是因为Lib1本身依赖于ExtLib1)。我们使用
CVSROOT/modules
文件对此进行建模,如下所示:

ExtLib1Full -d Lib/ExtLib1Full    External/ExtLib1
ExtLib1Src  -d Lib/ExtLib1/Source External/ExtLib1/Source
ExtLib2Full -d Lib/ExtLib2Full    External/ExtLib2
ExtLib2Src  -d Lib/ExtLib2/Source External/ExtLib2/Source

Lib1        -d Lib/Lib1           Libs/Lib1
Lib1_WDeps  -a ExtLib1Src Lib1
Lib2        -d Lib/Lib2           Libs/Lib2
Lib2_WDeps  -a Lib2

ProjectAMain -a ProjectA
ProjectALibs -a Lib1_WDeps Lib2_WDeps ExtLib2
ProjectAFull -a ProjectAMain ProjectALibs

ProjectALibs_OursOnly -a Lib1 Lib2
ProjectAFull_OursOnly -a ProjectAMain ProjectALibs_OursOnly

ProjectBMain -a ProjectB
ProjectBLibs -a Lib1_WDeps
ProjectBFull -a ProjectBMain ProjectBLibs

ProjectBLibs_OursOnly -a Lib1
ProjectBFull_OursOnly -a ProjectBMain ProjectBLibs_OursOnly
对于ProjectA的构建,构建服务器现在只需签出名为“ProjectAFull”的虚拟模块,以获取该特定构建所需的所有相互依赖的模块,甚至创建编译器喜欢的目录结构(即,外部和内部Lib都放在公共“Lib”父文件夹下)。同样,当我们想要标记包含所有依赖项的发布时,我们只需使用
cvsrtag-rTagName ProjectAFull
。在生成变更日志时,我们将仅使用
cvs rlog ProjectAFull
的输出,以避免来自外部库(我们使用
cvs import
和供应商分支维护)的提交消息污染变更日志


SVN中是否有这些虚拟模块的等价物?我应该如何在新的SVN存储库中设置目录结构以适应这种情况?每个项目和库是否应成为其自己的SVN项目(即具有自己的“主干”、“标记”和“分支”文件夹集),还是应按原样导入现有目录结构?如何定义依赖项?
我非常希望能够继续执行只会影响相关模块的单步标记/签出/日志操作。

如果您正在进行更改,请不要忘记查看。毕竟,未来是美好的

编辑:关于DVC有很多无知,这一点可以从对这一评论的反对票中得到证明,但我支持我的建议,即应该考虑它,因为问题表明正在考虑源代码管理迁移,并且Subversion是一个候选。恐怕这次我得跟船一起沉下去了

我意识到许多svn用户仍然对Linus Torvalds的说法感到恼火,他们说这是有史以来最没有意义的项目(),但撇开侮辱不谈,DVCS的优点已经足够强大,足以让Mercurial等公司采用它。即使是Subversion项目的作者也表示,越来越多的项目无法从dvcs上的Subversion中获益。

如果您正在进行更改,请不要忘记查看或查看。毕竟,未来是美好的

编辑:关于DVC有很多无知,这一点可以从对这一评论的反对票中得到证明,但我支持我的建议,即应该考虑它,因为问题表明正在考虑源代码管理迁移,并且Subversion是一个候选。恐怕这次我得跟船一起沉下去了

我意识到许多svn用户仍然对Linus Torvalds的说法感到恼火,他们说这是有史以来最没有意义的项目(),但撇开侮辱不谈,DVCS的优点已经足够强大,足以让Mercurial等公司采用它。即使是Subversion项目的作者也认为,越来越多的项目无法从dvcs上的Subversion中获益。

您看过了吗?它们似乎就是你要找的

你看过了吗?它们似乎就是你要找的

您应该看看,但请注意,我不确定我是否了解您在使用CVS做什么,因为我已经多年没有使用过CVS了

基本上,外部引用意味着您可以在项目下创建一个子目录,并将另一个项目签出到该子目录中

基本上,您可以获得以下布局:

ProjectA      - svn://server/ProjectA
  classes      (svn://server/ProjectA/classes)
  app          (svn://server/ProjectA/app)
  externals    (svn://server/ProjectA/externals)
    Ext1      - svn://server/Ext1
      classes  (svn://server/Ext1/classes)
    Ext2      - svn://server/Ext2
说明: - svn://... 是我签出的url(svn://...)是该目录的相对url,但它是母项目目录签出的一部分

注意,外部引用作为属性添加到“externals”目录中,并作为ProjectA的一部分提交到存储库中。添加这些属性后,更新或新签出将自动下载Ext1和Ext2,作为正常签出的一部分

但是,这将为您提供工作文件夹中的工作文件夹,您需要提交更改并分别对这些更改进行分支/标记。Subversion不允许您对所有这些工作副本进行修改并在一个步骤中提交它们

换句话说,如果为了向项目添加功能,您更改了ProjectA/类中的一些文件,然后在Ext1/类上添加了一些框架支持,那么您必须执行两个提交,一个用于Ext1,一个用于ProjectA


如果您想要一个实例,下面是我的C#类库的子目录:

要签出该目录,您需要指定用户名和密码,两者都应该是不带引号的“guest”

我的类库单元测试项目中的外部引用既包括“SigningKey”目录(检查主目录中的subversion属性),也包括“libs”子目录的内容(检查li上的subversion属性)