给出一个git存储库,其中包含数百个我不需要或不想初始化的子模块,因为这会花费很长时间,我该如何将子模块指针移动到每个子模块的最新提交?
如果所有子模块都已初始化,则可以使用git submodule foreach git pull
之类的东西。
可能存在一些相关的陷阱,例如需要指定要拉出每个子模块的哪个分支。在这种情况下,git应该为每个子模块使用.gitmodules文件中指定的分支。我希望该命令继续执行并遵循指定的分支,即使子模块的历史记录已被重写。如果.gitmodules文件中指定的分支不存在,我希望得到一个错误。
错误应在命令输出末尾报告或发送到日志文件,以使它们不会被忽略。
答案 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 ...
: