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


154

有没有一种方法可以将Subversion存储库添加为我的Git存储库中的Git子模块?

就像是:

git-svn submodule add https://svn.foo.com/svn/proj --stdlayout svn-project

https://svn.foo.com/svn/proj点Subversion库。

我知道有git-svn哪一种可以与Subversion存储库进行交互。所以我在想,也许有一种方法可以用来签出Subversion存储库,git-svn然后将其用作子模块。

Answers:


127

不能。您最好的选择是在专用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"

1
在将代码发布到此处之前,您是否尝试过这些代码?子模块在git svn不能正常工作。
xhan

4
@xhan是的,我不主张在同一存储库中混合使用git-svn和子模块。使用git-svn的克隆只是创建svn存储库的本机git克隆的桥梁。
richq 2010年

抱歉。我还没有发现您使用两个文件夹作为子模块。好招。
xhan 2010年

好的技术。在将git-svn存储库推送到那里之前,您是否不需要在服务器上执行'git init --bare'步骤?我必须这样做。
克莱顿·斯坦利

它可能不是默认值,但是您可以将svn:externals绑定到特定版本,就像git子模块一样。
MarcH

8

我刚刚经历了这个。我正在做与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子模块。


有人会认为您甚至可以将其作为提交挂钩。
Andres Jaan Tack

6

当前git-svn不支持svn:externals。但是还有另外两个工具可以帮助您:

  1. SubGit

    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 commitGit提交,将Git提交转换为每个上的SVN修订版git push

您进一步需要做的就是使Git存储库对提交者可用。看一下git-http-backend。然后,您可以将创建的Git存储库添加为常规子模块。SubGit还可以作为Bitbucket服务器的附件使用,以在此处找到更多信息。因此,无需使用任何外部工具,例如git-svn或任何其他工具。

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

  1. SmartGit

    SmartGit 在客户端取代了git-svn。您可以在这里找到有关其功能的更多信息。

    特别是SmartGit确实支持git子模块svn:externals,您可以在存储库中混合使用它们。

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


无论是subgitsubgit.com/documentation/...)和smartgit支持的svn:externals通过明确以同样的方式.gitsvnextmodules在工作拷贝文件。这意味着您仍然必须使用这些软件来签出外部组件,并且不能使用基本git实用程序直接从外部git hub服务器(如github或)签出那些外部组件gitlab。因此,snv:externals如果没有这些软件,将无法查看和下载相关外部git hub服务器上的源,这仍然是一个重要问题。
安德里(Andry)

4

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

我还没有使用过子模块或外部模块。但是,我已经花了几个小时来阅读所有替代方案,并且看起来外部组件将更适合我的需求。我强烈建议在Jon Loeliger(http://oreilly.com/catalog/9780596520120)的“使用Git进行版本控制”的第15章中对这些和其他自定义方法进行了精彩的讨论。


0

正在重写活塞以支持此操作,反之亦然,以及Subvresion存储库中的现有Subversion URL和git + git。

查看活塞Github存储库

不幸的是,它似乎尚未发布。


3
但是,当您最需要活塞时,活塞会在您的面前失败;),所以我不建议这样做。另外,活塞也没有任何错误修正。
亨里克(Henrik),2009年

0

好吧,有git-remote-testsvn,所以我猜类似

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

应该管用。可以?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.