我在博客系统使用了gatsby-theme-andy和gatsby-theme-brain两个插件。使用的过程中碰到了一些问题,但是这两个插件的作者都不再积极维护了。于是我将这两个插件clone下来,删掉了其中的.git文件,并将博客的项目结构转换成yarn workspace

  • 目录结构
.
├── gatsby-theme-andy   # 本地维护的插件fork
├── gatsby-theme-brain  # 本地维护的插件fork
├── site                # 真实的博客内容
├── package.json
└── yarn.lock
  • package.json
{
  "private": true,
  "workspaces": [
    "gatsby-theme-andy",
    "gatsby-theme-brain",
    "site"
  ]
}

这样子我可以根据我的需要对依赖的插件进行修改。但问题是我丢失了单一插件的版本记录,所有的提交都由一个git repo来维护。使用git submodule可以将提交解耦。以下步骤记录了我从本地fork切换到git submodule的操作。

  1. 删除本的插件并提交
rm -fr gatsby-theme-*
git add .
git commit -m 'chore: remove local plugins'
  1. 将依赖的插件引入为git submodules
git submodule add https://github.com/flappyBug/gatsby-theme-brain
git submodule add https://github.com/flappyBug/gatsby-theme-andy
git commit -m 'chore: add workspace deps as git submodule'
  1. submodule进行更改 在引入submodules后,就能方便地对submodule指向的repo进行更改。假如我对submodule内的gatsby-theme-brain进行了更改,我需要进行以下操作更新远端的主repo和gatsby-theme-brain的repo:
# 1. 创建submodule的本地提交
cd gatsby-theme-brain
git commit -am 'feat: awesome feature'
# 2. 将submodule的更新推送到远端
git push 
# 3. 创建主repo的提交
cd ..
git commit -am 'feat: update submodule ref'
# 4. 提交主repo
git push