2009-02-20 82 views
154

我有两个SVN项目正在使用从另一个SVN仓库使用svn:externalsSVN:外部在Git中相当于?

如何在Git中使用相同的存储库布局结构?

+7

在过去的4年中,任何人都有新的答案,或者今天Git的世界一样吗? – DougW 2013-04-19 23:37:44

+3

@DougW是的,我有一个[新的答案](http://stackoverflow.com/a/18088319/6309):`git submodule`现在可以模拟`svn:external`(自2013年3月起)。 – VonC 2013-08-06 18:58:33

回答

116

Git有相似,但不完全等同于SVN两种方法:外部对象:

  • 子树合并插入外部项目的代码到您的回购协议中的一个单独的子目录。这有一个detailed process to set up,然后对其他用户来说非常容易,因为当存储库被检出或克隆时它会自动包括在内。这可以是在项目中包含依赖关系的一种便捷方式。
    很容易从其他项目中获取更改,但很难将更改提交回来。如果另一个项目必须从您的代码中合并,项目历史将被合并,并且两个项目实际上将成为一个项目。

  • Git submodulesmanual)链接到一个特定的承诺在其他项目的资料库,就像SVN:与-r参数的外部。子模块易于设置,但所有用户必须管理子模块,这些子模块不会自动包含在结帐(或克隆)中。
    尽管将更改提交回其他项目很容易,但如果回购已更改,则这样做可能会导致问题。因此,将修改提交回正在积极开发的项目通常是不适当的。

+16

仅供参考,现在可以用svn:externals现在指定具体修订版(因为我相信1.5或1.6) – 2010-09-22 21:14:28

6

你应该看看Git submodules。它应该允许几乎完全符合你的要求。

+0

@JonathonReinhart - 我做了编辑 – Sonny 2014-08-21 17:31:26

27

正如我在“Git submodule new version update”何况,你可以实现相同SVN外部特征使用Git 1.8.2子模块:

git config -f .gitmodules submodule.<path>.branch <branch> 

这足以让一个子模块遵循一个分支(如在子模块upstream repo的远程分支的最新提交中那样)。所有你需要做的是:

git submodule update --remote 

这将更新子模块。

更多详情请见“git submodule tracking latest”。

要将现有的子模块转换成一个跟踪分支: 见“Git submodules: Specify a branch/tag”的所有步骤。

1

对于最新版本的Git,我建议在官方的Git文档中阅读关于Git submodules的文章。