将svn镜像为git的想法

时间:2012-10-26 17:55:16

标签: git svn git-svn subgit

今天,在我的工作中,我们将源代码托管在我们无法管理员访问的公共svn存储库中。现在,我们想使用git(github)来托管我们的源代码。由于某些内部原因,我们使用的svn存储库必须镜像git。

显然,Subgit是完成这项工作的最佳工具,因为svn< - > git是非常流畅和无压力的(根据我的测试,它看起来真的很像)。所以,我一直都是这样的布局:

svn-repo< - subgit-repo< - github< - >来自每个开发人员的本地git-repo。

svn-repo将是只读的,即只能使用git提交。

阅读Subgit博客我看到了post。在这篇文章中,svnsync用于将subgit-repo与svn-repo同步,但同步只是单向的,从svn-repo到subgit-repo :(

所以,我发现了svnadmin转储和加载,我可以使用它们来保持svn-repo与subgit-repo同步。例如:

svnadmin dump --incremental subgit-repo | svnadmin加载svn-repo

我的问题是:使用svnadmin dump和load来保持我的存储库同步是一个好主意吗?

谢谢!

1 个答案:

答案 0 :(得分:2)

让我们按如下方式分解问题:

  • 远程同步Subversion存储库;
  • 同步Git存储库,当其中一个托管在GitHub上时。

Subversion存储库的远程同步。

  1. 使用svnsync。

      

    所以,我发现了svnadmin转储和加载,我可以使用它们来保持svn-repo与subgit-repo同步。

         

    svnadmin dump --incremental subgit-repo | svnadmin加载svn-repo

    很遗憾,除非您拥有svn-repo的管理员权限,否则无法运行svnadmin load svn-repo。但您可以尝试使用svnsync:

    $ svnsync init svn-repo subgit-svn-repo
    $ svnsync sync svn-repo
    

    这样您就可以将更改从subgit-svn-repo同步到svn-repo 远程。请注意,在您的问题中,您已经指出了从svn-repo同步到subgit-svn-repo的方法,但在我的示例中,我已经证明这也是相反的方向。

    但是这种方法存在一个问题:svn-repo中应该有pre-revprop-change个钩子。这意味着您仍然必须在本地访问svn-repo以启用挂钩。幸运的是,这是管理员启用此类挂钩时的常见情况。希望这也适合你。

    您可以在this blog post中找到详细的HOW-TO。

  2. 使用SubGit 2.0

    现在我们有一个SubGit 2.0的工作原型,它支持Subversion的读写镜像和位于不同主机上的Git存储库。一个人必须具有Git存储库的管理员访问权限,所以无论如何都不需要修改Subversion存储库。

    目前它的工作原理如下:

    $ git init --bare git-repo
    $ subgit configure --svn-url svn-repo git-repo
    $ subgit install git-repo
    

    此时SubGit会将pre-receivepost-receive挂钩安装到git-repo中,自动将传入的更改与远程svn-repo同步。

    我们非常接近发布具有此功能的第一个EAP版本。我们建议您在构建完成后立即对其进行测试。据我所知,在此之前只有svnsync选项。

  3. Git与GitHub同步

    从你的问题来看,你还不清楚如何将subgit-git-repo的变化与github-repo同步。

    我想注意,必须更改推送到subgit-git-repo才能将它们与subgit-svn-repo同步。

    基本上你的团队可能只使用github存储库,有人会手动将所有更改推送到SubGit控制的Git存储库:

    $ git remote add github github-repo
    $ git remote add subgit subgit-git-repo
    $ git pull github
    $ git push subgit
    

    或者可以设置一个cron作业来定期将更改推送到SubGit。

相关问题