有很多充分的理由说明为什么人们可能需要同步多个存储库的所有分支:
- 发展发生在多个大陆
- 有些服务器可能不会出现在一些计划之外
- Windows 用户可能希望快速访问 Git-SVN 镜像
最后一点是一个相当痛的点:Git for Windows对导入 Subversion 存储库的支持存在许多性能问题,从平台的一般 I/O 缺陷到需要使用 MSys Perl 才能使用SVN.pl模块。
唉,解决方案就在眼前!
我们在 ImageJ 项目中正好解决了这些问题。有一个 Jenkins job 可以使用 ImgLib2 使ImageJ仓库大致完成同步。令人兴奋的,该脚本比我希望的要复杂一些,但它可靠地工作了,而且说实话,它比我最初想象的要紧张一些:当只有一个仓库库有更新时,应该强制更新。然而,可能存在相互矛盾的更新,在这种情况下,强制执行任何操作。当然,这样的脚本(尤其是当它比作者希望的为什么有点复杂时)也必须采取措施预防,不要在作者可能没有想到的极端情况下过度热心。这就是会果断地替换在前几轮中可能会丢失的更新,并且不会强制执行这些更新。 Jenkins每5分钟执行一次此作业,这就是为什么使用更快的git://协议来获取分支而不是使用更慢的基于ssh的协议来是非常重要的。
对于 git-svn 镜像,我们也有 Jenkins 的工作。它是由(幸运的非常简单)§§10§§§驱动的。安全保证远程信息的设置使得refs/remotes/中的所有分支(即由 git-svn 维护的分支)都被到了refs/heads/svn/一个命名空间中。Jenkins 轮询 Subversion 存储库,并且仅在新的可用作业时运行作业。
事实证明,这两项工作(以及用于同步 this script 和 Fiji 存储库的 ImageJ 同步器的兄弟姐妹)在我们的开发中非常有用且稳定。
Git 存储库的同步器在设计时考虑到了灵活性:应同步哪些存储库的信息作为命令行提交参数。如果需要,可以轻松调整 Git-SVN 镜像的同步器以设置灵活性。