目标

现在,我们的代码 src 目录下有 app_sharedshared 和其它文件。

  • shared 存放了所有项目都可以通用的库,不依赖具体业务、项目。相当于 public
  • app_shared 存放了此项目所属的大项目的组分间通用的库,例如业务相关的模型定义等。 相当于 internal
  • 其它:此项目专属的代码,私有。相当于 private

我们打算把 sharedapp_shared 放到单独的 subtree. 下面仅以 shared 为例。

实施

腾笼换鸟

首先需要关闭相关的 IDE 窗口。将 shared 复制到临时目录。

然后直接删除原有的 shared ,并提交此次删除。

创建共享代码库 Repo

到 Git 上创建一个普普通通的仓库。把 shared/* 提交进去。(不包含 shared

添加子仓库

$ git remote add -f shared https://<git_repo>
$ git remote
app_shared
origin
shared
git branch -r
error: cannot spawn less: No such file or directory
  app_shared/main
  origin/HEAD -> origin/main
  origin/main
  shared/main

获取子仓库数据

$ git fetch shared

添加 subtree

$ git subtree add --prefix src/shared shared main --squash 
git fetch shared main
From xxx
 * branch            main       -> FETCH_HEAD
Added dir 'src/shared'
  • --prefix src/shared:子树在本项目的相对路径
  • shared:子仓库名
  • main :子仓库的分支
  • --squash:将改动合并为一次提交

一波操作之后,我们的两个目录都回来了:

image-20211008164638784

只不过这样之后,这两个目录可以在项目之间同步。大功告成。

子树的推送

git subtree push -P PREFIX REPO BRANCH

总结

子树的使用十分方便。新项目开坑之后,只要直接添加远端、添加子树就行。

注意

如果你修改了 subtree,则只进行 git push 的话,只会变更副本。应当通过特定命令才能 push 到 subtree 所在 repo:

$ git subtree -P src/shared push shared main