Git SubTree 使用

5,218 阅读2分钟

场景介绍

协同开发模式,组件库与业务项目同时开发,常规做法

  • npm
  • subModule
  • subTree

subModuelesubTree 探索,这里对比下两者,两者都是将组件库作为业务项目的一部分进行协同开发,区别如下

一、subModule 方式

1. 安装

使用 submodule 的方式安装, 父仓库中使用命令添加子仓库(SubModule)

git submodule add http://xxx.git src/SubModule

添加成功后,在项目src目录中能够看到新增的文件夹SubModule。 另外新增了文件.gitmodules,在里面增加了对SubModule的一些描述。

2. 更新

在父仓库目录下git pull之后,立即执行

git submodule update --remote

3. 删除SubModule

  • 删除.gitmodules
  • 删除.git/config 相关配置
  • 删除.git/modules
  • 删除子仓库目录(src/SubModule)
执行命令
git rm --cached <本地路径>
// eg:
git rm --cached src/SubModule

4. 缺点

无法控制 SubModule 经常会有场景问题

不想用户更改 SubModule 比较难以实现

二、subTree 方式

1. 简化远程子仓库地址

这里把子仓库的地址作为一个远程仓库地址,设置别名 sub ( 名称随意)

git remote add -f sub http://git.xxx.git

2. 添加 subtree

仅在新建项目或者首次添加 subtree 时,添加一次即可

git subtree add --prefix=src/subTree sub master 

3. 从源仓库拉取更新 subtree

如果 组件 仓库更新了,可以从源仓库拉取更新,使用 git subtree pull

git subtree pull --prefix=subtrees/subtreeA http://xxxxxxxx/subtree-project.git master
// eg
git subtree pull --prefix=src/subTree sub master 

4. 推送修改到源仓库

当前需要贡献组件给 subtree

如果在父仓库里修改了sub(源仓库)代码,使用 git subtree push命令。 为防止本地冲突,建议push前先执行源仓库pull命令,拉取最新的代码:

git subtree pull --prefix=src/subTree sub master --squash
git subtree push --prefix=src/subTree sub master

5. 父仓库删除 subtree

  • 手动删除父仓库 src/subTree 文件夹
  • commit 提交到父仓库

6. 报错处理

Working tree has modifications. Cannot add.

解决办法:

  • 检查本地修改是否都提交,如有,则需要先提交本地业务项目的修改;
  • 尝试切换到本地其他分支,再切换回来