我正在编写一些自动化程序来将 git 子模块更新到远程的最新版本。通常这是通过指定并运行来实现branch=<blah>
的:.gitmodules
git submodule update --remote
但对我来说,这不合适。
我处理的主要存储库超过 6 个演出,子模块超过 10 个演出。不要问我为什么,就是这样。当一个运行时git submodule update --remote --init
,git 对远程分支执行完整的检出,这需要很长时间。我想在不检查整个子模块的情况下将主存储库中的子模块指针更新为最新的。如果可能,我还想避免检查整个主存储库。所以我设计了一个使用稀疏检出并手动克隆子模块的解决方案:
1) 对主存储库执行稀疏签出.gitmodules
git clone -b <branch> --no-checkout --depth=1 <url>
git config core.sparsecheckout true
echo .gitmodules > .git\info\sparse-checkout
git checkout <topic-branch>
2)手动克隆子模块
git submodule init
git clone --no-checkout --depth=1 -b <submodule-branch> <submodule-url> <submodule-path>
在这一点上,我希望 git status 报告子模块提交的差异,因为它现在与子模块的签入版本不同。然后我可以简单地添加子模块路径、提交并创建拉取请求。但是,使用这种稀疏检出方法,主存储库不知道我在子模块中所做的更改。如果我对主存储库进行普通签出而不是稀疏签出,则此方法有效,但是我还需要签出整个主存储库。这是与 git 子模块相关的稀疏结帐的一些限制吗?
谢谢!