有不少在github上开源的SDK,在咱们国内都有镜像库了,但多数其子库并没有一并同步更新。我在更新乐鑫SDK的时候就遇到了这个问题。走了一些弯路,但总算是搞定了,分享出来供大家使用。
修改git submodule的库地址,要分清楚“记录地址”和“实际地址”这两个位置——只改一个往往不生效,这是最容易踩的坑。git submodule的URL存在于两个地方:
.gitmodules:仓库里的记录文件,会被提交、被共享,决定别人 clone 时从哪拉取。
.git/config(或.git/modules/config):本地实际生效的地址,clone 时从 .gitmodules 拷过来的。
方法一:git submodule set-url
新版Git提供了一条命令,同时改.gitmodules和.git/config,最省事:
# 先查看子模块名称,路径通常就是名称 git submodule status cat .gitmodules # 修改指定子模块的URL(用子模块路径,如components/mbedtls) git submodule set-url <新地址>
例如:
git submodule set-url components/mbedtls https://gitee.com/mirrors/mbedtls.git
执行后可以git diff .gitmodules确认改动。
方法二:手动改 .gitmodules + sync
第1步:编辑 .gitmodules 文件
vim .gitmodules
把里面的url = ...改成新地址:
[submodule "components/mbedtls"] path = components/mbedtls url = https://gitee.com/239580/mbedtls.git
第2步:写入本地配置并强制同步
git submodule sync --recursive
git是分步,分区实现的。单纯更新.gitmodules文件,就是更新文件,并不会生效。必须再运行sync命令,才会把.gitmodules里的新URL同步到.git/config和.git/modules/*/config。不做这一步,改 .gitmodules 后本地拉取仍然走旧地地,这就是“改了没生效”的根本原因。
第3步:重新拉取
git submodule update --init --recursive
方法三:直接改 .git/config
如果你只是本地想换镜像、并不打算提交这个改动,直接改本地 config 即可,不污染 .gitmodules:
git config submodule..url <新地址> # 示例 git config submodule.components/mbedtls.url https://gitee.com/mirrors/mbedtls.git
或直接编辑文件:
vim .git/config
总结
我在更新ESP32的git库时,使用的是方法二。我觉得挺方便的。乐鑫的大版本是在gitee上有镜像,但下面几个引用的git库是没有的。分享一下我的更新完成的文件
[submodule "components/json/cJSON"] path = components/json/cJSON url = https://gitee.com/gongfengzztx/cJSON.git [submodule "components/mbedtls/mbedtls"] path = components/mbedtls/mbedtls url = https://gitee.com/239580/mbedtls.git [submodule "components/lwip/lwip"] path = components/lwip/lwip url = https://gitee.com/OliveFish/esp-lwip.git [submodule "components/mqtt/esp-mqtt"] path = components/mqtt/esp-mqtt url = https://gitee.com/javenspace/esp-mqtt.git [submodule "components/coap/libcoap"] path = components/coap/libcoap url = https://jihulab.com/esp-mirror/obgm/libcoap.git
我要赚赏金
