[学习]git创建子仓库或者叫子模块
我们公司的项目是很多项目组合而成,如果光是使用 git clone xxxxxxx.git
的方式只能拿到一个空的项目。现在我有一个父级仓库,里面包含一个子仓库,子仓库里面是包含内容的,如下图:
如果我直接使用上面的方式,那么得到内容为:
显示克隆成功
但是打开文件夹一看:
发现内容为空
于是聪明的你打开:
vscode里面的git
你立马就会惊奇的发现并没有子模块,或者跟普通的仓库相同,这是怎么回事呢?是因为如果使用这种方式,
git
就视为这就是一个普通的 git
仓库。可以看一下这篇文章: git拉取子模块 ,看上面我们可以得知,既然已经拉取下来了,那么我们就使用里面的第二条命令:
git submodule update --init --recursive
这时你就会发现成功了。如果你是第一次拉取父级仓库,那么使用 git clone --recursive 仓库地址
即可。但是你会发现分支是一个乱七八糟的分支,比如我的:
没有关系,切换到正确的分支即可,如果不清楚问一下知道的同事。
莫名其妙的文件
这个文件,回退了,发现代码好像不对了,子模块的代码同时也不是最新的了,说明是不能回退的,由于不懂也不知道能不能提交上去,可能一看内容:
diff --git a/childModule01 b/childModule01
index 37e7841..896cff4 160000
--- a/childModule01
+++ b/childModule01
@@ -1 +1 @@
-Subproject commit 37e7841631a6497a38c454e8144774b416c0843e
+Subproject commit 896cff4b3bd80c1f43b7aaac981d659994f0a7ed
这里面的内容虽然看不明白,但是知道这个文件不大,于是提交了。然后接着开发业务,开发完成了,准备提交代码到远程,发现这个文件又出现了,这次的像下面:
diff --git a/childModule01 b/childModule01
--- a/childModule01
+++ b/childModule01
@@ -1 +1 @@
-Subproject commit 896cff4b3bd80c1f43b7aaac981d659994f0a7ed
+Subproject commit 896cff4b3bd80c1f43b7aaac981d659994f0a7ed-dirty
不管内容是啥,提交就对了,结果发现就是不能提交,而且不能撤销,怎么回事。于是就不管了,县提交自己开发项目的代码即可。提交自己开发的以后,也不看这个文件了,如果此时你再看,发现跟刚刚的不一样了,而且此时可以提交了,这是因为只要子模块修改了,这个文件也会发生改变,注意内容:
diff --git a/childModule01 b/childModule01
--- a/childModule01
+++ b/childModule01
@@ -1 +1 @@
-Subproject commit 896cff4b3bd80c1f43b7aaac981d659994f0a7ed
+Subproject commit 896cff4b3bd80c1f43b7aaac981d659994f0a7ed-dirty
我们看到 -Subproject commit 896cff4b3bd80c1f43b7aaac981d659994f0a7ed
看到这个要被删除掉,而增加的是 +Subproject commit 896cff4b3bd80c1f43b7aaac981d659994f0a7ed-dirty
。此时如果你去看你子模块的提交历史,你就会发现最近一次的提交就是 896cff4b3bd80c1f43b7aaac981d659994f0a7ed
。上面就代表有新的内容,但是并没有提交,提交以后的内容:
diff --git a/childModule01 b/childModule01
index 896cff4..bc2d109 160000
--- a/childModule01
+++ b/childModule01
@@ -1 +1 @@
-Subproject commit 896cff4b3bd80c1f43b7aaac981d659994f0a7ed
+Subproject commit bc2d109d40096a2144ea94f4799b224982dc3a37
这时发现变成了 bc2d109d40096a2144ea94f4799b224982dc3a37
,看子模块最近的一次提交,发现刚好就是这个。如果你是一个粗心的人,比如你只提交到本地,但是呢父级的那个文件又被你提交到远程了,这个时候你的同事在拉取代码的时候发现会出现错误,错误 fatal: remote error: upload-pack: not our ref bc2d109d40096a2144ea94f4799b224982dc3a37
,可以看出错误提示的是找不到 bc2d109d40096a2144ea94f4799b224982dc3a37
这条提交记录,于是我们就明白了,有人没有提交到远程。最后发现是你负责的仓库,于是就找到你,你把本地的提交上去,然后就没问题了。
上面是简单的使用,那么怎样才能新建一个像上面的仓库呢?
- 如果你是新建仓库,那么跟创建普通的仓库相同,也就是:
git init
即可; - 如果你已经有仓库了,你需要在这个仓库下添加子模块,那么就使用第三点;
- 通过
git submodule add 你的仓库地址
,这里的仓库地址就是你其他仓库克隆的路径;
通过这样操作就可以成功添加子模块,如果中途你的地址发生了改变,也就是你的子模块的远程地址变了,这个时候你只需要修改父级仓库下的 .gitmodules
文件,把对应的仓库 url
修改成最新的地址即可。
[submodule "childModule01"]
path = childModule01
# 这就是 childModule01 子模块的远程仓库地址
url = https://github.com/wutiange/childModule01.git
当然也可以使用命令的方式 git config --file=.gitmodules submodule.子模块名称.url 更换后的远程地址
;完成上面操作以后再执行 git submodule sync
这样就级更新了远程地址也同步了最新的代码。