【问题标题】:Git - Working with nested submodules?Git - 使用嵌套子模块?
【发布时间】:2017-08-30 10:47:50
【问题描述】:

我有以下 git 存储库

  • Vector
  • Random
  • String

String 依赖于 Vector,并将其添加为子模块。 向量子模块随机。 Random 没有依赖关系。

  • Module: Random
  • Module: Vector
    • Submodule: Random
  • Module: String
    • Submodule: Vector
      • Submodule: Random

当我更改Vector 内部的Random 子模块(不是实际模块Random)内部的某些内容时,它不会自动更新Module: Random 或其他存在于其他地方的Submodule Random

当我更改Vector(模块)内部的某些内容时,它不会更新String 中的Vector。如果我访问String 的存储库并输入git pull,它声称一切都是最新的。如果我在submodule Vector 中输入cd 并输入git pull,那么它才会真正更新我的submodule Vector。除此之外,它还希望我将更改提交到 String 存储库,即使 String 内部没有任何更改

如果我有一个包含 50 个子模块的存储库怎么办?我的子模块将不断地发生变化,我不想在每次想要触及我的项目时都拉动,而且还要提交该拉动,因为它是改变的子模块。必须有一种更简单的方法来做到这一点。

【问题讨论】:

  • 作为基础架构的一部分,git 会保留您使用子模块的位置的提交 sha(即为什么在更新子模块时需要在父级中提交 - 您更改了 commit 正在使用子模块!)。这是因为该存储库的每个“客户端”都可能在不同的版本中使用它。如果您不想在添加新功能(和错误)时更改或更新一个客户端,但希望其他人使用最新的,这一点就变得很重要。

标签: git git-submodules


【解决方案1】:

git pull options 中所述,您应该使用来自 String(主父 repo)的 a:

git pull --recurse-submodules=yes
git submodule update --recursive

除此之外,它还希望我将更改提交到 String 存储库,即使 String 内部没有任何更改。

确实有一些变化:子模块Vector 的 gitlink(repo 索引中的特殊条目)。

如果您不想每次都必须刷新String 的内容时都这样做,而只想做一个简单的常规git pull,那么只做一次:

git config --global fetch.recurseSubmodules true

你也可以automate the submodule update as a post-checkout hook

同样,如果您设置一次,来自 String 的简单 git push 也会推送任何更改的子模块:

git config --global push.recurseSubmodules true

【讨论】:

  • 我是否需要每次String 上工作?我的子模块一定会不断变化,所以我想为了保持工作正常,我需要在任何类型工作之前像这样拉?
  • @Hatefiend 不,您可以自动化/配置这些步骤,以便只需要从String 执行简单的基本git pull。请参阅我编辑的答案。
  • 在我的module Vector 中,我做了git pull --recurse-submodules=yes,它确实正确地注意到Random 已更改,所以它说Fetching submodule random from...。之后,我输入了git submodule update --recursive,似乎什么也没发生。我cd'ed 在submodule Random 内,确实我的更改不存在。我做了git status,它说我落后了一个提交。我做了一个常规的git pull,它正确地抓住了变化。任何想法为什么它不起作用?
  • @Hatefiend 当您更改 Random 时,您是否在 String 中添加和提交?因为否则,您需要配置 Random 以跟随分支:stackoverflow.com/a/18799234/6309。然后自动化的命令变成:git submodule update --init --recursive --remote。更多信息请访问stackoverflow.com/a/24635535/6309
  • @Hatefiend 注意:如果您的子模块更改总是在它们各自的主分支上,您只需要git submodule update --init --recursive --remote:这些子模块不需要特殊配置。至于为什么,请参阅stackoverflow.com/q/37879715/6309 中的详细用例
猜你喜欢
  • 2010-12-04
  • 2015-03-22
  • 1970-01-01
  • 1970-01-01
  • 2012-11-02
  • 1970-01-01
  • 1970-01-01
  • 2013-04-07
  • 1970-01-01
相关资源
最近更新 更多