子模块命令
cat .git/config
读取配置,可以查看子模块有没有被注册
为一个项目添加子模块(http)
// 可以是远程git http地址
git submodule add ~/submd/repos/lib1.git libs/lib1
clone一个带子模块的项目(project1-b)
git clone ../repos/project1.git project1-b
// 对此项目的子模块进行检查 发现存在子模块 但是子模块文件夹内并未存在内容
git submodule
// 初始化子模块
git submodule init
// 拉取子模块
git submodule update
// 简化命令
git submodule init & update
在带子模块的项目里修改子模块然后更新子模块
在project1中push之后其实就是更新了引用的commit id,然后project1-b在clone的时候获取到了submodule的commit id,然后当执行git submodule update的时候git就根据gitlink获取submodule的commit id,最后获取submodule的文件
- project1-b
- libs
- lib1
- lib1-features
cd libs\lib1 (当前就是libs的git)
// 其HEAD指向的hash和master指向的hash是一直的
➜ henryyan@hy-hp /project1-b/libs/lib1 cat .git/HEAD
c22aff85be91eca442734dcb07115ffe526b13a1
➜ henryyan@hy-hp /project1-b/libs/lib1 cat .git/refs/heads/master c22aff85be91eca442734dcb07115ffe526b13a1
- 修改lib的文件内容,并提交推送lib1更新到lib1仓库
// 先切换到master分支
git checkout master
// 修改lib1-features
echo "add by developer B" >> lib1-features
// 提交更改
git commit -a -m "update lib1-features by developer B"
// 推送更改
git push
// 此时远程仓库lib已经更新
- 提交并推送付仓库project1-b中lib的更新
看看project1-b的状态
➜ henryyan@hy-hp ~/submd/ws/project1-b git:(master) ✗ git status
# On branch master
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
# libs有一个新的提交
# modified: libs/lib1 (new commits)
#
no changes added to commit (use "git add" and/or "git commit -a")
libs/lib1的commit id由原来的c22aff85be91eca442734dcb07115ffe526b13a1更改为36ad12d40d8a41a4a88a64add27bd57cf56c9de2
➜ henryyan@hy-hp ~/submd/ws/project1-b git:(master) ✗ git diff
diff --git a/libs/lib1 b/libs/lib1
index c22aff8..36ad12d 160000
--- a/libs/lib1
+++ b/libs/lib1
@@ -1 +1 @@
-Subproject commit c22aff85be91eca442734dcb07115ffe526b13a1
+Subproject commit 36ad12d40d8a41a4a88a64add27bd57cf56c9de2
提交这个lib1的commit更新到父仓库
cd project1-b
使用父仓库的git
git add -u
git commit -m "update libs/lib1 to lastest commit id"
git push
- 另外一个项目拉取projetc1的内容
cd project1
// 拉取远程仓库的更新、得到子模块的commit-id
git pull
// 根据子模块的commit-id 拉取最新的子模块内容
// 能拉取最新的子模块内容
git update submodule
修改子模块后在存在此子模块的项目中进行同步
-
在project2的子模块lib1中进行了修改,并推送到了lib1的远程仓库
cd libs/lib1 git add README git commit -m "add file README"
-
更新project2的子模块commit id 到远程
git add . git commit -m "update lib1 to lastest commit id" git push
-
在project1中拉取最新的lib1
cd libs\lib1 // 第一步在project2修改lib1时是在master上修改了,这里先切到master git checkout master git pull origin master