代码之家  ›  专栏  ›  技术社区  ›  davitenio

是否可以将Subversion存储库作为Git子模块?

  •  162
  • davitenio  · 技术社区  · 17 年前

    是否有方法将Subversion存储库添加为Git存储库中的Git子模块?

    类似于:

    git-svn submodule add https://svn.foo.com/svn/proj --stdlayout svn-project
    

    哪里 https://svn.foo.com/svn/proj 指向Subversion存储库。

    我知道有 git-svn 它允许用户与Subversion存储库进行交互。所以我在想,也许有一种方法可以通过以下方式签出Subversion存储库 git svn 然后将其用作子模块。

    6 回复  |  直到 11 年前
        1
  •  129
  •   Ivan    8 年前

    不是。你最好的选择是在专用的git存储库中设置svn存储库的镜像。

    git svn clone -s http://subversion.example.com/ mysvnclone
    cd mysvnclone
    git remote add origin git@example.com:project.git
    git push origin master
    

    然后,您可以将git存储库作为子模块添加到原始项目中

    cd /path/to/gitproject
    git submodule add git://example.com/project.git -- svn-project
    git add svn-project
    git commit -m "Add submodule"
    

    svn:externals和git子模块之间有一个概念上的区别,如果你从颠覆的角度来处理这个问题,可能会让你绊倒。git子模块与你给它的修订版挂钩。如果“上游”发生了变化,那么你必须更新子模块的引用。

    因此,当我们与上游subversion重新同步时:

    cd /path/to/mysvnclone
    git svn rebase
    git push
    

    …git项目仍将使用我们之前提交的原始版本。要更新到svn HEAD,您必须使用

    cd /path/to/gitproject/svn-project
    git checkout master
    git pull
    cd ..
    git add svn-project
    git commit -m"Update submodule"
    
        2
  •  8
  •   robingrindrod sherbang    12 年前

    我刚刚经历了这一切。我正在做一些类似rq的事情,但略有不同。 我设置了一台服务器来托管我需要的svn仓库的git克隆。在我的例子中,我只想要只读版本,并且需要服务器上的裸仓库。

    在我运行的服务器上:

    GIT_DIR=<projectname>.git git init
    cd <projectname>.git/
    GIT_DIR=. git svn init svn://example.com/trunk
    GIT_DIR=. git svn fetch
    git gc
    

    这设置了我的裸仓库,然后我有一个cron脚本来更新它:

    #!/usr/bin/python
    
    import os, glob
    
    GIT_HOME='/var/www/git'
    
    os.chdir(GIT_HOME)
    os.environ['GIT_DIR']='.'
    gits = glob.glob('*.git')
    for git in gits:
      if not os.path.isdir(git):
        continue
      os.chdir(os.path.join(GIT_HOME, git))
      if not os.path.isdir('svn/git-svn'):
        #Not a git-svn repo
        continue
    
      #Pull in svn updates
      os.system('git svn fetch && git gc --quiet')
      #fix-svn-refs.sh makes all the svn branches/tags pullable
      os.system('fix-svn-refs.sh')
      #Update the master branch
      os.system('git fetch . +svn/git-svn:master && git gc --quiet')`
    

    这也需要来自以下位置的fix-svn-refs.sh http://www.shatow.net/fix-svn-refs.sh 这主要受到以下因素的启发: http://gsocblog.jsharpe.net/archives/12

    我不知道为什么 git gc 这里需要,但我没能做 git pull 没有它。

    因此,在所有这些之后,您可以按照rq的指示使用git子模块。

        3
  •  6
  •   vadishev    9 年前

    当前 git svn 不支持 svn:外部 。但还有另外两个工具可以帮助您:

    1. SubGit

      SubGit 是服务器端解决方案,它允许Git访问Subversion存储库,反之亦然。你可以参考 documenation 更多细节,但一般来说,使用SubGit相当容易:

      $ subgit configure --layout auto $SVN_URL $GIT_REPO
      

      上面的命令将检测SVN项目中的分支布局,然后创建空的裸Git存储库,准备镜像SVN项目。可能会要求您提供凭据,除非这些凭据已存储在~/.subversion目录下的SVN凭据缓存中。您也可以进行调整 $GIT_REPO/subgit/authors.txt 将SVN作者名称映射到Git标识。

      $ subgit install $GIT_REPO
      $ ... let initial translation complete ... 
      $ TRANSLATION SUCCESSFUL
      

      此时,您已经将Subversion存储库连接到新创建的Git存储库。SubGit在每次提交时将SVN版本转换为Git提交 svn commit Git每次提交到SVN修订版 git push .

    您还需要做的就是让Git存储库对提交者可用。看一看 git-http-backend 为了这个。然后,您可以将创建的Git存储库添加为常用子模块。 SubGit也可作为Bitbucket服务器的附加组件,以了解更多信息 here . 因此,不需要使用任何外部工具,如 git svn 或任何其他。

    SubGit是专有软件,但对小公司(最多10个提交者)、学术和开源项目都是免费的。

    1. SmartGit

      SmartGit取代 git svn 在客户端。您可以找到有关其功能的更多信息 here .

      特别是SmartGit确实支持这两种 git子模块 svn:外部 ,您可以在存储库中混合使用它们。

      SmartGit是专有软件,但可免费用于非商业用途。

        4
  •  4
  •   pcuenca    15 年前

    除了rq所说的,另一种方法是使用第三方“外部”项目( http://nopugs.com/ext-tutorial ),这更好地模拟了svn外部引用的工作方式。使用外部引用,您可以跟踪git或svn存储库,并且看起来更容易将您的更改向上游推送到这些存储库。但是,它要求项目成员下载并安装单独的包。

    我还没有使用子模块或外部模块;然而,我花了几个小时阅读了所有替代品,看起来外部将更适合我的需求。Jon Loeliger在《Git版本控制》第15章中对这些和其他自定义方法进行了很好的讨论( http://oreilly.com/catalog/9780596520120 ),我强烈推荐。

        5
  •  0
  •   Otto    17 年前

    活塞正在被重写以支持这一点,反之亦然,再加上Subvresion历史记录中的现有Subversion URL和git+git。

    查看 the piston Github repository .

    不幸的是,它似乎没有被释放。

        6
  •  0
  •   mcepl    8 年前

    嗯,确实如此 git-remote-testsvn ,所以我猜是这样的

    git submodule add testsvn::http://www.telegraphics.com.au/svn/bzquips/trunk/ \
        module/bzquips
    

    应该行得通。是吗?