【问题标题】:Git submodule pushGit子模块推送
【发布时间】:2011-04-28 06:05:47
【问题描述】:

如果我修改一个子模块,我可以将提交推回子模块的来源,还是需要克隆? 如果克隆,我可以将克隆存储在另一个存储库中吗?

【问题讨论】:

  • 使用 git 2.7(2016 年 1 月),您只需设置一次 git config push.recurseSubmodules on-demand。然后一个简单的git push 就足以推送 everything(主 repo 和子模块)。见my edited answer below
  • 请提供您正在尝试做的示例代码。

标签: git git-submodules


【解决方案1】:

一个子模块不过是一个 git repo 在另一个 repo 中的克隆,带有一些额外的元数据(gitlink 树条目,.gitmodules 文件)

$ cd your_submodule
$ git checkout master
<hack,edit>
$ git commit -a -m "commit in submodule"
$ git push
$ cd ..
$ git add your_submodule
$ git commit -m "Updated submodule"

【讨论】:

  • 是的,不要忘记在推送之前从同步的本地分支(如果有)中提取更改。发生例如。在使用gh-pages 分支获取 github 存储库上的文档时:)
  • 我不明白如何在添加 your_submodule 之前 cd your_submodule ?我认为添加子模块的最佳方法是使用“add”git 命令。那么是否有另一种添加子模块的方法?
  • @MrSo 我认为子模块已经存在,他正在加入其中以更改子模块中的某些内容。
  • 可以对所有子模块迭代完成吗?
  • @MrSo git add your_submodule 没有将子模块添加到项目中,子模块已经在这里。将子模块添加到项目的命令是:git submodule add [url]。他在这里所做的只是将对子模块所做的更改从工作目录移动到暂存区。就像他对任何其他更改所做的那样(即git add [filename/-A/.])。然后他可以提交更改。
【解决方案2】:

请注意,由于 git1.7.11([ANNOUNCE] Git 1.7.11.rc1release note,2012 年 6 月)提到:

git push --recurse-submodules”学会了选择性地查看绑定到超级项目的子模块的历史并将它们推出。

可能在this patch--on-demand 选项之后完成:

recurse-submodules=<check|on-demand>::

确保要推送的修订所使用的所有子模块提交在远程跟踪分支上可用。

  • 如果使用check,将检查在要推送的修订中更改的所有子模块提交是否在远程可用。
    否则推送将被中止并以非零状态退出。
  • 如果使用on-demand,所有在要推送的修订中发生变化的子模块都将被推送。
    如果按需无法推送所有必要的修订,它也将被中止并以非零状态退出。

因此,您可以使用(来自父存储库)a 一次性推送所有内容:

git push --recurse-submodules=on-demand

此选项仅适用于一层嵌套。不会推送对另一个子模块内部的子模块的更改。


使用 git 2.7(2016 年 1 月),一个简单的 git push 就足以推送父 repo... 和 所有 它的子模块。

参见commit d34141ccommit f5c7cd9(2015 年 12 月 3 日)、commit f5c7cd9(2015 年 12 月 3 日)和commit b33a15b(2015 年 11 月 17 日)Mike Crowe (mikecrowe)
(由 @ 合并987654329@commit 5d35d72,2015 年 12 月 21 日)

push: 添加recurseSubmodules 配置选项

--recurse-submodules 命令行参数已存在一段时间 时间,但它没有等效的配置文件。

按照git fetch对应参数的样式,我们来 发明push.recurseSubmodules 为该参数提供默认值。
这也需要将--recurse-submodules=no 添加到 允许在命令行上覆盖配置 必填。

实现这一点的最直接方法似乎是 pushsubmodule-config 中使用代码的方式与fetch 类似。

git config doc now include:

push.recurseSubmodules:

确保要推送的修订所使用的所有子模块提交在远程跟踪分支上可用。

  • 如果值为'check',则Git 将验证在要推送的修订中更改的所有子模块提交在子模块的至少一个远程上可用。如果缺少任何提交,推送将被中止并以非零状态退出。
  • 如果值为'on-demand',那么所有在要推送的修订中发生变化的子模块都将被推送。如果按需无法推送所有必要的修订,它也将被中止并以非零状态退出。 -
  • 如果值为“no”,则保留推送时忽略子模块的默认行为。

您可以在推送时通过指定“--recurse-submodules=check|on-demand|no”覆盖此配置。

所以:

git config push.recurseSubmodules on-demand
git push

Git 2.12(2017 年第一季度)

git push --dry-run --recurse-submodules=on-demand 确实有效。

commit 0301c82commit 1aa7365(2016 年 11 月 17 日)Brandon Williams (mbrandonw)
(由 Junio C Hamano -- gitster -- 合并于 commit 12cf113,2016 年 12 月 16 日)

push run with --dry-run 实际上(Git 2.11 Dec. 2016 及更低版本/之前)在 push 配置为 push 子模块时执行空运行 点播。
相反,所有需要推送的子模块实际上都被推送到它们的远程,而超级项目的任何更新都是作为试运行执行的。
这是一个错误,而不是预演的预期行为。

教导push 在配置为“按需”递归推送子模块时尊重--dry-run 选项。
这是通过将--dry-run 标志传递给子进程来完成的,该子进程在执行空运行时执行子模块的推送。


在 Git 2.12 中,您现在有一个“--recurse-submodules=only”选项可以在不推出顶级超级项目的情况下推出子模块

参见Brandon Williams (mbrandonw)commit 225e8bfcommit 6c656c3commit 14c01bd(2016 年 12 月 19 日)。
(由 Junio C Hamano -- gitster -- 合并到 commit 792e22e,2017 年 1 月 31 日)


对于 Git 2.36(2022 年第二季度),“git fetch --negotiate-only(man)git push(man) 使用的内部命令找出我们历史的哪一部分从另一边消失了。
即使设置了fetch.recursesubmodules 配置变量,它也不应该递归到子模块中,也不应该触发“gc”。
代码已被收紧,以确保它只进行共同祖先的发现,而不进行其他任何事情。

请参阅commit 386c076commit 135a12bcommit bec587d(2022 年 1 月 18 日)Glen Choo (chooglen)
请参阅 Junio C Hamano (gitster)commit de4eaae(2022 年 1 月 20 日)。
(由 Junio C Hamano -- gitster -- 合并于 commit 472a219,2022 年 2 月 9 日)

fetch --negotiate-only: 不更新子模块

签字人:Glen Choo

git fetch --negotiate-only(man) 是推送协商的实现细节,与大多数 git fetch(man) 调用不同,它实际上并不更新主存储库。
因此,即使启用了子模块递归,它也不应该更新子模块。

这不仅慢,而且是错误的,例如使用“submodule.recurse=true”进行推送协商将导致子模块被更新,因为它调用了git fetch --negotiate-only

如果给出--negotiate-only,则通过禁用子模块递归来解决此问题。
由于这使--negotiate-only--recurse-submodules 不兼容,请检查此无效组合并死亡。

fetch-options 现在包含在其man page 中:

这与--recurse-submodules=[yes|on-demand] 不兼容。

【讨论】:

  • 这个现在可以用了吧?
  • @CMCDragonkai 是的,你可以在git-scm.com/docs/git-push 看到它。我已经编辑了答案。
  • 有递归提交吗?
  • 你总是可以做'git submodule foreach commit'
  • 我必须用 bitbucket url 更新我的 .gitmodules 文件。
猜你喜欢
  • 2014-07-31
  • 2021-03-08
  • 2019-02-22
  • 2017-10-05
  • 2021-01-31
  • 2015-05-28
  • 2018-08-02
  • 2014-11-03
  • 1970-01-01
相关资源
最近更新 更多