我使用svn:externals从另一个SVN存储库中使用了两个SVN项目。
我如何在Git中具有相同的存储库布局结构?
我使用svn:externals从另一个SVN存储库中使用了两个SVN项目。
我如何在Git中具有相同的存储库布局结构?
Answers:
Git有两种与svn:externals类似但不完全相同的方法:
子树合并将外部项目的代码插入存储库中的单独子目录中。这有一个详细的设置过程,对于其他用户来说非常容易,因为在签出或克隆存储库时会自动包含该过程。这是在项目中包含依赖项的便捷方法。
从另一个项目中拉取更改很容易,但是将更改提交回去很复杂。而且,如果另一个项目必须从您的代码中合并,则项目历史记录将被合并,并且两个项目实际上成为一个项目。
Git子模块(手册)链接到另一个项目存储库中的特定提交,就像带有-r
参数的svn:externals一样。子模块易于设置,但是所有用户都必须管理子模块,这些子模块不会自动包含在签出(或克隆)中。
尽管将更改提交回另一个项目很容易,但是如果存储库已更改,这样做可能会引起问题。因此,通常不宜将更改提交回正在积极开发的项目。
svn:externals
。在1.5版中,语法已更改为更灵活的格式。添加的是相对URL寻址。
正如我在“ Git子模块新版本更新 ”中提到的那样,您可以使用Git 1.8.2子模块实现相同的SVN外部功能:
git config -f .gitmodules submodule.<path>.branch <branch>
这足以使子模块遵循分支(如子模块上游repo的远程分支的LATEST提交)。您需要做的只是:
git submodule update --remote
这将更新子模块。
更多详细信息在“ git submodule
跟踪最新 ”中。
要将现有子模块转换为一个跟踪分支的子模块,请执行以下操作:请参阅“ Git子模块:指定分支/标签 ”中的所有步骤。
svn:externals
吗?
--depth
但是并不能真正解决问题。
我有一个替代的解决方案-gil(git links)工具
它允许描述和管理复杂的git仓库依赖性。
它还为git递归子模块依赖问题提供了解决方案。
考虑您具有以下项目依赖项: 样本git信息库依赖关系图
然后,您可以.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链接:
最后,您必须更新您的根样本存储库:
# 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链接)工具支持以下命令:
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递归子模块依赖问题的更多信息。
gil
。