我负责几个(相当小的)程序,它们通过不同的库共享大量代码。我想知道最好的存储库布局是什么来开发不同的prorgrams(和库),并使库在所有程序中保持同步。
为了论证,我们假设有两个带有两个库的程序:
当然,库的错误修复和增强应该(最终)合并到所有程序。由于在处理不同程序时正在处理这些库,因此使用externals definitions似乎是不可能的。
所以我认为除了vendor branches之外,我的所有图书馆都在一个地方,但我不确定这个的最佳布局是什么。
我正在思考以下几点:
然后说开发Program1时对Library2进行了一些更改,我将它们合并回存储库的Libraries部分,并在需要时将它们从那里合并到所有其他程序。
合并到其他程序并不总是立即发生,在Program2上工作的人可能接近发布,而是首先完成,创建标记,然后才更新所有库。
我有点担心这会在一段时间后导致许多合并和一些维护问题,但我真的没有看到更好的解决方案。
然后,这对我来说似乎是一个相当常见的用例,所以我想我只是问一下stackoverflow社区,实现这个目的的最佳存储库布局是什么?
答案 0 :(得分:9)
嗯,我想我不同意外界是不可能的。我过去也遇到过类似的问题。我使用svn属性externals解决了它。
创建库存储库:
svnadmin create /path/library1
svnadmin create /path/library2
...
创建客户端存储库:
svnadmin create /path/program1
svnadmin create /path/program2
...
现在将库声明为程序存储库中的外部:
cd /path/program1
svn propset svn:externals "library1 svnpath://wherever/library1/trunk/" .
svn propset svn:externals "library2 svnpath://wherever2/library2/trunk/" .
现在,您可以更改程序1& 2并在这些项目的根目录下进行提交不会影响库...但是,如果您需要对库进行更改,则可以。然后当且仅当您对库存储库具有写权限时,您也可以提交这些更改 - 但仅限于库的子目录。
即。这不是对图书馆的承诺......
... make a change in /path/program1/library1 ...
cd /path/program1
svn commit -m "some change"
这将提交上面库中所做的更改:
cd /path/program1/library1
svn commit -m "change to library code"
答案 1 :(得分:1)
为什么库的源必须存在于程序树中。单独编译库并将它们链接到您的程序中。