是否有可能将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"
活塞被改写,以支持这一点,相反的,加上在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。但也有其他两个工具,它可以帮助你:
-
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个提交者),学术和开源项目是免费的。
开始=>
那么,有git-remote-testsvn
,所以我想是这样
git submodule add testsvn::http://www.telegraphics.com.au/svn/bzquips/trunk/ \
module/bzquips
应该工作。可以?
你试过后它来这里之前这些代码?子模块在git svn中无法正常工作。 – xhan 2010-12-22 09:22:32
@xhan是的,我不主张在同一个存储库中混合git-svn和子模块。使用git-svn的克隆只是创建svn存储库的本地git克隆的桥梁。 – richq 2010-12-22 09:58:25
对不起。我还没有找到你使用两个文件夹作为子模块。好戏。 – xhan 2010-12-22 13:43:54