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 
上一篇 下一篇

猜你喜欢

热点阅读