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

如何在不初始化子模块的情况下“git pull”所有子模块,git,git-submodules,Git,Git Submodules,如果git存储库中有数百个子模块,我不需要或不想初始化它们,因为这需要很长时间,那么如何将子模块指针移动到每个子模块的最新提交 如果所有的子模块都初始化了,我可以使用类似于git子模块的东西来实现每个git pull 可能存在一些相关的问题,比如需要指定要拉取每个子模块的哪个分支。在这种情况下,git应该为每个子模块使用.gitmodules文件中指定的分支。即使子模块的历史记录已被重写,我也希望命令继续执行并遵循指定的分支。如果在.gitmodules文件中指定的分支不存在,我希望得到一个错误

如果git存储库中有数百个子模块,我不需要或不想初始化它们,因为这需要很长时间,那么如何将子模块指针移动到每个子模块的最新提交

如果所有的子模块都初始化了,我可以使用类似于
git子模块的东西来实现每个git pull

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


错误应该在命令输出结束时报告,或者发送到日志文件中,以便不被忽略。

要在不克隆远程设备的情况下获取远程设备上分支的
sha1
:使用
git ls remote

git ls-remote <repourl> <branchname>

# example :
$ git ls-remote https://github.com/git/git master
f402ea68166bd77f09b176c96005ac7f8886e14b        refs/heads/master
  • 160000
    是一种特殊的文件模式,它指示存储在此路径中的对象是提交()
  • full/path/to/submodule
    应该是从repo根开始到子模块的完整路径
    e、 g:如果子模块存储在
    foo/bar/baz
    中,即使当前工作目录是
    foo/bar
    ,也应该指定
    foo/bar/baz
    作为路径

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


据我所知,没有集成的命令(例如:一个
git子模块
命令)来执行此操作

@torek很好地解释了子模块的sha1存储在何处:

对于包含子模块引用的任何目录,哈希ID都嵌入到树对象中[…]

据我所知,直接更新此文件的唯一方法是
git update index
命令

错误检查

git ls remote

  • 如果您传递的分支名称不存在,此命令将不会输出任何内容;但其退出代码将指示“成功”
git更新索引--cacheinfo…

  • 此命令将检查您正在更新的路径是否已存在
  • 它将检查sha1是否为40个字符的十六进制值
  • 但是,在您更新sha1时,不会对其有效性执行任何检查(您手头没有检查提交是否存在的repo…)

这只是打印分支上最新提交的哈希值。问题是要寻找一种方法来自动更新数百个子模块的子模块指针。@DV82XL:你是对的,我认为有一个明确标识的文件要更新,结果是更新单个子模块的命令隐藏得比我认为的更深没有集成的命令,但子模块本身就是repos。如果我可以在常规回购协议上做一个测试,为什么不在子模块上做呢?OP要求一个根本没有子模块初始化的解决方案,所以我试着回答这个问题。正如您所建议的,使用“浅克隆”也是避免完全克隆的一个好方法。
git update-index --cacheinfo 160000,<sha1>,full/path/to/submodule