4

作为 Windows 用户,我们创建了一个具有文件夹层次结构的 svn 存储库。底部节点包含 svn 标准布局:

ProjectA/
    ApplicationOne/
        ModuleX/
            trunk/
            branches/
            tags/
    ApplicationTwo/
        ModuleY/
            trunk/
            branches/
            tags/

……等等,无穷无尽。该 repo 现在包含大约 100 多个具有主干/分支/标签结构的真实 svn 项目,但几乎没有一个位于顶层。

我将如何配置 subgit 来处理这个问题?

4

1 回答 1

8

SubGit可以工作在两种不同的模式:本地镜像模式和远程镜像模式。您可以在下面找到这些模式的一般概述以及针对您的特定情况的一些建议。

  • 本地镜像模式

    在这种模式下,Subversion 和 Git 存储库都驻留在同一主机上,因此 SubGit 可以本地访问 SVN 和 Git 端。

    下面我提供了基本说明。请在SubGit 'Local Mode' Book中找到详细的文档和常见陷阱。

    1. 配置

      subgit configure <SVN_REPO>
      SubGit version <VERSION> build #<BUILD_NUMBER>
      
      Detecting paths eligible for translation... done.
      Subversion to Git mapping has been configured:
        /ProjectA/ApplicationOne/ModuleX : <SVN_REPO>/git/ProjectA/ApplicationOne/ModuleX.git
        /ProjectA/ApplicationTwo/ModuleY : <SVN_REPO>/git/ProjectA/ApplicationTwo/ModuleY.git
        ...
      
      CONFIGURATION SUCCESSFUL
      ...
      

      此命令尝试自动检测存储库布局并在<SVN_REPO>/conf/subgit.conf. 对于像您这样的大型 Subversion 存储库,可能需要一段时间。

      请确保自动生成的配置文件如下所示,必要时进行调整:

      ...
      [git "ProjectA/ApplicationOne/ModuleX"]
        translationRoot = /ProjectA/ApplicationOne/ModuleX
        repository = git//ProjectA/ApplicationOne/ModuleX.git
        pathEncoding = UTF-8
        trunk = trunk:refs/heads/master
        branches = branches/*:refs/heads/*
        shelves = shelves/*:refs/shelves/*
        tags = tags/*:refs/tags/*
      ...
      
    2. 作者映射

      在这个阶段,您必须创建 /conf/authors.txt 文件,将现有的 SVN 用户名映射到 Git 作者。有关详细信息,请参阅文档。

    3. 安装

      最后,您必须将您的 Subversion 存储库导入 Git 并通过运行subgit install命令启用同步:

      subgit install repo
      SubGit version <VERSION> build #<BUILD_NUMBER>
      
      Subversion to Git mapping has been found:
        /ProjectA/ApplicationOne/ModuleX : <SVN_REPO>/git/ProjectA/ApplicationOne/ModuleX.git
        /ProjectA/ApplicationTwo/ModuleY : <SVN_REPO>/git/ProjectA/ApplicationTwo/ModuleY.git
        ...
      
      Processing '/ProjectA/ApplicationOne/ModuleX'
        Translating Subversion revisions to Git commits...
      Processing '/ProjectA/ApplicationTwo/ModuleY'
        Translating Subversion revisions to Git commits...
        ...
      
        Subversion revisions translated: <REVISIONS_NUMBER>.
        Total time: <TIME_SPENT> seconds.
      
      INSTALLATION SUCCESSFUL
      
    4. Git 服务器

      安装结束并启用 Subversion 和 Git 存储库之间的同步后,您可以设置一些 Git 服务器(或重用现有的 Apache HTTP 服务器)。请参阅相关文档,并在我们的博客中查看有关此主题的几篇文章:


  • 远程镜像模式

    使用此模式时,只需将 SubGit 安装到 Git 存储库中,并保持此存储库与托管在另一台机器上的远程 Subversion 服务器同步。

    您可以在下面找到一些基本说明。有关详细信息,请参阅SubGit 'Remote Mode' Book 。

    1. 配置

      在远程镜像模式下,SubGit 不会尝试自动检测存储库布局,因此您必须为subgit configure --svn-url <SVN_URL>Subversion 存储库中的每个模块运行命令:

      subgit configure --svn-url <SVN_ROOT_URL>/ProjectA/ApplicationOne/ModuleX <GIT_ROOT_DIR>/ProjectA/ApplicationOne/ModuleX.git
      SubGit version <VERSION> build #<BUILD_NUMBER>
      
      Configuring writable Git mirror of remote Subversion repository:
        Subversion repository URL : <SVN_ROOT_URL>/ProjectA/ApplicationOne/ModuleX
        Git repository location   : <GIT_ROOT_DIR>/ProjectA/ApplicationOne/ModuleX.git
      
      CONFIGURATION SUCCESSFUL
      ...
      

      结果 SubGit<GIT_REPO>/subgit/config为每个 Git 存储库生成配置文件。对于您的情况,此配置文件应如下所示:

      ...
      [svn]
        url = <SVN_ROOT_URL>/ProjectA/ApplicationOne/ModuleX
        trunk = trunk:refs/heads/master
        branches = branches/*:refs/heads/*
        tags = tags/*:refs/tags/*
        shelves = shelves/*:refs/shelves/*
        fetchInterval = 60
        connectTimeout = 30
        readTimeout = 60
        keepGitCommitTime = false
        auth = default
      
      [auth "default"]
        passwords = subgit/passwd
        useDefaultSubversionConfigurationDirectory = false
        subversionConfigurationDirectory = <SVN_CONFIG_DIR>
      ...
      
    2. 作者映射

      在这个阶段,您必须创建 /subgit/authors.txt 文件,将现有的 SVN 用户名映射到 Git 作者。有关详细信息,请参阅文档。

    3. SVN 凭据

      如果你没有使用file://协议,你必须提供必要的凭据,这样 SubGit 才能对 Subversion 服务器进行身份验证。有关这方面的更多信息,请阅读SubGit Book 中的相应章节

      我们还建议pre-revprop-change在 Subversion 端启用钩子,这使得进一步的安装和维护更容易一些,请参阅SubGit Book

    4. 安装

      最后,您必须将您的 Subversion 存储库导入 Git 并通过运行subgit install命令启用同步:

      subgit install git
      SubGit version <VERSION> build #<BUILD_NUMBER>
      
      Translating Subversion revisions to Git commits...
      
        Subversion revisions translated: <REVISIONS_NUMBER>.
        Total time: <TIME_SPENT> seconds.
      
      INSTALLATION SUCCESSFUL
      

      此命令还启动轮询 SVN 服务器并在出现新修订时获取新修订的后台进程。基本上,这意味着 SubGit 为每个 Git 存储库使用专用进程。有时避免运行此类进程并使用一些作业调度程序是有意义的。

    5. Git 服务器

      我上面提供的那些链接也与远程模式相关。

      但是,如果您打算使用Atlassian Stash进行 Git 托管,您可以使用基于 SubGit 引擎的SVN Mirror Plugin ,在 UI 和维护方面提供更好的体验。

根据我们的经验,我们制定了以下指南:

  1. 如果有许多独立的 Subversion 存储库,最好在本地镜像模式下使用 SubGit,因为它不需要 SVN 轮询并为此维护额外的进程。

  2. 如果一个巨大的 Subversion 存储库有很多模块,最好使用带有file://协议的远程镜像模式,并稍微调整基本设置。

    在您的情况下运行 100 多个后台进程绝对没有意义,相反,我们建议安装额外的提交后 SVN 挂钩,以检查给定修订版修改了哪些特定模块,然后触发相应 Git 存储库的同步。

如果您有任何其他问题,请随时在 Stack Overflow 上的问题跟踪器中向我们提问,或通过电子邮件联系我们:support@subgit.com。

于 2013-11-25T16:05:05.763 回答