写组件代码写一半 ,感觉此组件在不同的项目之间的共性太多 ,该组件完全可以单独作为一个repo独立出来,思考了一下决定用Git Subtree来完成这种拆分。具体的拆分过程由于手册上都有讲,别人也写的比我好,我也就没有必要做搬运工了,点这里进入传送门 。
但是该组件所在目录已经存在了,而且我的 PSR-4的命名空间也都写好了 ,现在改也不太方便,怎么弄呢?
也许你会搜索到各种各样的文章 有的会教你clone一个本地单独的repo 然后把原来的目录删掉,再以这个本地repo为桥梁重新保留历史方式进行add subtree ,有的会告诉你直接备份完整的那个目录 删掉以后,再add subtree 然后覆盖回去。我想说这些方法(链接)都是可以达到目的。
subtree的出现使得管理不再和submodule麻烦,但是缺点我才用了几次就发现了:当提交的历史数量太多的时候,subtree遍历提交的速度实在是太慢了,有没有快一点的方法呢?
有:那就是把subtree独立成本地的一个分支 于上游的同步全部在这个分支上做。
所以 整个过程就是这样的:
- 添加一个remote 以 我写的这个为例 https://github.com/ihipop/yii2-components 本地对应的目录是 vendor/ihipop/yii2
1git remote add github-yii2-components git@github.com:ihipop/yii2-components.git - 像往常一样创建一个subtree 如果你已经创建过了,参考上面提到的方法进行分离
123git subtree add -P vendor/ihipop/yii2 github-yii2-components master#解释一下 git subtree add -P 【本地开发目录】 【添加的远程仓库别名】 【远程分支】#下面不再解释了 - 正常拉取 开发那个子项目
123git subtree pull -P vendor/ihipop/yii2 github-yii2-components master#该修改修改 该提交提交 不要在乎subtree的存在#.... - 把subtree推送到远程分支 你有两个选项
A. 直接使用subtree的push选项
1git subtree push-P vendor/ihipop/yii2 github-yii2-components master
然后此命令会从头遍历你的主项目的提交 从里面筛选出包含vendor/ihipop/yii2 路径的 形成新的提交 然后推送到远程分支
可想而知 这个过程是比较慢的。
B.通过创建专门的本地分支存储这个subtree
1git subtree split -P vendor/ihipop/yii2 -b subtree/yii2-components
第一次也是很慢的 稍等一会
一个新分支subtree/yii2-components就创建了,
然后我们设置这个分支的直接跟踪远程分支
1git branch -u github-yii2-components/master subtree/yii2-components
表示这subtree/yii2-components分支直接跟踪了远程的master分支
且包含了项目主分支的vendor/ihipop/yii2这个代表的子目录所在subtree的完整历史
然后直接把这个分支直接推送到远程即可
12git push github-yii2-components subtree/yii2-components:master#解释:git push 【添加的远程仓库别名】 【本地split出来的subtree分支】【远程分支】 - 你还在主项目上该干嘛干嘛 该提交提交 后面需要同步的时候 可以直接通过本地分支来同步 也可以直接拉取
修改的东西同步到上游之前 都通过subtree的split推到本地仓库(如果为了提高速度还可以使用--rejoin) 然后就没有然后了