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

有没有一种方法可以将 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 库交互。所以我在想,也许有一种方法可以用 git-svn检出 Subversion 存储库,然后将其用作子模块。

44869 次浏览

不,最好的办法是在专用的 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: foreign 和 git 子模块之间有一个概念上的区别,如果您从颠覆的角度来处理这个问题,可能会出错。Git 子模块与您提供的修订版挂钩。如果“上游”发生变化,那么您必须更新子模块的引用。

因此,当我们与上游颠覆重新同步时:

cd /path/to/mysvnclone
git svn rebase
git push

Git 项目仍然使用我们之前提交的原始版本。要更新到 svnHEAD,必须使用

cd /path/to/gitproject/svn-project
git checkout master
git pull
cd ..
git add svn-project
git commit -m"Update submodule"

活塞正在被重写,以支持这一点,相反,加上现有的 Subversion URL 在 Subvversion 存储库和 git + git。

看看 活塞 Github 仓库

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

我刚经历过这个,我正在做一些类似于 rq 的东西,但是有些不同。 我设置了我的一个服务器托管这些 git 克隆的 svn 回购我需要。在我的情况下,我只想要只读版本,并需要在服务器上的一个裸回购。

在我运行的服务器上:

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')`

这也需要修复 < a href = “ http://www.shatow.net/fix-svn-refs.sh”rel = “ nofollow norefrer”> http://www.shatow.net/fix-svn-refs.sh 这主要是受到以下 http://gsocblog.jsharpe.net/archives/12的启发:

我不知道为什么 git gc需要在这里,但我不能做一个 git pull没有它。

因此,在所有这些之后,您可以按照 rq 的指示使用 git 子模块。

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

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

目前 Git-svn不支持 Svn: 外部,但是有两个其他的工具可以帮助你:

  1. SubGit

    SubGit 是服务器端解决方案,它支持 Git 访问 Subversion 存储库,反之亦然。您可以参考 文件了解更多细节,但一般来说,使用 SubGit 相当容易:

    $ subgit configure --layout auto $SVN_URL $GIT_REPO
    

    上面的命令将检测 SVN 项目中的分支布局,然后创建空的 Git 存储库,以便镜像 SVN 项目。您可能会被要求提供凭据,除非这些凭据已经存储在 SVN 凭据缓存中的 ~/。Subversion 目录。您还可以调整 $GIT_REPO/subgit/authors.txt以将 SVN 作者名映射到 Git 标识。

    $ subgit install $GIT_REPO
    $ ... let initial translation complete ...
    $ TRANSLATION SUCCESSFUL
    

    此时,您已经将 Subversion 存储库连接到新创建的 Git 存储库。SubGit 在每个 svn commit上将 SVN 修订转换为 Git 提交,在每个 git push上将 Git 提交为 SVN 修订。

您还需要做的一切就是让提交者可以使用 Git 存储库。看看 Git-http-backend。然后您可以添加已创建的 Git 存储库作为通常的子模块。 SubGit 也可以作为 Bitbucket 服务器的一个附加组件,查看 给你。 因此,没有必要使用任何外部工具,如 Git-svn或任何其他。

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

  1. SmartGit

    SmartGit 在客户端取代了 Git-svn

    特别是 SmartGit 同时支持 Git 子模块Svn: 外部,您可以在存储库中混合使用它们。

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

好吧,有 git-remote-testsvn,所以我想大概是

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

应该可以,是吗?