Git -- 子模块 --读摘

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013867301/article/details/84984910

git子模块

主页: https://git-scm.com/book/en/v2/Git-Tools-Submodules

既然到了这里,就无需说明使用环境。
个人感觉文档看下来,比较适合子模块单独维护,且项目没有分支需要处理的情况(比如文档记录)

添加子模块

在根目录会产生.gitmodules文件,记录了子模块和项目的映射关系,示例:

[submodule "ModuleName"]
	path = ModuleName
	url = https://github.com/chaconinc/ModuleName

对url的设置可以:

git config submodule.ModuleName.url <私有URL>
# 如果不在根目录添加,偶现过没有文件,手动fetch之类的操作就有了。。
git submodule add <repoUrl> [dir]

刚添加submodule的时候,可以看下diff:

git diff --cached ModuleName
git diff --cached --submodule
#如果不想每次都--submodule,可以在配置,就可以直接git diff查看
git config --global diff.submodule log

注意到:
普通模式是new file mode 100644,而子模块部分的new file mode 160000。
前者表示一个子目录或者一个文件的提交,后者表示目录的提交

做了修改之后,提交、推送操作和平常一样。

克隆带有子模块的项目

  • 按常规克隆,然后进入子模块的页面
git submodule init
# 这里的update有点类似Pull
git submodule update
  • 递归子模块参数
git clone --recurse-submodules <repoUrl>

注意这两种方式都会检出到一个游离分支,如果要直接合并,可以:

git checkout <branchName>
git submodule update --remote --merge
  • 好像可以直接当做项目操作。。。

其他操作

如果进入到submodule页面,都可以以一个单独项目进行常规处理,如pull,push。
下面的操作都是以父项目为主体

模块拉取最新:

# 更方便,默认检出到master分支,
git submodule update --remote [--merge|--rebase] <ModuleName>

提交模块修改(项目正常提交的时候,不会一起提交子模块的部分。所以需要检查参数):

git push --recurse-submodules=[check|on-demand]

而检查同样可以配置:

git config push.recurseSubmodules [check|on-demand]

如果是check,会失败处理;如果是on-demand,git会尝试提交未推送的子模块

检出分支的设置:

# -f .gitmodules表示所有人
git config -f .gitmodules submodule.<ModuleName>.branch stable

git status设置:

git config status.submodulesummary 1

如果有冲突(所以最好还是子模块单独维护,依赖项目只进行更新,省的出事):

# 进入到submodule页面
$ git rev-parse HEAD
$ git branch try-merge c771610
$ git merge try-merge
# 修改冲突并提交,然后返回项目页面提交

日志:

git log -p --submodule

批量操作:

$ git submodule foreach 'git stash'
$ git submodule foreach 'git checkout -b featureA'
# 查看不同
$ git diff; git submodule foreach 'git diff'

常用别名

$ git config alias.sdiff '!'"git diff && git submodule foreach 'git diff'"
$ git config alias.spush 'push --recurse-submodules=on-demand'
$ git config alias.supdate 'submodule update --remote --merge'

问题

项目切换分支的时候,子模块不会对应切换;继而产生一些问题,git都会有对应提示

而子模块的数据是存储在项目的.git中的,所以你只是简单的删除子模块的目录并不能删除子模块的数据。

猜你喜欢

转载自blog.csdn.net/u013867301/article/details/84984910