如何设置子git以镜像svn repo,该repo看起来像Windows资源管理器层次结构



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

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

以此类推。repo现在包含大约100多个具有trunk/branches/tags结构的真实svn项目,但几乎没有一个是顶级的。

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

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

  • 本地镜像模式

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

    以下是我提供的基本说明。请在SubGit"本地模式"书中找到详细的文档和常见的陷阱。

    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服务器)。请参阅相关文档,并在我们的博客中看到几个关于这个主题的帖子:

      • VisualSVN服务器和SubGit
      • Gitolite和SubGit


  • 远程镜像模式

    使用此模式时,必须仅将SubGit安装到Git存储库中,并使该存储库与托管在不同机器上的远程Subversion服务器同步。

    下面你可以找到一些基本的说明。有关更多详细信息,请参阅SubGit"远程模式"手册。

    1. 配置

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

      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存储库生成配置文件<GIT_REPO>/subgit/config。对于您的情况,此配置文件应如下所示:

      ...
      [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书中的相应章节。

      我们还建议在Subversion端启用pre-revprop-change挂钩,这会使进一步的安装和维护更加容易,请参阅SubGitBook。

    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镜像插件,它在UI和维护方面提供了更好的体验。

根据我们的经验,我们有以下指导方针:

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

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

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

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

相关内容

最新更新