我们有一个包含一些子模块的存储库。子模块目录之一是 API。根据主存储库的分支,API 子目录指向 API_V1 存储库或 API_V2 存储库。如果我克隆主存储库并进行开发,那么当我子模块初始化/更新时,它会指向 API_V2。但是,如果我切换到一个非常旧的分支而不是开发,并执行子模块更新或 init/update git 无法在 API 子模块中找到正确的提交,因为它仍在使用 API_V2。是否可以让 git 更改为 API 子模块中的正确存储库。我们的开发人员这样做是为了避免将 API 子目录重命名为 API_V1 和 API_V2,这需要进行许多脚本更改。 谢谢
在超级项目(父存储库)中使用
git checkout
或 git switch
切换分支后,旧的 .gitmodules
会被签出。如果文件的子模块具有不同的 URL,则应在 .git/config
中更新 URL,因为 Git 不直接使用 .gitmodules
中的 URL,它仅使用 .git/config
。更新 URL 的命令是 git submdule sync
(如果您有子模块树,请添加 --recursive
)。之后 git submodule update --init
应该将子模块更新为存储在超级项目中的相应提交。
post-checkout
hook 自动化该过程。放这个
#!/bin/sh
new_branch="$3"
if [ "$new_branch" = 1 ]; then
git submodule sync --recursive
git submodule update --init --recursive
fi
exit 0
在
.git/hooks/post-checkout
中,通过运行 chmod a+x .git/hooks/post-checkout
使文件可执行