Git子模块更新不起作用。

19

我有一个包含多个嵌套子模块的代码库。提交并推送工作正常,更改也按预期在GitHub上可见。

在测试/生产环境中,使用以下命令部署该项目的新版本:

git pull --recurse-submodules
git submodule update --init --recursive

但是这只更新了根项目,而没有更新任何子模块与GitHub上HEAD相关的提交。到目前为止,我唯一发现的更新整个项目的方法是在每个单独的子模块文件夹中运行git pull

我知道大多数地方引用的方法是使用git submodule update,但在这种情况下它并没有产生任何结果。可能是什么原因呢?

3个回答

26

你需要确保你的子模块正在遵循一个分支,否则它们将只会检出到特定 SHA1(而不是分支的最新版本,但是在父存储库的索引中的 特殊条目)。

参见 "Git子模块:指定分支/标签" 以使你的子模块跟随一个分支。

然后运行 git submodule update --init --recursive --remote 将足以从该分支检出最新版本。

这个 (git submodule update --remote) 需要 git 1.8.2+ 的支持,于 2013 年 3 月发布。OP Luís de Sousa 有一个 git 版本为 1.7.9.5 (2012 年 3 月),不提供此功能。


我尝试按照链接中的指示操作,但当我执行跟踪命令 git checkout -b master --track origin/master 时,我收到一个错误消息:fatal: A branch named 'master' already exists.。这在项目的所有子模块中都会发生。 - Luís de Sousa
@LuísdeSousa 那很有道理。尝试 git branch -u origin/master master - VonC
1
好的,我忽略了那个问题,你可能想要编辑那个答案,以使那个部分更清晰。我按照那些指示继续进行,将层次结构中的所有子模块设置为跟踪特定的分支,然后提交并推送主项目。但是,用于部署的命令 git submodule update --recursive --remote 似乎无效。我正在使用 git 1.7.9.5 版本,它的 submodule update 命令没有 --remote 标志。 - Luís de Sousa
1
@LuísdeSousa 是的,我已经编辑了我之前提到的旧答案。是的,我已经添加了git版本要求(git 1.8.2+,2013年3月)。1.7.9.5(2012年3月,超过3年前)确实有点旧了。 - VonC
1
基本上,答案就是我使用的git版本太老了。请把这句话加到你的回答中,我会接受它。感谢您的努力。 - Luís de Sousa

2
您的代码库中有一个特定版本。对于git,子模块是“文件”,其中包含您提供版本的sha1哈希值。 git submodule update --init --recursive 确保您的子模块以完全相同的版本可用。
例如:
- 在目录上进行 git init 并创建一个空仓库。 - 使用 git submodule add 添加了一个子模块,该子模块记录了您正在将其添加到自己的仓库中的仓库的当前主机的 sha1 哈希值。 - 对子模块进行多次提交,但您的仓库仍将包含您添加子模块时所拥有的那个哈希值。 - 如果在子模块中执行 git pull,则会获取新提交,并在您自己的仓库中产生未提交的更改(子模块主分支的新 sha1 哈希值)。 - 一旦提交了更改,就会“固定”子模块的当前版本。 - git submodule update 现在将强制执行新版本存在。
因此,如果您的其他贡献者更新其检出并进行 git submodule update ,他将获得您固定的版本。因此,通常情况下,只有在未检出子模块或某人更改了您的仓库中的关联哈希时,子模块更新才会执行一些工作。

所有这些信息都是正确的,但似乎并不是问题的答案。 - Luís de Sousa

0
将该仓库手动添加为子模块对我有效。
[submodule "openpoints"]
    path = openpoints
    url = http://github.com/guochengqian/openpoints.git

为了添加上述子模块,我已经调用了。
git submodule add http://github.com/guochengqian/openpoints.git openpoints

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接