一、写作目的
随着项目持续时间拉长,项目越来越大,牵扯的内容也越来越多,回过头想要整理下项目,才发现各种内容杂糅在一起。主要是将项目内功能、数据等分离,通过submodule的方式组织仓库。本文将介绍submodule的基本使用。
二、创建带有子仓库的存储库
环境:在Github上存在两个无关的仓库 A,B
目标:在仓库A中通过submodule功能,加入仓库B
在A项目根目录执行:
1
2
3
4git submodule add <github仓库B地址> <本地path: 可以省略>
# 如果没有设置 本地path,将会在当前路径创建一个文件夹,名称为仓库B的名字。
# 如果主动设置 本地path,将会根据path创建文件夹,内容为仓库B中的文件内容(不包含仓库B的名字)。修改仓库B内容
1
2
3
4
5
6
7# 前面已经修改本地引用的仓库B内容
cd <仓库B内容所在目录>
# 下面命令常规执行即可,例如
git add .
git commit -m "..."
git push # 如果出错可以试试:git push origin HEAD:分支名注意:此处仅会更新仓库B的内容,仓库A引用的B仍然是旧版本。这意味着,即使B仓库内容持续更新,A引用的内容也会保持不变。如果想要改变A引用的内容,需要执行文章紧接着的步骤。
同步A仓库引用的B
1
2
3
4
5cd <仓库A根目录>
git add .
git commit -m "..."
git push # 如果出错可以试试:git push origin HEAD:分支名实际上就是提交一次即可,此时会在
Github
网站会观察到B文件夹后面的Git Commit ID
发生变化。
三、使用带有子仓库的存储库
环境:在Github上存在仓库 A、B,仓库A内部引用了仓库B
目标:使用仓库A
完整的从Github克隆仓库A
1
2
3git clone <Github仓库A的地址>
# 引用仓库B的文件夹会存在,但是是空文件夹初始化A中的仓库B信息
1
2cd <仓库A根目录>
git submodule init注:如果是首次在A仓库中使用仓库B,需要通过上述命令初始化Git信息。
仓库A中同步仓库B内容
1
2
3
4
5
6
7
8cd <仓库A根目录>
git submodule update
# 打印内容如下:
$ git submodule update
Cloning into <本地path>... # 这个位置会卡顿很久,取决于B仓库的大小和下载网速
Submodule path <文件夹名称>: checked out <Git Commit ID>
$
注:上述操作会把本地A仓库中的B项目内容更新为A项目Github中指定的B仓库版本。但是进入本地B项目文件夹,执行git branch
可以看到仓库B最新的内容分支(通常为B仓库分支名)。只需要执行git checkout <B仓库分支名>
在本地更新为最新版内容
A仓库远程同步更新B
1
2
3
4
5cd <仓库A根目录>
git add .
git commit -m "..."
git push # 如果出错可以试试:git push origin HEAD:分支名