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

问题描述:

有没有办法在我的Git仓库中添加一个Subversion仓库作为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版本库,然后将它作为子模块使用。

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

git svn clone -s http://subversion.example.com/ mysvnclone 
cd mysvnclone 
git remote add origin [email protected]: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之间的一个概念上的差异:外部组件和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

你试过后它来这里之前这些代码?子模块在git svn中无法正常工作。 – xhan 2010-12-22 09:22:32

+3

@xhan是的,我不主张在同一个存储库中混合git-svn和子模块。使用git-svn的克隆只是创建svn存储库的本地git克隆的桥梁。 – richq 2010-12-22 09:58:25

+0

对不起。我还没有找到你使用两个文件夹作为子模块。好戏。 – xhan 2010-12-22 13:43:54

活塞被改写,以支持这一点,相反的,加上在Subvresion repoistory和混帐混帐+现有的Subversion的URL。

结账the piston Github repository

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

我刚刚经历过这个。我正在做类似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')` 

这也需要解决 - svn的 - 裁判。从http://www.shatow.net/fix-svn-refs.sh 这SH主要是受启发:http://gsocblog.jsharpe.net/archives/12

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

因此,毕竟你可以使用gq子模块遵循rq的指示。

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

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

当前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修订版翻译为每个svn commit上的Git提交,并将Git提交至每个git push上的SVN修订版。

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

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

  1. SmartGit

    SmartGit取代GIT中 - svn的上客户端。有关其功能的更多信息,您可能会发现here

    特别SmartGit不支持git的子模块的svn:externals的,你可以在你的仓库混合。

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

开始=>

那么,有git-remote-testsvn,所以我想是这样

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

应该工作。可以?