---
url: /article/xub0j8lj/index.md
---
## 前言

GitHub 上有挺多开源项目，可以一键 Fork 后自部署到 Cloudflare、Vercel 或其他平台，但我们往往需要修改为自己的配置。我希望的是在源文件中写好配置值，然后提交自动部署。当上游项目有更新时，拉取上游合并然后提交自动部署。但 Fork 的项目也必须是公开的，才能在页面上通过点击`Sync Fork`按钮来同步，可我仓库内的配置又不想暴露，所以仓库只能私有，但私有化仓库就必须离开 Fork 网络，也就不能通过点击`Sync Fork`按钮来同步了。那我们就得自己实现同步。

## 实现同步

我们以[LogVar 弹幕](https://github.com/huangxd-/danmu_api)这个项目为例，这是一个非常灵活的弹幕服务，支持在 serverless 服务上部署。

首先 Fork 原仓库(https://github.com/huangxd-/danmu\_api)到自己的仓库(https://github.com/mayeona/danmu\_api)，然后在自己的仓库中设置为私有。

接着将自己的仓库 Clone 到本地，进行如下设置：

```bash
# 创建 prod 分支(用于发布)，main 分支用于同步上游
git branch prod

# 查看当前远程仓库
git remote -v
# 显示
# origin git@github.com:mayeona/danmu_api.git (fetch)
# origin git@github.com:mayeona/danmu_api.git (push)

# 添加上游仓库，设置名称为 upstream
git remote add upstream git@github.com:huangxd-/danmu_api.git

# 查看当前远程仓库
git remote -v
# 显示
# origin git@github.com:mayeona/danmu_api.git (fetch)
# origin git@github.com:mayeona/danmu_api.git (push)
# upstream git@github.com:huangxd-/danmu_api.git (fetch)
# upstream git@github.com:huangxd-/danmu_api.git (push)

# (可选)其实 upstream 我们是没有 push 权限的，为了明显一点，可以将 upstream 的 push 地址设置成一个无效地址
git remote set-url --push upstream DISABLED

# 本地切到 main 分支
git checkout main

# 拉取上游 main 分支的代码
git fetch upstream main

# 将 upstream 的 main 分支覆盖到本地的 main 分支
git reset --hard upstream/main

# (可选)将 main 分支推送到远程仓库
git push -f origin main

# 切换到 prod 分支
git checkout prod

# 合并 main 分支到 prod 分支
# 这一步用可视化操作方便些，vscode 系可以用 Git Graph 插件
git merge main

# 将 prod 分支推送到远程仓库
git push origin prod
```

通常情况下将 prod 分支推送到远程后，就会自动触发 Hook 让 Vercel/Cloudflare 自动构建并发布了，但是这其中可能会存在隐藏问题。

当我们用`Git Graph`合并分支时，会弹出一个提示框，有三个选项：

1. **Create a new commit even if fast-forward is possible**: 产生新的提交，强制生成一个“合并节点”，在 Git 提交历史上会显示分叉，会保留合并分支的所有提交记录。这通常用于新版发布。
2. **Squash Commits**: 产生新的提交，但合并分支的所有提交会被压缩成一个提交，这就会丢失历史提交记录。适用于无关紧要的提交历史，想让提交看起来整洁些的。
3. **No Commit**: 仅合并代码但不提交。适用于合并代码后自己做些修改，之后再手动提交的。这个一般很少会用到。

默认情况下我们可以都不勾选，直接点击`Merge`按钮即可。这就会触发`Fast-forward`合并，不会产生新的提交。但这会完全保留提交记录，包括提交者。可 Vercel 的自动构建很严格，要求提交者的邮箱和 GitHub 默认邮箱必须一致，否则不会构建。除非付费升级为团队协作，将其他人拉进团队，才可以触发自动构建。

如果我们已经通过`Fast-forward`合并了，导致不能自动构建，那么简单点可以创建一个新的空的提交，来触发自动构建。

```bash
git commit --allow-empty -m "trigger vercel deploy"
```

> Tips: 如果是 GitHub 上的邮箱改了，可以修改 Git 全局配置，或者修改项目级的配置。
>
> 全局配置：`git config --global user.email "your-email@example.com"`
>
> 项目级配置：`git config user.email "your-email@example.com"`

如果还没完成`Git Graph`合并，那么可以选择第 1 或 2 项，产生新的提交，提交人就是自己了，可以触发自动构建。
