库的子存储库



我正在做几个PHP项目。一个是应用程序,另一个是支持该应用程序的库。以前我使用的是mercurial设置,其中库是应用程序存储库中的子存储库。这意味着对库代码的任何更改都被提交到子存储库,并且可以单独与库项目合并(以便使库代码的历史记录与应用程序分开)。

我一直在努力寻找如何用Bazaar(我目前选择的DVCS)做到这一点的例子或文档。有人试过吗?是否值得在Bzr中这样做,或者我是否应该考虑另一种能够更好地满足这一需求的DVCS系统?

Bazaar没有子存储库特性。[更正:显然有一个bzr-externals插件,可在lp:bzr-externals,虽然它模拟svn:externals功能,而不是Git子模块或Mercurial子reppos。]

但是,如果您不想切换版本控制系统,则可以相当容易地解决这个问题。

将应用程序和库放在两个目录中,比如applib(这里我假设它们是并排的,尽管它们不必并排)。然后可以使用以下两个脚本lib-snapshotlib-sync将应用程序的当前版本链接到库的特定版本,该版本将在app签出的子目录(也称为lib)中签出:

lib-snapshot:

#!/bin/sh
libsrc=../lib
bzr revno --tree $libsrc >libversion.txt

lib-sync:

#!/bin/sh
ver=`cat libversion.txt`
libsrc=../lib
libdst=lib
test -d $libdst/.bzr && bzr update -q -r $ver $libdst || bzr checkout -q --lightweight -r $ver $libsrc $libdst

库的当前版本存储在libversion.txt中,您需要将其置于版本控制之下(以便应用程序的每个版本与您测试的版本同步)。

lib-snapshot脚本将获取当前签出的库版本并将其存储在libversion.txt中。只要您认为库足够稳定,希望应用程序使用新版本,就可以使用它。然后可以使用lib-sync脚本更新库子目录以包含快照版本;理想情况下,该脚本也应该作为构建/部署过程的一部分使用。

Bazaar将在添加文件时自动跳过包含存储库的目录,但是您可能仍然希望将库子目录添加到.bzrignore,以便您不会收到烦人的警告。

最新更新