Git 子模块 - 如何在从主仓库中 pull 时保持子模块更新

标签 git github version-control git-submodules atlassian-sourcetree

我们有主 git 存储库和一个单独的 git 子模块。对于这个问题,主存储库只有一个 master 分支,子模块有两个分支 - XY

假设 Coder A 刚刚切换到子模块分支 X 并应用了一些小的更改。
编码器 B 它在子模块分支 Y 上。

现在 A 推送到远程并且 B pull - 那么它看起来不像是 B 的事件子模块提交(在他们的本地machine) 自动更改为 A 推送到分支 X 上的提交,即使 A 主动提交了已更改的子模块提交。
而对于 B,他们在分支 Y 上的版本保持事件状态。

如果 B 现在手动从存储库中 pull 并将分支设置为 X,一切都会恢复正常。

我们如何实现子模块更改/事件提交在从主存储库 pull 时自动同步?

我们使用源代码树作为 Git GUI,如果这样可以使任何解释更容易的话。

最佳答案

then it does not seam like B's active submodule commit (on their local machine) gets automatically changed to the commit that A pushed on branch X, even though A actively committed the changed submodule commit

您需要确保 A 从子模块提交并推送,然后从父仓库添加/提交并推送(以便记录新的子模块 SHA1)

Since Git 1.7.5 , git pull 也应该更新子模块。
使用 git submodule update --init --recursive

仔细检查

但是不要忘记“更新子模块”只会检查它的 SHA1,而不是分支。除非 submodule is set to track a branch ,然后执行 git submodule update --recursive --remote
即使那样,它也会 pull 一个 分支(X 或 Y),而不是两个。

A friend just told us that the repo on my friends machine might be broken. So we re-cloned it from Origin and now everything just works.

I'm now looking into tracking branches with submodules, to avoid the "checked out HEAD" issue. Can you recommend that?

正如“True Nature of Submodules”中所解释的,子模块一开始总是处于分离的 HEAD 模式。
你仍然可以强制它跟随一个分支并更新自己:参见“git submodule tracking latest”。
这意味着以下命令将在 pull 出子模块必须遵循的分支后更新子模块内容:

git submodule update --remote

关于Git 子模块 - 如何在从主仓库中 pull 时保持子模块更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44916800/

相关文章:

git - 如何将我的 Git 'master' 分支重命名为 'release'?

git - 使用 `git branch -r` 无法看到推送的分支

git - 如何修复 Git 分离头?

github - 如何将图像放在 GitHub 上的 README.md 文件中?

git - 本地 Gitlab 安装不显示所有提交

cvs - CVS 中的功能分支?

git - GitHub 中的 fork 与分支

git - Jenkins - Git - 无法从 Git 存储库 checkout

git - 您的 .gitignore 文件之一将忽略以下路径

c - github项目是如何编译&安排的,主要是Github上的C项目