git子模块更新无法正常运行

时间:2014-07-08 14:13:37

标签: git

我有一个包含各种嵌套子模块的存储库。提交和推送工作非常顺利,并且GitHub上的更改可以按预期显示。

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

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

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

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

2 个答案:

答案 0 :(得分:14)

您需要确保您的子模块在分支之后,或者只能在特定的SHA1(不是最新的分支,而是special entry of the index of your parent repo

检出它们

参见" Git submodules: Specify a branch/tag"为了使你的子模块遵循一个分支。

然后git submodule update --init --recursive --remote足以检查该分支的最新信息。

这个(git submodule update -remote)需要git 1.8.2+ 2013年3月。OP Luís de Sousa has a git 1.7.9.5(2012年3月)并不提供此功能。

答案 1 :(得分:-1)

您有一个特定版本已提交到您的存储库。对于git,子模块是"文件"包含您提供的版本的sha1-hash。 git submodule update --init --recursive确保您的子模块完全可用于该版本。

例如:

  • 您在目录上创建git init并拥有空仓库
  • 使用git submodule add添加子模块,该子模块将记录您在自己的存储库中添加的存储库的当前主控sha1-hash
  • 对子模块进行了多次提交,但您的repo仍将包含添加子模块时的一个哈希
  • 如果在子模块中创建git pull,您将获得新的提交,并在您自己的存储库中进行未提交的更改(子模块主服务器的新sha1-hash)
  • 一旦你做出改变,你就会"固定"子模块的当前版本
  • git submodule update现在将强制执行新版本

因此,如果您自己的存储库的其他贡献者更新了他的结帐并执行git submodule update,他将获得您固定的版本。因此,一般情况下,只有在未检出子模块或者有人更改了存储库中的关联哈希时,子模块更新才会起作用。