BluePen BluePen
  • Jenkins
  • OS
  • 算法
随笔
分类
标签
归档
关于
留言板
GitHub (opens new window)

Alex

一个好人
  • Jenkins
  • OS
  • 算法
随笔
分类
标签
归档
关于
留言板
GitHub (opens new window)
  • 浅克隆
  • Git 子模块
    • 添加子模块
    • 克隆含有子模块的项目
    • 更新子模块
    • 同步子模块
    • 删除子模块
  • Git FAQ
  • Git
Alex
2019-10-01
目录

Git 子模块

-> 添加子模块

将一个已存在的目标 Git 仓库添加为当前仓库的子模块。
通过命令 git submodule add [<options>] <repository_url> [<path>] 实现, eg:

git submodule add https://github.com/chaconinc/DbConnector
1

添加的子模块默认是放在当前项目的根目录,也可以指定最后一个path参数放在其它路径。
添加成功后,会生成一个新的文件 .gitmodules, 记录子模块信息。

-> 克隆含有子模块的项目

git clone命令克隆带有子模块的项目,其子模块目录会默认为空

以下两种方式可以完成子模块代码的拉取:

  1. clone 完成后继续执行两条命令
    • git submodule init, 初始化配置文件
    • git submodule update, 拉取数据到合适的目录
  2. 给 git clone 添加 --recursive 参数

-> 更新子模块

子模块在加载到主项目里就就成为了主项目的一部分,有固定的版本。不手动更新的话不会自动更新。

-> 在主项目更新子模块

  • cd到子模块目录
  • 切换到对应分支
  • 修改,提交,同步,推送
  • 返回主项目根目录,提交子模块的更新,同步,推送

总之,把子模块当作一个独立代码库处理即可。

-> 同步子模块

在当前项目执行命令 git submodule update --remote可以将子模块同步到最新的一次提交。 该命令默认同步所有子模块。也可以在后面添加具体的子模块名字,只同步局部。eg:

git submodule update --remote DbConnector
1

一般来说,这不是推荐的做法,子模块是主项目的一部分,它的版本由主项目决定。
推荐的做法是:

  • git pull同步远程更新
  • git status查看本地状态,如果有子模块版本更新,执行 git submodule update确认本次更新
  • 如果不确认,就默认表示放弃本次修改,下次提交后会使得子模块回滚到本地当前的版本

提示

git版本在 v2.14之后, 可全局配置 git config --global submodule.recurse true
使得拉取远程更新时,如果子模块有更新则自动确认更新

-> 删除子模块

  • 删除子模块目录及源码
    • 手动删除
      • 删除子模块目录
      • 删除项目目录下 .gitmodules文件中子模块相关条目
      • 删除配置项 .git/config中子模块相关条目
    • 或者执行命令 git submodule deinit [<MOD_NAME>], 即逆向初始化
  • 删除模块下的子模块目录 .git/module/*,
    • 每个子模块对应一个目录,注意只删除对应的子模块目录即可
    • 通过命令的方式 git rm --cached [<MOD_NAME>]
  • 提交修改
编辑此页 (opens new window)
更新于: 2019-10-01
浅克隆
Git FAQ

← 浅克隆 Git FAQ→

Copyright © 2019-2022 | yxxy | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式