如何在不初始化子模块的情况下“ git pull”所有子模块

时间:2020-06-26 05:57:01

标签: git git-submodules

给出一个git存储库,其中包含数百个我不需要或不想初始化的子模块,因为这会花费很长时间,我该如何将子模块指针移动到每个子模块的最新提交?

如果所有子模块都已初始化,则可以使用git submodule foreach git pull之类的东西。

可能存在一些相关的陷阱,例如需要指定要拉出每个子模块的哪个分支。在这种情况下,git应该为每个子模块使用.gitmodules文件中指定的分支。我希望该命令继续执行并遵循指定的分支,即使子模块的历史记录已被重写。如果.gitmodules文件中指定的分支不存在,我希望得到一个错误。

错误应在命令输出末尾报告或发送到日志文件,以使它们不会被忽略。

1 个答案:

答案 0 :(得分:4)

要获得遥控器上分支的sha1而不克隆遥控器,请使用git ls-remote

git ls-remote <repourl> <branchname>

# example :
$ git ls-remote https://github.com/git/git master
f402ea68166bd77f09b176c96005ac7f8886e14b        refs/heads/master

要在不克隆子模块的情况下更新子模块的本地sha1,请使用git update-index

git update-index --cacheinfo 160000,<sha1>,full/path/to/submodule
  • 160000是一种特殊的文件模式,指示存储在此路径的对象是提交(link to docs
  • full/path/to/submodule应该是从回购根目录到子模块的完整路径
    例如:如果您的子模块存储在foo/bar/baz中,即使您当前的工作目录是foo/bar,也应指定foo/bar/baz作为路径

“更新子模块”部分的更多详细信息

据我所知,没有集成的命令(例如git submodule <something>命令)来完成此操作。

@torek很好地解释了子模块的sha1存储在this answer中的位置:

对于包含子模块引用的任何目录,哈希ID均嵌入在树对象中。

我知道直接更新此命令的唯一方法是git update-index命令。

错误检查

git ls-remote <remote> <branch>

  • 如果您传递的分支名称不存在,此命令将不输出任何内容;其退出代码虽然会指示“成功”

git update-index --cacheinfo ...

  • 此命令将检查您要更新的路径是否已经存在
  • 它将检查sha1是否为40个字符的十六进制值
  • 但是,在更新sha1时,不会对其进行有效性检查(您没有可用的仓库来检查提交是否存在...)
相关问题