当我拉取 Git 子模块存储库及其封闭存储库时,为什么我还要提交本地更改?

2024-02-29

假设我有一个 Git 存储库 R,它有一个子目录,该子目录是子模块存储库 SR。

在机器 A 上,我对 SR 进行了更改。我承诺/推动他们。如果我向上移动到父目录,git status 将显示有本地更改。 (据我所知)这是因为 gitlink 已更新,因为子存储库发生了更改,并且需要提交并签入。因此我执行提交和推送。

在机器 B 上,我转到 SR 目录并执行 git pull。然后,我转到 repo R 中的封闭文件夹(也在机器 B 上)并执行 git pull。

尽管没有在机器 B 上进行本地更改,git status 会报告子存储库有(新提交),即它似乎期望我提交这些新更改。但为什么?这些“改变”是为了谁的利益?我可以理解对 SR 的更改构成对 R 的更改的想法。但是,如果我在 B 上都进行了更改,为什么我没有 100% 是最新的,为什么我显然有自己的本地更改需要承诺吗?


我可以理解 SR 的更改构成了 R 的更改。

这是因为 R 将 SR 引用为gitlink https://stackoverflow.com/a/16581096/6309 (索引中的特殊条目 https://stackoverflow.com/a/19354410/6309父存储库的),它代表 SR 的新 SHA1。

如果您希望其他克隆 R 的人以正确的 SHA1 取回 SR,则需要添加、提交并推送该新条目。

这意味着在 B 上,您不必从 SR 执行 git pull:它应该已经在正确的提交处检出。

如果我在 R 上执行拉取,为什么不会自动执行子模块更新?为什么这需要一个单独的操作? SR 的 gitlink 不是我执行拉取时更新的 R 状态的一部分吗?

因为一拉R只更新SRgitlink,不是实际签出的子模块SR.

注意:如果您总是必须在子模块内进行拉取,您可以改为确保SR follows它自己的master branch https://stackoverflow.com/a/18799234/6309.

cd /path/to/your/parent/repo
git config -f .gitmodules submodule.<path>.branch <branch>

这样,一个简单的git submodule update --remote足以拉动和更新SR from R.
像往常一样,如果SR更新其 HEAD,您将需要添加、提交并推送其新的 gitlinkR.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当我拉取 Git 子模块存储库及其封闭存储库时,为什么我还要提交本地更改? 的相关文章

随机推荐