git学习 - 使用submodule(子模块)管理外链库
submodule是固定commit的clone,默认为head
执行git submodule add 或对于新clone下来宿主项目执行 git submodule update后,得到的submodule的clone是处于头指针脱离状态,在其目录中执行git branch可以看到当前没有指向任何分支。去.git/modules/xxx中查看HEAD文件,其内容为commit id而不是通常的ref。
diff --git a/liba b/liba
index 7670a59..dfde1a8 160000
--- a/liba
+++ b/liba
@@ -1 +1 @@
-Subproject commit 7670a59e37273cdcab931df28d4c9904743e7f19
+Subproject commit dfde1a8bf4672e8fb6626da6fb5d5f6f1bb80ed7
一般情况下,使用子模块的项目的程序员不会修改子模块项目,因为子模块的项目往往是由外部的团队维护的,所以宿主项目的程序需要做的是当子模块的项目版本更新时更新子模块的提交ID,可以通过tag来管理子模块的更新:
当维护子模块的程序员给子模块对应的项目在master分支上打了一个tag,并把tag push到服务器上的共享库中。宿主项目的主程序需要在本机进入子模块工作区,执行git tag来查看tag列表。执行git checkout tagX 将子模块的工作区切换到tagX对应的提交id上,然后再推出到上层宿主项目工作区,使用git diff查看是否子模块的提交id改变了,如果改变了执行git add, git commit更新子模块对应的提交id。
分支和submodule:
submodule是属于分支的,不同的分支可以设定submodule不同的提交id, check out到新分支需要执行git submodule update来更新submodule