我正在将客户端的SourceSafe存储库(3个项目)迁移到SVN,其中两个项目共享源文件。 (这些项目是单独的产品 - 具有不同的名称和发布版本等)
SVN解决了这个缺点吗?人们通常如何处理这种情况?
我知道/可以想到的选项
使用外部或外部或任何SVN。我听说由于各种原因这不是一个好的选择
创建一个包含源的新项目(可能称为共享)。这个问题是我们仍然需要获取该代码(它不是一个库)并以某种方式将其导入项目中。可以证明它与上面的问题相同,它引入了额外产品/项目的开销。
只需签入两个存储库中的文件并交叉更新它们即可。这需要开发人员了解共享并记住签入。我想我可以编写一个脚本来检查所有已知的共享文件,并在需要时更新它们。
为共享的两个项目提供一个存储库。这让我不得不创建一个包含两者的顶级项目/存储库的问题,这是标记的问题。我真的不想标记顶部的伪项目。 (标签,行李箱和分支机构并不是我想要它们的地方。)
我可能会选择最后一个选项。
还有其他意见吗?
答案 0 :(得分:9)
我不知道你究竟听说过svn:externals,但我认为你应该在这里使用它。您甚至可以指定外部指向共享源的稳定分支或发布标记,甚至指向使用它的其他两个项目中的两个不同的标记(如果您在共享代码中修复了一些错误,可能需要这样做)对于项目A,但您没有足够的时间用项目B)完全测试它。
你可以做的最糟糕的事情是你的选择3(交叉更新相同文件的两个版本)。
答案 1 :(得分:6)
安全的方法是让第三个项目将共享源构建到另外两个使用的库中。图书馆项目拥有自己的SVN存储库。
您甚至可以使用只是标题的共享文件来执行此操作,只需将它们保留在lib项目目录中,然后将其添加到包含列表中。
在两个项目中拥有相同的文件,即使有了控制权,迟早也会遇到麻烦!
答案 2 :(得分:4)
答案 3 :(得分:2)
当然,使用一个存储库。稍后可能会有更多共享代码。
标记的问题究竟是什么?所以你在标签中有一个额外的文件夹,但它不会花费你的空间。如果你真的不想要这个额外的文件夹,这里有一个组织树的想法:
也就是说,当你想标记prj1时,你创建了tag1,然后复制prj1并共享它。
答案 4 :(得分:1)
根据我的经验,有两个独立项目引用相同的源文件是有问题的,因为我可以在共享文件中添加或更改代码,以满足一个项目的需要,只是为了打破其他构建。
这里的诀窍似乎是允许每个项目独立前进,所以无论你设置你的存储库,你都希望稳定共享代码,使它只在你想要的时候改变。
例如,如果共享代码位于同一存储库的两个分支/文件夹中,或者如果它分别检查到两个不同的存储库中,或者如果它本身位于第三个存储库中,则需要升级该步骤一段代码是一个没有副作用的手动代码,你可以隔离,调试和修复错误。
我已将此代码分解到第三个存储库,然后我定期将该代码迁移到我的依赖项目存储库中作为内部发布和升级步骤;然后我的个别项目有一个看起来像“升级到Shared.App.dll的v4.3.345”的修订版,其中包括对该版本起作用所需的所有更改。
如果共享代码是与两个依赖项目相同的存储库的一部分,则在每个项目中都有一个单独的副本,并使用存储库合并来传播您的更改。
答案 5 :(得分:1)
您没有提到您正在使用的语言或构建工具,但对于Java项目,Maven可能值得研究。其中一个特性是本质上扩展了ant,允许你引入外部依赖。这减轻了您对必须创建,维护和标记元项目的担忧。它还允许您从外部项目的HEAD中提取,或者从给定标记中提取,这可以减轻先前海报关于在项目之间共享公共文件以及无意中导致破坏的问题之一,因为您可以控制每个项目何时使用独立的较新版本的共享文件。
答案 6 :(得分:0)
使用触发器更新文件听起来不错。他们会以某种方式失去同步。实际上,共享代码的解决方案是将其解压缩到库中,并在多个解决方案中使用该库。但这听起来超出了你的项目范围,所以最后的解决方案是你最好的选择。
答案 7 :(得分:0)
为这两个人准备一个存储库 共享的项目。这让我失望了 有问题必须创建一个 顶级项目/存储库 包含这两个,这是一个问题 用于标签。我真的不想 标记顶部伪项目。 (该 标签,主干和分支的东西都没有 我想要的确切位置。)
和其他人一样,我肯定会这样做。你只想拥有一个存储库,你觉得有什么问题?存储库是关于管理员权限。除此之外,我会看到一个回购中有任意N个项目。