网站首页 > 基础教程 正文
当项目越来越庞大之后,不可避免的要拆分成多个子模块,我们希望各个子模块有独立的版本管理,并且由专门的人去维护
submodule
常用命令
git clone <repository> --recursive 递归的方式克隆整个项目
git submodule add <repository> <path> 添加子模块
git submodule init 初始化子模块
git submodule update 更新子模块
git submodule foreach git pull 拉取所有子模块
git submodule / cat .gitmodules 查看所有子模块
删除子模块
逆初始化模块,其中{MOD_NAME}为模块目录,执行后可发现模块目录被清空
git submodule deinit {MOD_NAME}
# 删除.gitmodules中记录的模块信息(--cached选项清除.git/modules中的缓存)
git rm --cached {MOD_NAME}
# 提交更改到代码库,可观察到'.gitmodules'内容发生变更
git commit -am "Remove a submodule."
删除子模块较复杂,步骤如下:
rm -rf 子模块目录 删除子模块目录及源码
vi .gitmodules 删除项目目录下.gitmodules文件中子模块相关条目
vi .git/config 删除配置项中子模块相关条目
rm .git/module/* 删除模块下的子模块目录,每个子模块对应一个目录,注意只删除对应的子模块目录即可
执行完成后,再执行添加子模块命令即可,如果仍然报错,执行如下:
git rm --cached 子模块名称
完成删除后,提交到仓库即可。
Subtree
Git Subtree 好在哪里
用一句话来描述 Git Subtree 的优势就是:
经由 Git Subtree 来维护的子项目代码,对于父项目来说是透明的,所有的开发人员看到的就是一个普通的目录,原来怎么做现在依旧那么做,只需要维护这个 Subtree 的人在合适的时候去做同步代码的操作。
它是怎么做到的呢?简单说下原理
Git Subtree 的原理
首先,你有两个伟大的项目——我们叫他P1项目、P2项目,还有一个牛逼的要被多个项目共用的项目——我们叫他S项目。我们通过简要讲解使用Subtree来同步代码的过程来解释Subtree的原理
1、初始化子项目Subtree
通过
cd P1项目的路径
git subtree add --prefix=用来放S项目的相对路径 S项目git地址 xxx分支
这样的命令把S项目(我们姑且叫他S项目)的代码下载到--prefix所指定的目录——我们姑且叫他S目录把,并在P1项目里自动产生一个commit(就是把S目录的内容提交到P1项目里)。
对于P2项目也做同样的操作
2、像往常一样更新代码
大家在P1项目里各种提交commit,其中有些commit会涉及到S目录的更改,正如前面提到的,这是没任何关系的,大家也不会感受到有任何不一样。
3、提交更改到子项目的Git服务器
关键的地方来了:当维护这个S项目 Subtree 的人希望把最近这段时间对S目录的更改提交到S项目的 Git 服务器上时,他执行一段类似于这样的命令:
cd P1项目的路径
git subtree push --prefix=S项目的路径 S项目git地址 xxx分支
Git 会遍历所有的commit,从中找出针对S目录的更改,然后把这些更改记录提交到S项目的Git服务器上
4、更新子项目新的代码到父项目
OK,现在S项目有大量的新代码了,P2项目也想使用这些新代码,维护P2这个Subtree的人只要执行:
git subtree pull --prefix=S项目的路径 S项目git地址 xxx分支
这样就可以将P2项目里S项目目录里的内容更新为S项目xxx分支的最新代码了。
Git Subtree 简明使用手册
假设,你要在各个项目里的_components/zenjs_这个目录对
http://github.com/youzan/zenjs.git 这个项目做Subtree
1.首先必须确保各个项目已经添加zenjs 这个 remote(关于remote是什么可以看这里):
git remote add zenjs http://github.com/youzan/zenjs.git
2.将zenjs添加到各个项目里
git subtree add --prefix=components/zenjs zenjs master
3.各项目更新zenjs代码的方法:
git subtree pull --prefix=components/zenjs zenjs master
4.各项目提交zenjs代码的方法:
git subtree push --prefix=components/zenjs zenjs hotfix/zenjs_xxxx
这会在远程的zenjs的仓库里生成一个叫 hotfix/zenjs_xxxx 的的分支,包含了你过去对components/zenjs 所有的更改记录
5.把hotfix/zenjs_xxx分支更新并合并到master并提交
这样其他工程就可以更新到你提交的代码了。
有人可能会问,只用master分支,不管版本,太有风险了。
对的,正如我们前面说到的那样,subtree的方案适用的场景是:各个项目共用一个库,而这个库正在快速迭代更新的过程中。如果追求稳定,只需要给库拉出一个如v0.1.0这样的版本号命名的稳定分支,subtree只用这个分支即可。
我们现在使用的方式就是:A项目经常会对zenjs做更新,所以A项目用subtree来双向同步;B项目只是使用,所以用bower用来按版本来更新代码。
高阶功能
重新split出一个新起点(这样,每次提交subtree的时候就不会从头遍历一遍了)
git subtree split --rejoin --prefix=components/zenjs --branch new_zenjs
git push zenjs new_zenjs:master
- 上一篇: Git 分支管理策略汇总
- 下一篇: git用法普及之git clone
猜你喜欢
- 2025-04-23 Git是什么?这6个基础概念你需要了解
- 2025-04-23 git merge和git rebase有什么区别?
- 2025-04-23 git用法普及之git clone
- 2025-04-23 Git 分支管理策略汇总
- 2025-04-23 掌握这 20 个 Git 命令,成为团队协作高手!
- 2025-04-23 Git使用的小技巧
- 2025-04-23 git笔记
- 2025-04-23 `git fetch`、`git clone` 和 `git pull` 的详细对比
- 2024-07-17 听说你还在用 Git 命令解决代码冲突?
- 2024-07-17 git pull/push 命令时每次都需要输入name/password
- 04-23【docker系列】打造个人私有网盘zfile
- 04-23Dockerfile最佳实践:构建优雅高效的容器镜像
- 04-23Dockerfile优化有技巧,Docker镜像构建提速10倍!
- 04-23IT工程师都需要掌握的容器技术之Dockerfile
- 04-23Dockerfile简单使用
- 04-23Dockerfile编写规范:打造属于你的容器化世界
- 04-23探秘Dockerfile:编写规范与最佳实践
- 04-23Dockerfile详解
- 最近发表
- 标签列表
-
- 菜鸟教程 (58)
- gitpush (61)
- pythonif (68)
- location.href (57)
- tail-f (57)
- pythonifelse (59)
- deletesql (62)
- c++模板 (62)
- c#event (59)
- linuxgzip (68)
- 字符串连接 (73)
- nginx配置文件详解 (61)
- html标签 (69)
- c++初始化列表 (64)
- exec命令 (59)
- canvasfilltext (58)
- mysqlinnodbmyisam区别 (63)
- arraylistadd (66)
- node教程 (59)
- console.table (62)
- c++time_t (58)
- phpcookie (58)
- mysqldatesub函数 (63)
- window10java环境变量设置 (66)
- c++虚函数和纯虚函数的区别 (66)