如何将外部svn仓库包含到我的git项目中?

4
我正在为一个项目使用版本控制软件 git。我的项目需要使用第三方代码库,该库使用 SVN 作为其版本控制软件。(在这种情况下,第三方代码是一个名为Yii的PHP框架,尽管它与问题不是非常相关)。
有没有一种方法可以在 git 中设置外部依赖项,以帮助从外部 SVN 存储库中拉取代码并保持更新?
如果我的项目正在使用 SVN,则很容易设置,因为我只需执行以下操作:
> svn propset svn:externals yii-1.1.6 https://yii.googlecode.com/svn/tags/1.1.6/framework

那么,每当我执行svn checkout(或svn update)时,都会将yii代码库下载到名为"yii-1.1.6"的本地文件夹中。在git中我能做类似的事情吗?有没有公共github repo的示例可以复制?我相信这必须是一个常见的需求?

3个回答

6

您可以使用 git-svn 克隆您的 SVN 存储库,然后将该存储库包含到您的主 Git 存储库中,并将其声明为 子模块

请记住: Git 子模块与 SVN 子模块不兼容,因为它们总是引用固定版本。看看:


然而,正如我在 "git submodule tracking latest" 中提到的那样,自从 git 1.8.2(2013年3月)起,你可以通过子模块跟踪存储库分支的最新版本。
$ git submodule add -b <branch> <repository> [<path>]
$ git submodule update --remote ...

你可以使用git-svn克隆你的svn仓库,但问题在于这不是我的svn仓库,而是第三方的仓库。 - Tom
1
没关系。如果你能做一个 svn checkout <URI>,你也可以做一个 git-svn clone <URI> - joschi
你可以查看子模块如何改变以便在这里跟踪分支 - Matt
1
@Matt 确实,我已经添加了一个链接到这个答案(我写的)。谢谢你提醒我更新这篇帖子。 - VonC

3
你也可以将第三方库通过SVN下载到你的项目中,然后git add它(包括所有的.svn子目录)到你的主项目中。
这种方法有点不规范但也很简单明了。
当你需要更新时,只需执行svn update和git commit即可。

那听起来很糟糕 :) - shjeff
同意。这个想法疯狂到足以奏效 :) 一个小细节是,因为git只存储相同的文件一次,所以当你提交检出的SVN仓库时,你只需要支付一次SVN在检出时复制每个文件的费用(它这样做是为了有原始文件进行比较)。 - Archie

1

我在工作中也有完全相同的情况。我使用SmartGit。在Git存储库根目录中有一个.gitsvnextmodules文件(提交到Git)。

[submodule "anyString"]
        path = path/to/svn/submodule
        url = https://url.of.svn/repository/blah
        revision = 1234
        branch = branches/branch #or it can be "trunk"
        fetch = trunk:refs/remotes/svn/trunk
        branches = branches/*:refs/remotes/svn/*
        tags = tags/*:refs/remote-tags/svn/*
        remote = svn
        type = dir

SmartGit将其显示为子模块,指向“https://url.of.svn/repository/blah/branches/branch”(连接了url+branch值),在修订版本1234处(如果未指定,则使用HEAD修订版本)。fetch+branches+tags与.git/config规范中的类似。

如果您不想快速切换第三方项目的分支(我是因为我还想提交子模块),请改用类似以下内容的东西。

[submodule "alternativeSubmodule"]
        path = path/to/svn/submodule
        url = https://url.of.svn/repository/blah/branches/branch
        revision = 1234
        branch = /
        fetch = :refs/remotes/svn/git-svn
        remote = svn
        type = dir

更多细节请参见 .gitsvnextmodules specification

对于此配置,SmartGit 与子模块的工作方式与普通的 Git 子模块相同。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接