我使用 svn:externals 从另一个 SVN 存储库使用了两个 SVN 项目。
如何在 Git 中拥有相同的存储库布局结构?
Git 有两种与 svn:externals 类似但不完全等价的方法:
子树合并将外部项目的代码插入到您的存储库中的单独子目录中。这有一个详细的设置过程,对于其他用户来说非常容易,因为它会在存储库被检出或克隆时自动包含在内。这是在项目中包含依赖项的便捷方式。从另一个项目中提取更改很容易,但提交更改回来很复杂。如果另一个项目必须从您的代码中合并,则项目历史会合并,两个项目实际上会合二为一。
Git 子模块(手动)链接到另一个项目存储库中的特定提交,很像带有 -r 参数的 svn:externals。子模块易于设置,但所有用户都必须管理子模块,这些子模块不会自动包含在结帐(或克隆)中。尽管将更改提交回其他项目很容易,但如果 repo 发生更改,这样做可能会导致问题。因此,通常不适合将更改提交回正在积极开发的项目。
正如我在“Git submodule new version update”中提到的,您可以使用 Git 1.8.2 子模块实现相同的 SVN 外部功能:
git config -f .gitmodules submodule.<path>.branch <branch>
这足以让子模块跟随分支(如子模块 upstream repo 的远程分支的最新提交)。您需要做的就是:
git submodule update --remote
这将更新子模块。
更多详细信息在“git submodule
tracking latest”中。
要将现有的子模块转换为跟踪分支的子模块:请参阅“Git submodules: Specify a branch/tag”中的所有步骤。
svn:externals
那样进行部分结帐吗?
--depth
,但它并不能真正解决问题。
我是 gil (git links) 工具的作者
我有解决该问题的替代方案 - gil (git links) tool
它允许描述和管理复杂的 git 存储库依赖项。
它还为 git recursive submodules dependency problem 提供了解决方案。
假设您有以下项目依赖项:sample git repository dependency graph
然后您可以使用存储库关系描述定义 .gitlinks
文件:
# Projects
CppBenchmark CppBenchmark https://github.com/chronoxor/CppBenchmark.git master
CppCommon CppCommon https://github.com/chronoxor/CppCommon.git master
CppLogging CppLogging https://github.com/chronoxor/CppLogging.git master
# Modules
Catch2 modules/Catch2 https://github.com/catchorg/Catch2.git master
cpp-optparse modules/cpp-optparse https://github.com/weisslj/cpp-optparse.git master
fmt modules/fmt https://github.com/fmtlib/fmt.git master
HdrHistogram modules/HdrHistogram https://github.com/HdrHistogram/HdrHistogram_c.git master
zlib modules/zlib https://github.com/madler/zlib.git master
# Scripts
build scripts/build https://github.com/chronoxor/CppBuildScripts.git master
cmake scripts/cmake https://github.com/chronoxor/CppCMakeScripts.git master
每行以以下格式描述 git 链接:
存储库的唯一名称 存储库的相对路径(从 .gitlinks 文件的路径开始) Git 存储库,将在 git clone 命令中使用 存储库分支以检查 空行或以 # 开头的行不被解析(视为注释)。
最后,您必须更新您的根示例存储库:
# Clone and link all git links dependencies from .gitlinks file
gil clone
gil link
# The same result with a single command
gil update
结果,您将克隆所有必需的项目并以适当的方式将它们相互链接。
如果您想提交某个存储库中的所有更改以及子链接存储库中的所有更改,您可以使用单个命令来完成:
gil commit -a -m "Some big update"
拉、推命令的工作方式类似:
gil pull
gil push
Gil (git links) 工具支持以下命令:
usage: gil command arguments
Supported commands:
help - show this help
context - command will show the current git link context of the current directory
clone - clone all repositories that are missed in the current context
link - link all repositories that are missed in the current context
update - clone and link in a single operation
pull - pull all repositories in the current directory
push - push all repositories in the current directory
commit - commit all repositories in the current directory
关于 git recursive submodules dependency problem 的更多信息。
gil
的作者。
svn:externals
指定确切的修订号。在 1.5 版中,语法被更改为更灵活的格式。添加的是相对 URL 寻址。