Answers:
不能。您最好的选择是在专用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"
我刚刚经历了这个。我正在做与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')`
这也需要来自http://www.shatow.net/fix-svn-refs.sh的 fix-svn-refs.sh 。 这主要是受到以下方面的启发:http : //gsocblog.jsharpe.net/archives/12
我不确定为什么git gc
这里需要,但是git pull
没有它我无法做到。
因此,所有这些之后,您可以按照rq的说明使用git子模块。
当前git-svn不支持svn:externals。但是还有另外两个工具可以帮助您:
SubGit是服务器端解决方案,它使Git可以访问Subversion存储库,反之亦然。您可以参考文档来获取更多详细信息,但是通常使用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提交转换为每个上的SVN修订版git push
。
您进一步需要做的就是使Git存储库对提交者可用。看一下git-http-backend。然后,您可以将创建的Git存储库添加为常规子模块。SubGit还可以作为Bitbucket服务器的附件使用,以在此处找到更多信息。因此,无需使用任何外部工具,例如git-svn或任何其他工具。
SubGit是专有软件,但对小型公司(最多10个提交者),学术和开源项目免费。
subgit
(subgit.com/documentation/...)和smartgit
支持的svn:externals
通过明确以同样的方式.gitsvnextmodules
在工作拷贝文件。这意味着您仍然必须使用这些软件来签出外部组件,并且不能使用基本git
实用程序直接从外部git hub服务器(如github
或)签出那些外部组件gitlab
。因此,snv:externals
如果没有这些软件,将无法查看和下载相关外部git hub服务器上的源,这仍然是一个重要问题。
除了rq所说的以外,另一种方法是使用第三方“外部”项目(http://nopugs.com/ext-tutorial),该项目可以更好地模仿svn外部引用的工作方式。使用外部工具,您可以跟踪git或svn存储库,将更改向上游推送到这些存储库看起来更容易。但是,它要求项目成员下载并安装单独的软件包。
我还没有使用过子模块或外部模块。但是,我已经花了几个小时来阅读所有替代方案,并且看起来外部组件将更适合我的需求。我强烈建议在Jon Loeliger(http://oreilly.com/catalog/9780596520120)的“使用Git进行版本控制”的第15章中对这些和其他自定义方法进行了精彩的讨论。