Git Submodule使用
2019-11-26 本文已影响0人
nzjcnjzx
创建Git Submodule测试项目
$ mkdir -p submd/repos
创建需要的本地仓库:
$ cd submd/repos/
git --git-dir=lib1.git init --bare
git --git-dir=lib2.git init --bare
git --git-dir=project1.git init --bare
git --git-dir=project2.git init --bare
初始化项目
git clone ../repos/project1.git
为主项目添加Submodules
git submodule add ~/submd/repos/lib1.git libs/lib1
git submodule add ~/submd/repos/lib2.git libs/lib2
分别是远程仓库 当前添加的本地目录
cat .gitmodules
记录了每个submodule的引用信息,知道在当前项目的位置以及仓库的所在。
提交到仓库。
git commit -a -m "add submodules[lib1,lib2] to project1"
git push
Clone带有Submodule的仓库
git submodule 查看submodules的状态是hash码和文件目录,但是注意前面有一个减号:-,含义是该子模块还没有检出。
git submodule init 注册
git submodule update 更新
这样就检出了子模块
修改Submodule
git checkout master
先进入子模块进行修改,添加,提交
然后还要进入项目模块进行添加 提交 更新 提交项目模块引用submodule的commit id:
脚本批量更新
--------------------------------------------------------------------------
#!/bin/bash
grep path .gitmodules | awk '{ print $3 }' > /tmp/study-git-submodule-dirs
# read
while read LINE
do
echo $LINE
(cd ./$LINE && git checkout master && git pull)
done < /tmp/study-git-submodule-dirs
--------------------------------------------------------------------------
首先把子模块的路径写入到文件/tmp/study-git-submodule-dirs中;
然后读取文件中的子模块路径,依次切换到master分支(修改都是在master分支上进行的),最后更新最近改动。
使用脚本
chmod +x ./bin/update-submodules.sh
./bin/update-submodules.sh
--------------------------------------------------------------------------
git submodule foreach git pull
此命令也脚本一样,循环进入(enter)每个子模块的目录,然后执行foreach后面的命令。
该后面的命令可以任意的,例如 git submodule foreach ls -l 可以列出每个子模块的文件列表
一次性Clone项目和Submodules
git clone /path/to/repos/foo.git
git submodule init
git submodule update
上面的命令简直弱暴了,直接一行命令搞定: recursive 表示递归获取 项目和所有子模块
git clone --recursive /path/to/repos/foo.git
相关命令
拉取所有子模块
git submodule foreach git pull
git submodule foreach --recursive git submodule init
git submodule foreach --recursive git submodule update