说一说 Git Subtree

写组件代码写一半 ,感觉此组件在不同的项目之间的共性太多 ,该组件完全可以单独作为一个repo独立出来,思考了一下决定用Git Subtree来完成这种拆分。具体的拆分过程由于手册上都有讲,别人也写的比我好,我也就没有必要做搬运工了,点这里进入传送门 

但是该组件所在目录已经存在了,而且我的 PSR-4的命名空间也都写好了 ,现在改也不太方便,怎么弄呢?

也许你会搜索到各种各样的文章 有的会教你clone一个本地单独的repo 然后把原来的目录删掉,再以这个本地repo为桥梁重新保留历史方式进行add subtree ,有的会告诉你直接备份完整的那个目录 删掉以后,再add subtree 然后覆盖回去。我想说这些方法(链接)都是可以达到目的。

subtree的出现使得管理不再和submodule麻烦,但是缺点我才用了几次就发现了:当提交的历史数量太多的时候,subtree遍历提交的速度实在是太慢了,有没有快一点的方法呢?

有:那就是把subtree独立成本地的一个分支 于上游的同步全部在这个分支上做。

所以 整个过程就是这样的:

  1. 添加一个remote 以 我写的这个为例 https://github.com/ihipop/yii2-components 本地对应的目录是 vendor/ihipop/yii2
  2. 像往常一样创建一个subtree 如果你已经创建过了,参考上面提到的方法进行分离
  3. 正常拉取 开发那个子项目
  4. 把subtree推送到远程分支 你有两个选项
    A. 直接使用subtree的push选项

    然后此命令会从头遍历你的主项目的提交 从里面筛选出包含vendor/ihipop/yii2 路径的 形成新的提交 然后推送到远程分支
    可想而知 这个过程是比较慢的。
    B.通过创建专门的本地分支存储这个subtree

    第一次也是很慢的 稍等一会
    一个新分支subtree/yii2-components就创建了,
    然后我们设置这个分支的直接跟踪远程分支

    表示这subtree/yii2-components分支直接跟踪了远程的master分支
    且包含了项目主分支的vendor/ihipop/yii2这个代表的子目录所在subtree的完整历史
    然后直接把这个分支直接推送到远程即可
  5. 你还在主项目上该干嘛干嘛 该提交提交 后面需要同步的时候 可以直接通过本地分支来同步 也可以直接拉取
    修改的东西同步到上游之前 都通过subtree的split推到本地仓库(如果为了提高速度还可以使用--rejoin) 然后就没有然后了

 

Author Info :
  • From:说一说 Git Subtree
  • URL:https://blog.ihipop.com/2017/03/4943.html
  • Please Reserve This Link,Thanks!
  • 发表回复

    您的电子邮箱地址不会被公开。 必填项已用 * 标注