158

有没有办法在我的 Git 存储库中添加一个 Subversion 存储库作为 Git 子模块?

就像是:

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

指向https://svn.foo.com/svn/projSubversion 存储库的位置。

我知道有git-svn它允许人们与 Subversion 存储库进行交互。所以我在想,也许有一种方法可以检查 Subversion 存储库,git-svn然后将其用作子模块。

4

6 回答 6

130

不,最好的办法是在专用的 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 submodule 之间有一个概念上的区别,如果你从颠覆的角度来处理这个问题,可能会绊倒你。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"
于 2009-01-21T12:47:31.597 回答
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 submodule 。

于 2009-05-18T14:53:31.923 回答
6

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

  1. 子Git

    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 修订版翻译成 Git 提交,svn commit并将 Git 提交翻译成 SVN 修订版git push

您需要进一步做的就是让提交者可以使用 Git 存储库。看看git-http-backend。然后,您可以将创建的 Git 存储库添加为通常的子模块。SubGit 也可作为 Bitbucket Server 的附加组件使用,请查看此处了解更多信息。因此,无需使用任何外部工具,如git-svn或任何其他工具。

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

  1. SmartGit

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

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

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

于 2011-12-09T03:40:59.403 回答
4

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

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

于 2010-07-18T17:58:11.570 回答
0

Piston 正在重写以支持这一点,反之亦然,加上 Subvresion 存储库和 git+git 中现有的 Subversion URL。

查看活塞 Github 存储库

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

于 2009-01-21T18:45:39.627 回答
0

嗯,有git-remote-testsvn,所以我想像

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

应该管用。可以?

于 2017-11-22T21:22:56.950 回答