站内链接:

Introduction

说明: 项目的版本库在某些情况虾需要引用其他版本库中的文件(不是自己维护的代码),此时如果将公共函数库的文件拷贝到各自的项目时,会造成极大的冗余,于是 submodule 产生了.

优点:避免数据的冗余以及代码的模块化开发

缺点:无法在修改 submodule 的代码后进行提交操作.

Command

Initialize

说明:初始化本地配置文件

1
2
3
4
# Initialize local configure file
git submodule init
# 检出的同时将所有子模块也检出
git clone --recursive URLs

Update

说明:从项目中抓取所有数据并检出所有子模块信息

1
2
3
4
5
6
7
# 更新并获取所有子模块
git submodule update --init --recursive

# 更新(fetch all, 默认仓库名: origin 默认分支: master)
git submodule update
# 指定远程仓库
git submodule update --remote [remote-name]

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
2
3
4
git rm -rf bundle/pulgins-names
git add .
git commit -m 'Delete submodule'
git push origin master

Clear Cache

1
2
3
4
5
6
# 用于重新下载安装插件
git rm —cached bundle/plugins
rm -rf .git/modules/bundle/plugins

# 使用--force选项
git submodule add --force ...

Foreach

利用 foreach 和 cmd,对每一个子模块执行任意命令
命令格式: git submodule foreach '[Command]'

1
2
3
4
5
6
7
8
# 对每一个submdoule进行fetch操作, 有点类似git submodule update
git submodule foreach 'git fetch'

# 重置子模块的所有更改
git submodule foreach 'git reset .&& git checkout .'

# 临时藏匿子模块更改
git submodule foreach 'git stash'

Problem

Untracked file

问题场景

在 vim 插件中存在如下问题,由于多个分支的存在(每一个分支对应一个开发环境),在转换分支会有一些 modified 文件以及 untrack 文件存在.

比例, 你创建了新的分支 Branch-new-b, 并添加了 submodule-a, 之后切换回 master 时就会有额外的文件存在.

Solved

1
2
3
4
5
# 删除
git clean -fdx

# 之后切换回Branch-new-b时
git submodue update --init

Reset New File

对于新增文件的回滚, 手动方式.

1
git submodule foreach 'git reset --hard'

自动方式, 对于脏数据, 直接忽视: 查看是否为 dirty 目录,如果是,则编辑.gitmodule, 添加

1
2
[submodule-a]
ignore = dirty

自动添加到.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