SVN: Git 中的外部等价物?

我有两个使用 Svn: 外部的 SVN 项目,它们来自另一个 SVN 存储库。

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

90750 次浏览

Git 有两种方法与 svn 类似,但并不完全等价:

    将外部项目的代码插入到回购文件中的一个单独的子目录中。这有一个 制定详细程序,然后对于其他用户来说非常容易,因为在签出或克隆存储库时会自动包含它。这是在项目中包含依赖项的一种方便的方法。< br > 从其他项目中提取更改很容易,但是提交回来的更改却很复杂。如果另一个项目必须从您的代码中合并,那么项目历史记录将被合并,两个项目实际上成为一个项目。

    指向另一个项目存储库中特定提交的 < strong > Git 子模块 (手动操作)链接,非常类似于带有 -r参数的 svn: foreign。子模块很容易设置,但所有用户都必须管理子模块,这些子模块不会自动包含在签出(或克隆)中。< br > 虽然将更改提交回其他项目很容易,但是如果回购已经更改,这样做可能会引起问题。因此,将更改提交回正在开发的项目通常是不合适的。

正如我在“ Git 子模块新版本更新”中提到的,您可以使用 Git1.8.2子模块实现 相同的 SVN 外部特性:

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

这足以使子模块遵循分支(如子模块 上游回购的远程分支的 LATEST 提交)。你要做的就是:

git submodule update --remote

这将更新子模块。

详情请参阅「 git submodule最新追踪」。

< p > 将现有子模块转换为跟踪分支的子模块: 查看“ Git 子模块: 指定一个分支/标记”中的所有步骤

我是 Git 链接工具的作者

我有一个替代的解决方案的问题-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 链接:

  1. 存储库的唯一名称
  2. 存储库的相对路径(从. gitlinks 文件的路径开始)
  3. 将在 Git 克隆命令中使用的 Git 存储库 存储库分支到签出
  4. 不解析以 # 开头的空行或空行(作为注释处理)。

最后,您必须更新您的根示例存储库:

# 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

更多有关 递归子模依赖问题的资料。