git 子模块

Yaurora

经常碰到这种情况:当你在一个Git 项目上工作时,你需要在其中使用另外一个Git 项目。也许它是一个第三方开发的Git 库或者是你独立开发和并在多个父项目中使用的。这个情况下一个常见的问题产生了:你想将两个项目单独处理但是又需要在其中一个中使用另外一个。 这时候 submodule 就上场了!

添加子模块

1
2
3
4
5
6
7
8
9
10
11
# 直接clone,会在当前目录生成一个对应子目录存放仓库内容
$ git submodule add <submodule_url> [path/submoduleName]

# 初始化本地.gitmodules文件
$ git submodule init

# 同步远端submodule源码
$ git submodule update

# 获取主项目和所有子项目源码
$ git clone --recurse-submodules <main_project_url>

查看 & 更新

1
2
3
4
5
6
7
8
# 查看子模块
$ git submodule

# 更新项目内子模块到最新版本
$ git submodule update

# 更新子模块为远程项目的最新版本
$ git submodule update --remote

删除子模块

1
2
3
4
5
6
7
8
9
10
# 1、 删除子模块文件夹
$ git rm --cached <submodule>
$ rm -rf <submodule>

# 2、删除.gitmodules文件中相关子模块信息

# 3、删除.git/config中的相关子模块信息

# 4、删除.git文件夹中的相关子模块文件
$ rm -rf .git/modules/<submodule>

同步

  • 向上同步

    1
    2
    3
    4
    5
    # 当子模块有未被使用的新提交时(例如在 sub-module.git 中执行 git pull --rebase 拉取新的内容后),git 会给予提示

    # 将子模块的内容同步到主仓库,只需要在主仓库中创建一个新的提交即可
    $ git add submodule
    $ git commit -m "message"
  • 向下同步

    1
    2
    # 主要是更新
    $ git submodule update

注意点

  1. 当子模块有提交的时候,没有push到远程仓库, 父级引用子模块的commit更新,并提交到远程仓库, 当别人拉取代码的时候就会报出子模块的commit不存在 fatal: reference isn’t a tree
  2. 如果你仅仅引用了别人的子模块的游离分支,然后在主仓库修改了子仓库的代码,之后使用git submodule update拉取了最新代码,那么你在子仓库游离分支做出的修改会被覆盖掉。
  3. 我们假设你一开始在主仓库并没有采用子模块的开发方式,而是在另外的开发分支使用了子仓库,那么当你从开发分支切回到没有采用子模块的分支的时候,子模块的目录并不会被Git自动删除,而是需要你手动的删除了。
  • 标题: git 子模块
  • 作者: Yaurora
  • 创建于 : 2020-08-26 17:57:39
  • 更新于 : 2023-02-21 21:12:07
  • 链接: https://jingyu.life/2020/08/26/git/git-submodule/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。