如何在git项目中包含外部svn存储库?

如何在git项目中包含外部svn存储库?,svn,git,svn-externals,Svn,Git,Svn Externals,我正在使用作为项目的版本控制软件。我的项目需要使用第三方代码库,该库使用作为其版本控制软件。(在本例中,第三方代码是一个名为PHP的框架,与问题无关) 是否有一种方法可以在git中设置一个外部依赖项,帮助从外部SVN存储库中提取代码并使其保持最新 如果我的项目使用SVN,那么设置起来就很简单了,因为我只需要执行以下操作: > svn propset svn:externals yii-1.1.6 https://yii.googlecode.com/svn/tags/1.1.6/frame

我正在使用作为项目的版本控制软件。我的项目需要使用第三方代码库,该库使用作为其版本控制软件。(在本例中,第三方代码是一个名为PHP的框架,与问题无关)

是否有一种方法可以在git中设置一个外部依赖项,帮助从外部SVN存储库中提取代码并使其保持最新

如果我的项目使用SVN,那么设置起来就很简单了,因为我只需要执行以下操作:

> svn propset svn:externals yii-1.1.6 https://yii.googlecode.com/svn/tags/1.1.6/framework

…然后,每当我进行
svn签出
(或
svn更新
)时,我都会将yii代码库吸入名为“
yii-1.1.6
”的本地文件夹中。我可以用git做类似的事情吗?有没有人在公共github回购协议中有我可以复制的例子?我确信这一定是一种常见的需求?

您可以对您的svn回购进行git svn克隆,然后将该回购包含到您的主要git回购中,并将其声明为

$ git submodule add -b <branch> <repository> [<path>]
$ git submodule update --remote ...
只需记住:git子模块与svn子模块不兼容,因为它们总是引用固定版本。见:

  • “”
  • “”

但是,正如我在“”中提到的,自git 1.8.2(2013年3月)以来,您可以通过子模块跟踪回购协议分支的最新情况

$ git submodule add -b <branch> <repository> [<path>]
$ git submodule update --remote ...
$git子模块添加-b[]
$git子模块更新--远程。。。

您也可以将第三方库签出到树中,然后git将其(包括所有.SVN子目录)添加到主项目中

有点脏,但也有点简单和直接


当您需要更新时,只需svn update和git commit。

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

SmartGit将其显示为指向“”的子模块https://url.of.svn/repository/blah/branches/branch(url+连接的分支值)在版本1234处(如果未指定,则使用头部版本)。fetch+分支+标记类似于.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
更多详细信息请参见.gitsvenxtmodules


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

>“您可以对您的svn repo进行Git svn克隆”-问题是它不是我的svn repo-它是第三方repo。这无关紧要。如果您可以执行
svn签出
您还可以执行
git svn克隆
。您可以查看子模块如何更改为能够执行@Matt true,我添加了一个指向此答案的链接(我编写了此链接)。谢谢你提醒我更新这篇文章。听起来很可怕:)同意。有一点很好,因为git只存储相同的文件一次,当您提交签出的SVN repo时,您只需为SVN在签出时复制每个文件支付一次费用(它这样做是为了与原始文件进行比较)。