SVN:Git 中的外部等效项?
Posted
技术标签:
【中文标题】SVN:Git 中的外部等效项?【英文标题】:SVN:externals equivalent in Git? 【发布时间】:2010-10-08 22:41:31 【问题描述】:我有两个使用svn:externals 来自另一个SVN 存储库的SVN 项目。
如何在 Git 中拥有相同的存储库布局结构?
【问题讨论】:
您应该查看Git submodules。它应该几乎完全符合您的要求。 在过去的 4 年里,有人对此有新的答案,还是今天的 git 世界也一样? @DougW 是的,我有一个 new answer below:git submodule
现在可以模拟 svn:external
(自 2013 年 3 月起)。
对于最新版本的 Git,我建议阅读官方 Git 文档中的 Git submodules。
【参考方案1】:
Git 有两种方法类似于但不完全等同于 svn:externals:
子树合并将外部项目的代码插入到您的存储库中的单独子目录中。这有一个detailed process to set up,然后对于其他用户来说非常容易,因为它会在存储库被检出或克隆时自动包含在内。这是在项目中包含依赖项的便捷方式。 从另一个项目中提取更改很容易,但提交更改回来很复杂。如果另一个项目必须从您的代码中合并,则项目历史记录会合并,两个项目实际上会合二为一。
Git submodules (manual) 链接到另一个项目存储库中的特定提交,很像带有-r
参数的svn:externals。子模块易于设置,但所有用户都必须管理子模块,这些子模块不会自动包含在结帐(或克隆)中。
尽管将更改提交回其他项目很容易,但如果 repo 发生更改,这样做可能会导致问题。因此,通常不适合将更改提交回正在积极开发的项目。
【讨论】:
仅供参考,现在可以使用 svn:externals 指定特定的修订版本(我相信是 1.5 还是 1.6?) 仅供参考,git 子模块可以自动管理和提交。 git 创建一个 .gitmodules 文件,该文件可以/应该像 .gitignore 文件一样提交。请参阅 [git-scm.com/book/en/Git-Tools-Submodules] 了解更多信息。 @NateParsons 始终可以使用svn:externals
指定准确的修订号。在 1.5 版中,语法被更改为更灵活的格式。添加的是相对 URL 寻址。
@NateParsons 但是否可以使用 git 子模块省略修订... >_>
我认为不可能像 svn:externals 那样 git 子模块单个文件【参考方案2】:
正如我在“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
那样做部分结账吗?
@nowox 是的,您可以将稀疏结帐(git 1.7+ ***.com/a/2372044/6309)关联到子模块(***.com/a/17693008/6309)
不幸的是,所有与结帐相关的稀疏答案都没有给出任何示例:(我将尝试为此编写一个 Gist 示例...
这个还是有问题的。您仍然需要获取只需要一小部分的存储库的全部历史记录。在我的情况下是 100kB 超过 2GB。我当然可以使用--depth
,但这并不能真正解决问题。
@nowox 最好问一个新问题,准确解释您的用例是什么:我不知道您的 2GB 存储库是子模块还是带有子模块的主存储库,以及您到底需要什么从中提取。【参考方案3】:
我是gil (git links) tool的作者
我有一个替代解决方案 - gil (git links) tool
它允许描述和管理复杂的 git 存储库依赖项。
它还为git recursive submodules dependency problem 提供了解决方案。
假设您有以下项目依赖项: sample git repository dependency graph
然后你可以定义.gitlinks
文件和repositories关系描述:
# 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 clone 命令中使用的 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 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:Git 中的外部等效项?的主要内容,如果未能解决你的问题,请参考以下文章