美文网首页
[学习]git创建子仓库或者叫子模块

[学习]git创建子仓库或者叫子模块

作者: 吴敬悦 | 来源:发表于2021-02-25 23:45 被阅读0次

    我们公司的项目是很多项目组合而成,如果光是使用 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 这条提交记录,于是我们就明白了,有人没有提交到远程。最后发现是你负责的仓库,于是就找到你,你把本地的提交上去,然后就没问题了。

    上面是简单的使用,那么怎样才能新建一个像上面的仓库呢?

    1. 如果你是新建仓库,那么跟创建普通的仓库相同,也就是: git init 即可;
    2. 如果你已经有仓库了,你需要在这个仓库下添加子模块,那么就使用第三点;
    3. 通过 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 这样就级更新了远程地址也同步了最新的代码。

    相关文章

      网友评论

          本文标题:[学习]git创建子仓库或者叫子模块

          本文链接:https://www.haomeiwen.com/subject/eqspfltx.html