git submodule 实战

1.git submodule指什么

关于git submodule是什么,可以看下面这个链接。

//www.cnblogs.com/hwx0000/p/14146838.html

2.git submodule init做了什么

当我们git clone某一个git之后,在主目录下会有如下一个文件夹.git和文件.gitmodules(如果父仓下含有子仓)

打开.gitmodules文件,可以看到父仓下所包含的所有的子仓库的信息,一般会有子仓名字,挂载路径,下载地址,有时也会写上branch。

.gitmodules是我们git clone父仓的时候下载下来的,是父仓的文件。

下面开始获取子仓的代码,在主目录下执行git submodule init,会发现在.git文件夹下多了config

config的内容如下,可以发现git submodule init的作用就是将.gitmodules的内容复制一份到config,只不过其中path变成了active属性。

同样一份信息保存两份,有必要吗,当然有必要。

因为我们有时候可能不需要clone所有的子仓,这时我们就可以对config文件进行手动的修改,不clone某些子仓的代码

 

比起手动修改config文件带来的不规范性,我们可以多次使用命令git submodule init <submodule name 1>  <submodule name 2>来添加需要clone的子仓。

当然这时还是没有子仓的代码,下面进入git submodule update。

参考://stackoverflow.com/questions/44366417/what-is-the-point-of-git-submodule-init

3.git submodule update

完成上步骤选定需要clone的子仓之后,在主目录下运行git submodule update即可以clone那些上步骤中选定的子仓。

4.当子仓含有子仓

在完成步骤3之后,我们子仓的文件都clone下来了,不过子仓的子仓的代码还是没有,怎么办

方法同上,找到某一个子仓的主目录,可以发现下面从空文件夹,变成如下,并且多了.gitmodules,这表明这个子仓仍然是包含子仓。

在这个路径下运行git submodule init和 git submodule update,就可以clone下来子仓的子仓的代码。

那这里执行完git submodule init之后生成的config放在哪里呢,见下图

5.思考

有点感觉这个过程实在是有点麻烦,幸好项目中包含子仓的子仓只有两个,不多,可以手动的cd到那个文件夹,然后执行git submodule init + update。

我以前并不是这么做的,直接在图形化界面smartgit里面输入父仓的git地址,自动就会帮我把子仓的代码也clone下来,非常方便,不过这次遇到了一个问题

我多次实验发现,smartgit总是提示我下图,一直在clone某个子仓,虽然我一直点击“等待”,仍然不能clone成功。目前推测原因应该是这个子仓特别大,大就会导致时间长,而smartgit时间非常长后,大概8个小时这个级别,好像就会clone不下来,

这时就得只能直接用命令行了。

 

 

Tags: