一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第1天,点击查看活动详情。
背景
在做不同的项目,但是又都会使用到一些常用的方法组件代码块等等。 作为一个追求优雅的开发人员,肯定不能接受一段代码到处复制粘贴的操作。而且一旦这段代码日后需要更新,到处粘贴的话就需要全局搜索然后含泪修改了。 那么有没有一种办法,能够作为一些公共代码的“栖息地”,可以做到一处编写,到处使用呢?
答案是有的,使用git内置功能submodule即可。
什么是submodule?
有种情况我们经常会遇到:某个工作中的项目需要包含并使用另一个项目。 也许是第三方库,或者你独立开发的,用于多个父项目的库。 现在问题来了:你想要把它们当做两个独立的项目,同时又想在一个项目中使用另一个。 Git 通过子模块来解决这个问题。 子模块允许你将一个 Git 仓库作为另一个 Git 仓库的子目录。 它能让你将另一个仓库克隆到自己的项目中,同时还保持提交的独立。
子模块的更新/添加
更新下载
git submodule update --init --recursive下载子模块
git submodule foreach git pull origin master方法1:更新子模块
cd sub_folder && git pull origin master方法2:更新子模块(sub_folder:子模块所在文件夹)
添加
git submodule add <url> <path>添加子模块
其中,url为子模块的路径,path为该子模块存储的目录路径。
执行成功后,git status会看到项目中修改了.gitmodules,并增加了一个新文件(为刚刚添加的路径)
子模块的删除/提交
删除
有时子模块的项目维护地址发生了变化,或者需要替换子模块,就需要删除原有的子模块。
删除子模块较复杂,步骤如下:
rm -rf 子模块目录删除子模块目录及源码vi .gitmodules删除项目目录下.gitmodules文件中子模块相关条目vi .git/config删除配置项中子模块相关条目rm .git/module/*删除模块下的子模块目录,每个子模块对应一个目录,注意只删除对应的子模块目录即可
执行完成后,再执行添加子模块命令即可,如果仍然报错,执行如下:
git rm --cached .gitmodules
git rm --cached 子模块名称
完成删除后,提交到仓库即可。
提交
cd sub_folder && git add . && git commit -m ' ' && git push origin HEAD:refs/for/master子模块的提交(sub_folder:子模块所在文件夹)
克隆有submodule的项目
如果要clone一个附带submodule的项目,submodule的文件
不会自动随父项目clone出来(其实只会clone出 .gitsubmodle 这个描述文件),
还需要执行如下命令取出submodule里的文件:
# 用来初始化本地配置文件
git submodule init
# 从该项目中抓取所有数据并检出父项目中列出的合适的提交(指定的提交)。
git submodule update
(以上两条命令也可以合并成一条组合命令:git submodule update --init --recursive)
------------------更好的方式---------------------
# clone 父仓库的时候加上 --recursive,会自动初始化并更新仓库中的每一个子模块
git clone --recursive https://gitee.com/xiaomumaozi/SubModule_Test.git
结束语
如果你觉得该文章不错,不妨点个赞吧。
参考链接
blog.csdn.net/guotianqing…
segmentfault.com/a/119000002…
git-scm.com/book/zh/v2/…