git subtree
什么是git subtree呢
先看结论
经由 Git Subtree 来维护的子项目代码,对于父项目来说是透明的,所有的开发人员看到的就是一个普通的目录,原来怎么做现在依旧那么做,只需要维护这个 Subtree 的人在合适的时候去做同步代码的操作。
功能说明
主要是处理多个项目共同依赖一个公共的项目,并且公共项目也在快速迭代的场景
举个栗子:A项目需要在给某个子项目W里添加一个文件,
最方便的方式自然是直接在A项目里改W子项目对应的目录里的代码,
然后测试通过后,把这个更改提交到W子项目的 Git仓库里。
如果这时候还要先单独更新W子项目的代码然后提交到 Git 服务器,
再在A项目里把W子项目的代码更新过来,显然是很麻烦的,
更麻烦的是如果发现代码有bug,还得再走一遍这个流程。
之前我们的imiaoj-sdk工程,好像就是这么干的~
初始化
假设有P1,P2两个独立的工程,他们共同依赖一个公共的工程C
在P1项目目录,执行
这样的命令,把S项目(我们姑且叫他S项目)的代码下载到–prefix所指定的目录——我们姑且叫他S目录吧,
并在P1项目里自动产生一个commit(就是把S目录的内容提交到P1项目里)。
写代码
大家在P1项目里各种提交commit,其中有些commit会涉及到S目录的更改,
正如前面提到的,这是没任何关系的,大家也不会感受到有任何不一样。
提交更改到子项目的Git服务器
关键的地方来了:
当维护这个S项目 Subtree 的人希望把最近这段时间对S目录的更改提交到S项目的 Git 服务器上时,他执行一段类似于这样的命令:
这里要特别注意,子项目会和父项目共享commit信息
当一个commit同时对P和S都进行了修改时,这个commit会被拆分
共享
在P2项目中,也想使用S子项目的更新,只需要执行:
tips
可以添加子项目S的remote地址,这样在推拉时就不需要键入地址了
分离
subtree还可以将项目中已有的文件夹抽离出来成独立的git 项目
这样会在当前项目增加一个新的分支hotfix
新的分支只会有app,以及之前被忽略的文件/文件夹
并拥有该文件夹相关的提交记录
将分支推送到远程仓库