git子模块更新不起作用

git子模块更新不起作用,git,Git,我有一个包含各种嵌套子模块的存储库。提交和推送工作得很好,更改在GitHub上可以看到,正如预期的那样 在测试/生产环境中,使用以下命令部署此项目的新版本: git pull --recurse-submodules git submodule update --init --recursive 但这只会更新根项目,没有子模块会更新为与GitHub的头部相关联的提交。到目前为止,我发现更新整个项目的唯一方法是在每个单独的子模块文件夹中运行git pull 我知道,git submodule u

我有一个包含各种嵌套子模块的存储库。提交和推送工作得很好,更改在GitHub上可以看到,正如预期的那样

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

git pull --recurse-submodules
git submodule update --init --recursive
但这只会更新根项目,没有子模块会更新为与GitHub的头部相关联的提交。到目前为止,我发现更新整个项目的唯一方法是在每个单独的子模块文件夹中运行
git pull


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

您有一个特定的版本提交到您的存储库中。对于git,子模块是包含您提供的版本的sha1哈希的“文件”
git子模块update--init--recursive
确保您的子模块正好在该版本中可用

例如:

  • 您在目录上创建了一个
    git init
    ,并且有一个空的repo
  • 您可以使用
    git submodule add
    添加子模块,该子模块将记录您正在自己的存储库中添加的回购的当前主sha1哈希
  • 对子模块进行了多次提交,但您的repo仍将包含添加子模块时的一个哈希
  • 如果在子模块中执行
    git pull
    ,您将获得新的提交,并且在您自己的存储库中有一个未提交的更改(子模块主模块的新sha1哈希)
  • 一旦您提交了更改,您就“固定”了子模块的当前版本
  • git子模块更新
    现在将强制执行新版本

因此,如果您自己的存储库的其他贡献者更新了他的签出并执行了
git子模块更新
,他将获得您锁定的版本。因此,一般来说,只有在子模块未签出或有人更改了存储库中的关联哈希时,子模块更新才会起到一定作用。

您需要确保子模块遵循某个分支,否则它们将仅在特定的SHA1处签出(不是最新的分支,而是最新的分支)

请参阅“”,以使子模块跟随分支

然后,git子模块更新--init--recursive--remote就足以从该分支检出最新的


此(
git子模块更新--remote
)需要git 1.8.2+2013年3月。不提供此功能的(2012年3月)。

我试图按照该链接中的说明操作,但当我发出track命令
git checkout-b master--track origin/master
时,我收到一条错误消息:
致命:名为“master”的分支已经存在。
。这在项目的所有子模块中都会发生。@LuísdeSousa这是有道理的。请尝试
git branch-u origin/master
Ok,我忽略了这一点,您可能希望编辑该答案以使该部分更清晰。我继续执行这些指令,将层次结构中的所有子模块设置为跟踪特定的分支,然后提交并推进主项目。但要部署它,git子模块update--recursive--remote命令似乎无效。我使用的是git 1.7.9.5,它没有子模块更新命令的
--remote
标志。@LuísdeSousa是的,我编辑了我以前提到的答案。是的,我添加了git版本要求(git 1.8.2+,2013年3月)。1.7.9.5(2012年3月,3年多前)确实有点老了,所以基本上答案是我使用的git版本太旧了。请将此添加到您的答案中,我们将接受它。谢谢你的努力。所有这些信息都是正确的,但似乎不是问题的答案。