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