48 lines
2.0 KiB
Markdown
48 lines
2.0 KiB
Markdown
|
|
主仓库和子仓库确实是独立的 Git 仓库,各自有自己的提交历史。但关键在于: 主仓库需要记录"使用子模块的哪个版本"
|
|||
|
|
|
|||
|
|
工作原理
|
|||
|
|
当你在主仓库中添加 submodule 时,主仓库实际上存储的是:
|
|||
|
|
子模块的远程仓库 URL(存在 .gitmodules 文件中)
|
|||
|
|
子模块的特定 commit SHA(这是关键!)
|
|||
|
|
你可以理解为主仓库中有一个"指针",指向子模块的某个具体 commit。
|
|||
|
|
为什么需要更新引用?
|
|||
|
|
看这个场景:
|
|||
|
|
# 子模块当前在 commit abc123
|
|||
|
|
# 主仓库记录:thingsboard-client-demo -> abc123
|
|||
|
|
|
|||
|
|
# 你修改了子模块代码
|
|||
|
|
cd thingsboard-client-demo
|
|||
|
|
git commit -m "新功能" # 产生新 commit def456
|
|||
|
|
git push
|
|||
|
|
|
|||
|
|
# 此时:
|
|||
|
|
# - 子模块远程仓库:最新是 def456
|
|||
|
|
# - 主仓库记录:仍然是 abc123 ❌
|
|||
|
|
如果不更新主仓库的引用,会发生什么?
|
|||
|
|
其他团队成员克隆主仓库后,执行 git submodule update
|
|||
|
|
他们会得到 abc123 版本的子模块
|
|||
|
|
他们看不到你的新功能(def456)!
|
|||
|
|
更新引用的作用
|
|||
|
|
cd /Users/sunpeng/workspace/hyf
|
|||
|
|
git add thingsboard-client-demo # 更新指针:abc123 -> def456
|
|||
|
|
git commit -m "Update submodule"
|
|||
|
|
git push
|
|||
|
|
这一步是在告诉主仓库:"现在请使用子模块的 def456 版本"。
|
|||
|
|
类比理解
|
|||
|
|
可以把它想象成:
|
|||
|
|
子仓库 = 一个独立的软件包(比如 npm 包)
|
|||
|
|
主仓库 = package.json 文件
|
|||
|
|
当你更新了软件包的代码并发布新版本后,你还需要在 package.json 中更新版本号,告诉项目"请使用新版本"。
|
|||
|
|
// 类似于
|
|||
|
|
{
|
|||
|
|
"dependencies": {
|
|||
|
|
"thingsboard-client-demo": "1.0.0" // 旧版本
|
|||
|
|
"thingsboard-client-demo": "1.1.0" // 需要手动更新到新版本
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
总结
|
|||
|
|
主仓库和子仓库是独立的,但主仓库需要明确记录使用子仓库的哪个版本。这样可以:
|
|||
|
|
保证团队成员获得一致的代码版本
|
|||
|
|
支持版本回退(可以回到使用旧版本子模块的状态)
|
|||
|
|
避免子模块"自动更新"导致的不可预期问题
|
|||
|
|
这就是为什么修改子模块后,需要在主仓库中更新引用的原因。
|