前端多项目共享代码Git Subtree

448 阅读3分钟

什么是subtree

Git Subtree是Git版本控制系统中用于管理代码库中的子项目的功能, 如果你想将一个项目的代码集成到多个项目中,并希望处理普通代码一样管理子目录的更新,就可以使用git subtree。

  • 子树允许将一个Git仓库的子目录复制到另一个Git仓库中,并保持两者独立的版本历史。

  • 子树是通过复制子仓库的指定分支,并将其作为父仓库的子目录来实现的。

  • 子树可以用于将一个项目的代码以及相关的提交历史集成到另一个项目中,而不需要将整个子仓库作为子模块引入。

  • 子树的更新可以像其他git提交一样进行,使用git add/git commit/git pull/git push,不需要特殊的命令。

对于父项目来说,子项目只是一个普通的目录,原来对父项目怎么操作就怎么操作,只是在拉取子项目代码时相对于原本的git pull 稍微复杂一点。

对于维护子项目的开发来说,只需要按对应分支正常更新编写代码即可

使用

image-20230720141714807

添加子树

  • 在父项目的目录下执行添加子树代码
git subtree add --prefix=url gitUrl branch
// url : 子项目存放的相对地址
// gitUrl :子项目的git地址
// branch : 需要引入的子项目的对应分支
  • 子项目目录(master分支和dev分支)

image-20230720143346995image-20230720143425525

  • 在项目fa2加入sub-2项目的master分支,在项目fa3加入sub-2项目的dev分支(对应新增sub-2文件夹)
// 在fa2 项目目录下
git subtree add --prefix=sub-2 https://gitee.com/xxxx/sub-2.git master

// 在fa3 项目目录下
git subtree add --prefix=sub-2 https://gitee.com/xxxx/sub-2.git dev

如图:

image-20230720143928575image-20230720150315768

更新子树代码

(需要在父项目中的本地修改commit之后,才可以进行子项目代码的更新)

git subtree pull --prefix=url gitUrl branch
// url : 子项目存放的相对地址
// gitUrl :子项目的git地址
// branch : 需要引入的子项目的对应分支

在子项目中修改新增代码

git add 文件名
git commit -m 'xxx'
git push

在父项目中更新子项目对应目录的代码

(父项目git push 是无法将对应修改的代码同步到子项目中,需要执行一下代码手动同步)

git subtree push --prefix=url gitUrl branch
// url : 子项目存放的相对地址
// gitUrl :子项目的git地址
// branch : 需要引入的子项目的对应分支

父项目修改子项目的代码 执行提交命令后,子项目也能拉取到对应代码

简化指令

可以在package.json文件中自定义npm指令代码,简化提交和拉取子项目代码的命令

{
  "subtree:push": "git subtree push --prefix=src/components/Commonal https://gitee.com/xxx/caron-commonal.git master",
	"subtree:pull": "git subtree pull --prefix=src/components/Commonal https://gitee.com/xxx/caron-commonal.git master"
}

image-20230720160017973

如果不确定更新修改子项目的分支 可以不指定分支名,运行命令的的时候再指定

{
  "subtree:push": "git subtree push --prefix=src/components/Commonal https://gitee.com/xxx/caron-commonal.git",
	"subtree:pull": "git subtree pull --prefix=src/components/Commonal https://gitee.com/xxx/caron-commonal.git"
}
npm run subtree:pull -- master
npm run subtree:push -- dev
// -- name 具体分支名

参考文章:不同项目共用一个模块的解决方案(subtree)