git:Submodule
站内链接:
Introduction
说明: 项目的版本库在某些情况虾需要引用其他版本库中的文件(不是自己维护的代码),此时如果将公共函数库的文件拷贝到各自的项目时,会造成极大的冗余,于是 submodule 产生了.
优点:避免数据的冗余以及代码的模块化开发
缺点:无法在修改 submodule 的代码后进行提交操作.
Command
Initialize
说明:初始化本地配置文件
1 | # Initialize local configure file |
Update
说明:从项目中抓取所有数据并检出所有子模块信息
1 | # 更新并获取所有子模块 |
Add
命令: git submodule add sub-module-url sub-module-directory
说明: 添加某一个子项目到本地目录中, 其中每次提交都是使用 160000 模式,将一次提交记做一项目录记录.
例子:
1 | git submodule add https://github.com/HardySimpson/zlog.git libs/zlog |
Diff
命令: git diff –submodule
说明: 类似 git diff 命令, 不过适用于 submodule
PS: 同理, log 等命令也是此类用法以及格式
Config
命令: git config –global diff.submodule log
说明: 对 submodule 的配置, 见config.
Delete
删除某一个 submodule
3.1 Manual Delete
- Step1: 删除.gitmodules 和.git/config 中的信息
- Step2: rm -rf bundle/插件
- Step3: git rm –cached bundle/插件
- Step4: commit
Auto Delete
1 | git rm -rf bundle/pulgins-names |
Clear Cache
1 | # 用于重新下载安装插件 |
Foreach
利用 foreach 和 cmd,对每一个子模块执行任意命令
命令格式:git submodule foreach '[Command]'
1 | # 对每一个submdoule进行fetch操作, 有点类似git submodule update |
Problem
Untracked file
问题场景
在 vim 插件中存在如下问题,由于多个分支的存在(每一个分支对应一个开发环境),在转换分支会有一些 modified 文件以及 untrack 文件存在.
比例, 你创建了新的分支 Branch-new-b, 并添加了 submodule-a, 之后切换回 master 时就会有额外的文件存在.
Solved
1 | # 删除 |
Reset New File
对于新增文件的回滚, 手动方式.
1 | git submodule foreach 'git reset --hard' |
自动方式, 对于脏数据, 直接忽视: 查看是否为 dirty 目录,如果是,则编辑.gitmodule, 添加
1 | [submodule-a] |
自动添加到.gitmodule 中:
1 | git config -f .gitmoudules submodule.<path>.ignore untracked. |
Delete all untrack file
1 | git checkout . && git clean -xdf |
modified content
问题场景
在删除了某些没有控制权限的 submoudle 之后,会出现此类错误,此时会发现很多文件被删除,并且还 commit 到了本地 Index 中。
一般在使用第三方开源库的时候,发生过将本地的修改 commit 到本地 Index 缓存中,导致该问题出现,本质上就是 git 上的普通操作。
解决办法
1 | git submodule foreach 'git reset .&& git checkout .' --recursive |