适用场景

多个项目共享一个库,而该库正在快速迭代更新的过程中。

操作

假设有项目 P1、P2,同时共享项目 S 的代码。

添加 remote

在 P1 项目中添加 S 项目的 remote 地址:

git remote add jupyter [email protected]:MrChi/JupyterNotes.git

引用

在 P1 项目中引用 S 项目代码:

git subtree add --prefix=<本地子项目目录> <远程库仓库地址|远程库别名> <分支名> --squash
  • prefix 参数指定存放 S 项目的路径,建议使用相对于 P1 项目根目录的相对路径;
  • squash 参数:默认情况下,P1 项目会合并 S 项目本身所有的提交记录,使用该参数可以合并子项目的提交记录为一条。

操作后,在 P1 项目中会产生一条 commit 记录。

例如:

git subtree add --prefix=jupyternotes jupyter master

更新

在 P1 项目中更新引用的 S 项目的代码:

git subtree pull --prefix=<prefix> <repository> <ref>

提交

在 P1 项目中向 S 项目提交在 P1 中进行的更改:

git subtree push --prefix=<prefix> <repository> <ref>

优势和劣势

优势

对于 P1 项目来说,S 项目的代码是透明的,只是一个普通目录,不需要特殊处理;只需要维护 subtree 的人在合适的时候将代码同步到 S 项目即可。

劣势

subtree 的这种方式只使用分支,无法有效控制版本。如果 S 项目更新了代码但与 P1 项目不兼容,P1 项目更新后就可能会出现问题。

如果追求稳定,可以为 S 项目单独创建一个版本分支,例如“v1.0”,subtree 只使用这个分支即可。

参考链接