git subtree是什么
git subtree 可以实现一个仓库作为其他仓库的子仓库。
subtree的核心思想与能做的就只有同步项目文件。
- 假如有P1 、P2两个项目,两个项目存在共用的代码,将共用的代码独立为新的git仓库——share项目;
- 当你对P1/P2项目操作git clone或者git pull的时候,你拉取到的是整个P1/P2项目,包括share在内,share对于父级的主项目来说相当于是个普通目录;
- 当你在P1/P2项目修改了share里的内容后执行git push,修改的share文件将像其他普通文件那样push到P1。
*[注]:
git subtree 命令中,都会用到一个参数 --prefix=<prefix>
,可以简写成 -P <prefix>
git subtree 命令中,--squash
参数含义是:把 subtree 的改动合并成一次commit,这样就不用拉取子项目完整的历史记录。
场景一:当前项目下,把其他已有项目添加为子树(通用场景)
- git subtree add 添加项目作为子树
命令:git subtree add -P <子树名> <子仓库地址> <分支> --squash
执行以上命令后,当前项目下就会新创建一个名为 <子树名> 的目录。
*[注]: 可以提前执行git remote add <子仓库名> <子仓库地址>
该命令,添加了子项目的远程仓库地址(建议使用,后续针对子项目的操作直接写子仓库名即可,不用再写子仓库地址);
然后再执行git subtree add -P <子树名> <子仓库名> <分支> --squash
达到同样的效果。 - git subtree pull 从子仓库拉取子树更新
命令:git subtree pull -P <子树名> <子仓库名> <分支> --squash
- git subtree push 推送子树更新到子仓库
命令:git subtree push -P <子树名> <子仓库名> <分支>
*[注]:当前项目的pull和push不会更新子仓库,更新子仓库需要git subtree pull
或者git subtree push
场景二:把项目里的某个目录,分割出去作为子树维护
场景假设:现在在开发 Shop 项目有一段时间了,发现里面的 order 模块非常通用,着手使用 git subtree 把 order 作为一个子项目单独维护。
命令过程:
git remote add order-repo https://github.com/xxx/order.git //1
git subtree push -P order order-repo master //2
流程说明:
1,添加 order 子项目的远程仓库地址
2,order 模块作为 order 子树 push 到远程仓库
场景三:在现有项目里,新建了一个子模块(子目录),准备当作子树维护
场景假设:现在在开发 Shop 项目,刚新建了个 order 模块(还未提交到git),准备把这个 order 模块当作一个子项目维护。
命令过程:
cd Shop/order //1
git init //1
git add . //1
git commit -m "add order ..." //1
git remote add order-repo https://github.com/xxx/order.git //1
git push -u order-repo master
cd ../ //2
rm -rf order //2
git remote add order-repo https://github.com/xxx/order.git //3
git subtree add -P order order-repo master --squash //3
流程说明:
1, 进入 order 模块创建仓库、提交、添加远程仓库地址、push
2, 删除 order 模块
3, 添加 order 子项目远程仓库地址,git subtree add 添加 order 子项目作为子树