我建议以下布局,都在同一个存储库:
App1\
trunk
tags
branches
App2\
trunk
tags
branches
App3\
trunk
tags
branches
LibraryA\
trunk
tags
branches
LibraryB\
trunk
tags
branches
LibraryC\
trunk
tags
branches
LibraryD\
trunk
tags
branches
现在,我让你发布时间表几个假设。我假设每个应用程序和库在不同的时间表下发布。实际上这是最坏的情况,但是我的方案会允许这样做。每个应用程序都需要预编译它的依赖关系,并将其包含在存储库的目录中。下面是应用1会怎么看,因为它有图书馆B和C的依赖关系:
App1\
trunk\
deps\
LibraryB, release 1.1
LibraryC, release 4.3
tags
branches
这意味着只要您支干线你会得到必要的库一起,大大简化了操作。注意它是库的已编译二进制文件,而不是其源文件。
trunk的一个分支将使用上述版本,并且由于您不允许修改它们,因此需要将任何错误修正放入App1中。同时,要使用LibB & C的新版本,您可以在图书馆团队发布时在trunk中更新它们的版本。因此,一段时间后,你的仓库可能是这样的:在树干
App1\
trunk\
deps\
LibraryB, release 1.3
LibraryC, release 4.4
tags\
release-1.0\
deps\
LibraryB, release 1.1
LibraryC, release 4.3
branches\
stable-2.0\
deps\
LibraryB, release 1.2
LibraryC, release 4.2
工作被允许使用最新的库版本。版本1.0使用的是固定版本(此处最早的版本),而稳定分支使用的是以前版本的库。
上述方案是我在最后一位雇主身上想到的,但从未执行。为了使它工作,你需要有一个分解成应用程序/库的代码库,开发可以并行进行。对我们来说情况并非如此。但我坚信这是一个有价值的目标。
祝你好运!
P.S.我强烈建议针对 svn:外部。他们可以使分支管理变得更加困难。例如,如果一个外部变化和一个分支依赖于它,你就有可能搞乱那个分支(例如使它不可编译)。
不错的答案杰克,感谢您花时间写下它。 – 2011-01-06 09:45:06