是否有可能有一个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 。 但是还有两个工具可以帮助你:
-
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个提交者),学术和开源项目来说是免费的。
-
SmartGit
SmartGit在客户端replacegit-svn 。 有关其function的更多信息,您可以在这里find。
特别是SmartGit支持git submodules和svn: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存储库 。
不幸的是它似乎没有被释放。