git -- 子模块的配置与使用

2,653 阅读2分钟

子模块效果

配置完子模块后,可以在一个大项目中管理很多嵌套的git子项目,当然也可以管理非git子模块目录和文件的变化。下面是我配置的子模块目录。

在本地也可以提交子模块项目的comit,也可以提交本身项目的commit。 在项目中,git只记录git子模块的commit节点,比如我新提交了一个子模块的commit。

git子模块在github上只是显示一个子模块的链接。

但是在本地,你是可以管理项目和子项目的,只是子模块的commit会提交到自己的仓库,父项目只记录commit。

子模块配置

添加子模块

git submodule add ***.git 目录名

更新子模块

git submodule update --recursive --remote //  -f 还可以强制拉出

删除Submodule

这个稍微复杂点

rm -rf 子模块目录 #删除子模块目录及源码
vi .gitmodules #删除项目目录下.gitmodules文件中子模块相关条目
vi .git/config   #删除配置项中子模块相关条目
rm .git/module/子模块名   # 删除模块下的子模块目录,每个子模块对应一个目录,注意只删除对应的子模块目录即可

#执行完成后,再执行添加子模块命令即可,如果仍然报错,执行如下:
git rm --cached 子模块名称 #完成删除后,提交到仓库即可。

忽略文件权限变更

这个在不同操作系统拷贝项目时候,让git忽略文件权限的变化。

git config core.filemode false

git submodule foreach --recursive git config core.filemode false # 每个子模块都忽略

本地提交git子模块

推荐一个git工具,gitKraken,它可以让你方便的管理子模块的提交。

当然,你也可以进入子模块目录使用命令行,注意检查所在的分支。

默认 git submodule update 并不会将 submodule 切到任何 branch,所以,默认下 submodule 的 HEAD 是处于游离状态的 (detached HEAD state)。所以在修改前,记得一定要用 git checkout master 将当前的 submodule 分支切换到 master,然后才能做修改和提交。

否则你就要使用rebase 或者 cherry-pick了。

最后记得提交父项目,因为子模块的commit信息更新了,这属于父模块的变化。

参考

blog.devtang.com/2013/05/08/…