是否有可能有一个Subversion版本库作为Git子模块?

有没有办法在我的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版本库,然后用它作为子模块。

不,你最好的select是在专用的git仓库中build立一个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子模块之间有一个概念上的区别,如果你从一个颠覆的angular度来看待这个问题的话,你可能会绊倒你。 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" 

我刚刚经历了这个。 我正在做类似于rq的东西,但略有不同。 我安装了一台服务器来托pipe我需要的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')` 

这也需要http://www.shatow.net/fix-svn-refs.sh的; fix-svn-refs.sh这主要是受启发: http ://gsocblog.jsharpe.net/archives/12

我不知道为什么在这里需要git gc ,但是如果没有它,我不能够做到。

所以,在这一切之后,你可以使用gq子模块遵循rq的指示。

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

  1. SubGit

    SubGit是服务器端解决scheme,它允许Git访问Subversion存储库,反之亦然。 您可以参考文档了解更多详细信息,但通常使用SubGit相当容易:

     $ subgit configure --layout auto $SVN_URL $GIT_REPO 

    以上命令将检测SVN项目中的分支布局,然后创build空的裸Git存储库准备镜像SVN项目。 除非这些凭证已存储在〜/ .subversion目录的SVN凭证caching中,否则系统可能会要求您提供凭证。 您还可以调整$GIT_REPO/subgit/authors.txt来将SVN作者名称映射到Git标识。

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

    在这一刻你有Subversion版本库连接到新创build的Git仓库。 SubGit将SVN修订转换为每个svn commit Git提交,并在每个git push上将Git提交到SVN修订。

你需要进一步的是让Git仓库提供给提交者。 看看这个git-http-backend 。 然后你可以添加创build的Git仓库作为一个通常的子模块。 SubGit也可以作为Bitbucket服务器的附加组件,在这里可以find更多的内容。 所以,不需要使用像git-svn或其他任何外部工具。

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

  1. SmartGit

    SmartGit在客户端replacegit-svn 。 有关其function的更多信息,您可以在这里find。

    特别是SmartGit支持git submodulessvn:externals ,你可以将它们混合到你的仓库中。

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

除了rq说的,另一种方法是使用第三方的“外部”项目( http://nopugs.com/ext-tutorial ),它更好的模拟了svn外部引用的工作方式。 通过外部的你可以跟踪git或者svn仓库,而且你可以更容易地将你的更改上传到这些仓库。 但是,它要求项目成员下载并安装单独的软件包。

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

活塞正在被重写,以支持这个,反过来,再加上Subvresion repoistory和git + git中现有的Subversion URL。

检查活塞Github存储库 。

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