你好,游客 登录 注册 搜索
背景:
阅读新闻

git学习 - 使用submodule(子模块)管理外链库 - A mobile game developer

[日期:2013-04-16] 来源:  作者: [字体: ]

git学习 - 使用submodule(子模块)管理外链库


submodule是固定commit的clone,默认为head
执行git submodule add 或对于新clone下来宿主项目执行 git submodule update后,得到的submodule的clone是处于头指针脱离状态,
在其目录中执行git branch可以看到当前没有指向任何分支。去.git/modules/xxx中查看HEAD文件,其内容为commit id而不是通常的ref。

你可以在本地的子模块中进行checkout改变分支指向,比如git checkout master使得子模块工作区改为master分支,并且可以在其中修改文件并提交和push。如果子模块工作区的提交改变了,宿主工作区中使用git diff可以看到子模块的提交id改变了:
$ git diff
diff --git a/liba b/liba
index 7670a59..dfde1a8 160000
--- a/liba
+++ b/liba
@@ -1 +1 @@
-Subproject commit 7670a59e37273cdcab931df28d4c9904743e7f19
+Subproject commit dfde1a8bf4672e8fb6626da6fb5d5f6f1bb80ed7


如果你在宿主工作区执行git add和git commit,就是修改了子模块的提交id为你刚刚执行的提交。并且你可以对宿主进行git push。但是别的机子执行git pull 和git submodule update后子模块工作区的指向还是固定的提交id(你最新提交的那个)而不是master,

因此,git的子模块就是指向固定的提交id,当然这个提交id可以改变的。

一般情况下,使用子模块的项目的程序员不会修改子模块项目,因为子模块的项目往往是由外部的团队维护的,所以宿主项目的程序需要做的是当子模块的项目版本更新时更新子模块的提交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




收藏 推荐 打印 | 录入:admin | 阅读:
相关新闻