目前我正在尝试使用相同的代码为多个产品设置存储库。最好的解决方案是创建共享代码的真实库并以这种方式使用它们。然而,这需要花费很多时间。我们的想法是拥有一个包含以下树的单一存储库
-trunk-Project1
-Project2
-Shared
项目1和2都有一个外部包含共享代码。外部指向特定修订版,以便在处理project1和共享代码时不破坏project2构建。由此出现问题。
当对共享代码进行更改并且我进行提交(使用tortoise SVN)时,将为project1和共享代码选择更改,并且很好地将其作为单个修订提交给SVN。但是,当我或同事进行更新时,项目将无法构建,因为svn external指向“旧”修订版。
这可以通过更新外部并提交它来解决(让构建中断)。我们可以临时从外部删除特定修订,但是我们必须在开发结束时再次添加它。有没有办法自动执行此操作?
答案 0 :(得分:2)
我认为你有几个选择。首先是像Martin提出的那样使用带分支的单个模块。您可以为每个活动项目或开发线程分支。当您合并回主干时,将会选择对共享代码的更改。
e.g。
Module
|
+ trunk
| + Project1
| + Project2
| + Shared
|
+ branches
|
+ Project1Development
| + Project1 [active development here]
| + Project2
| + Shared [active development here]
|
+ Project2Development
+ Project1
+ Project2 [active development here]
+ Shared [active development here]
其次,您可以分支共享,这样您就不需要将外部固定到它。这就是您在存储库中的内容
Project1
|
+ trunk [svn:external to a branch of Shared]
Project2
|
+ trunk [svn:external to a branch of Shared]
Shared
|
+ trunk
|
+ branches
|
+ Project1Development
|
+ Project2Development
每个项目都会使用自己的主干视图。这里的危险是分支太长了 - 你可能需要遵守规则来合并它们并删除它们,也许是在每次发布之后。只有在需要对共享进行特定于项目的更改时,才应创建共享分支。
第三,你继续像现在一样使用外部,并承担修订的痛苦。如果你这样做的话,我会把你的回购重新排列成上面的第二个数字 - 你在项目中的外部有什么味道。
答案 1 :(得分:1)
当您有多个存储库并且需要混合来自所有存储库的源以构建项目时,您应该使用svn:external。基于你的问题,我会说你只有1个存储库,因此不需要svn:external。
你可以使用分支机构。 Project1和project2都对它们自己的分支中的共享进行了更改。您必须制定良好的工作协议,以便尽可能经常地将分支上的更改集成到主干(较小的差异更容易合并),并确保主干上的构建永远不会中断。
我可以推荐Henrik Kniberg's paper on Version Control,它很好地涵盖了这个主题。
答案 2 :(得分:0)
您的问题是Project1和Project 2需要特定版本的Shared。因此,您需要在布局中明确说明。
例如,你可以这样做:
-trunk - 项目1 - Project1Share - 项目2 - Project2Share - 共享
将Project1Share和Project2Share作为版本化外部,指向Shared的特定修订版,“Shared”是该共享库代码的最新版本。
共享模块当然可以完全不同的存储库。
由于您的子项目依赖于共享代码的特定修订,因此您无法避免管理要针对子项目构建的特定版本:因此您需要将其明确化。
如果规则是Project1始终针对特定版本的最新版本的shared和project2构建,那么project1shared external可以是无版本的,project2可以是版本化的。
答案 3 :(得分:0)
到目前为止所有的好答案 - 但还有另一种选择:使用标签。 开发完成后,您希望将外部重新链接到P1和P2,并指向新的共享项目。在此之前,您希望P1和P2指向旧的,已知的共享版本。
因此,继续使用指向HEAD Shared修订版的externals继续工作。当你完成后,将整个分支分支到一个标签目录(例如,称之为ReleaseX),它将包含所有这些版本的工作代码。那么你可以继续在主干上工作,而不必担心你打破了已发布的“已完成”版本。
如果在不同时间释放P1和P2,您仍然可以使用此方法 - 当您将项目放入标记分支时,将其外部设置为共享项目的当前版本。当下一个项目被标记(并且共享项目得到更新)时,旧项目仍将指向正确版本的Shared,直到下一个版本被标记为止等等。