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

时间:2009-01-21 12:16:05

标签: svn git git-svn

有没有办法在我的Git存储库中添加Subversion存储库作为Git子模块?

类似的东西:

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

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

我知道有git-svn允许一个人与Subversion存储库进行交互。所以我想,也许有办法用git-svn签出Subversion存储库,然后将其用作子模块。

6 个答案:

答案 0 :(得分:126)

没有。最好的办法是在专用的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子模块与您提供的修订版挂钩。如果“上游”发生变化,则必须更新子模块的引用。

所以当我们与上游颠覆重新同步时:

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"

答案 1 :(得分:8)

我刚刚经历过这个。我正在做类似于rq的事情,但略有不同。 我设置了一个服务器来托管我需要的svn repos的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')`

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

我不确定为什么这里需要git gc,但没有它我就无法git pull

所以在这之后你可以按照rq的说明使用git子模块。

答案 2 :(得分:5)

目前 git-svn 不支持 svn:externals 。但是还有另外两种工具可以帮助你:

  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 commit上将SVN修订转换为Git提交,并在每个git push上将Git提交转换为SVN修订。

  2. 您需要的一切是让Git存储库可供提交者使用。为此,请查看git-http-backend。然后,您可以将创建的Git存储库添加为通常的子模块。  SubGit也可用作Bitbucket服务器的附加组件,以便查看更多信息here。  因此,无需使用任何外部工具,如 git-svn 或其他任何工具。

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

    1. SmartGit

      SmartGit在客户端替换 git-svn 。有关其功能的更多信息,请参阅here

      特别是SmartGit支持 git子模块 svn:externals ,您可以将它们混合到您的存储库中。

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

答案 3 :(得分:4)

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

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

答案 4 :(得分:0)

Piston正在被重写以支持这个,反之,加上Subvresion repoistory和git + git中的现有Subversion URL。

查看the piston Github repository

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

答案 5 :(得分:0)

嗯,有git-remote-testsvn,所以我想像是

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

应该有效。是吗?