返回

GitHub Fork 不能私有化?教你自动同步上游分支!

开发配置

在 GitHub 上,我们常常会遇到这样的问题:Fork 一个开源项目,然后对其进行修改和私有化。然而,GitHub 并不支持将 Fork 私有化,这意味着我们无法直接在 Fork 仓库上进行一些操作。为了绕过这个限制,我们可以使用 Import 的方式来创建一个新的仓库,但这样又无法直接同步上游分支的更新。为了解决这个问题,可以使用 GitHub Actions 自动化同步上游分支。本文将详细介绍如何实现这一功能,并更新到最新的 actions/checkout v4.17 版本。

1. 初始化项目

首先,我们需要一个目标仓库(非 Fork 仓库),假设它是从上游仓库导入的。

2. 创建 GitHub Actions Workflow

在目标仓库中,创建一个 GitHub Actions Workflow 文件来自动同步上游分支。下面是一个示例 Workflow 文件:

name: Merge upstream branches

permissions:
  contents: write

on:
  push:
  schedule:
    - cron: '0 18 * * *' # 每天执行一次
  watch:
    types: [started]

jobs:
  merge:
    runs-on: ubuntu-latest
    if: github.event.repository.owner.id == github.event.sender.id
    steps:
      - uses: actions/checkout@v4
      - name: Merge upstream
        run: |
          git pull --unshallow
          git remote add upstream https://github.com/ChatGPTNextWeb/ChatGPT-Next-Web.git
          git fetch upstream
          git checkout main
          git merge --no-edit upstream/main
          git push origin main
          git fetch upstream --tags
          git push --tags

权限设置

确保在 Workflow 文件中正确设置 GITHUB_TOKEN 的权限。这里我们需要写入内容权限:

permissions:
  contents: write

使用最新的 actions/checkout v4.17

为了确保我们使用的是最新版本的 actions/checkout,需要将其更新到 v4.17:

- uses: actions/checkout@v4

actions/checkout 常用配置选项

actions/checkout 是 GitHub 提供的一个官方 Action,用于将仓库代码检出到 runner 中。以下是一些常用的配置选项:

steps:
  - name: Checkout
    uses: actions/checkout@v4
    with:
      repository: ''         # 仓库名,默认是当前仓库
      ref: ''                # 检出的分支、tag 或 commit ID,默认是当前仓库的默认分支
      token: ''              # GitHub Token,默认是 ${{ github.token }}
      ssh-key: ''            # 使用 SSH 私钥进行克隆
      persist-credentials: true  # 在后续步骤中使用令牌
      path: ''               # 克隆仓库的路径
      clean: true            # 克隆前清理工作区
      fetch-depth: 1         # 克隆深度,默认是 1
      lfs: false             # 是否下载 LFS 文件,默认是 false
      submodules: false      # 是否递归克隆子模块,默认是 false
      set-safe-directory: true  # 将仓库目录设置为安全目录

例如,如果需要获取完整的提交历史,可以这样配置:

steps:
  - name: Checkout
    uses: actions/checkout@v4
    with:
      fetch-depth: 0 # 获取完整历史

最终效果

通过以上配置,当每天的计划任务执行时,Workflow 将自动拉取上游仓库的更新,并将其合并到目标仓库的 main 分支。这样就实现了在非 Fork 仓库中自动同步上游分支的功能。

结论

通过使用 GitHub Actions 和 actions/checkout,我们可以轻松地在非 Fork 的 GitHub 仓库中同步上游分支。这不仅解决了 GitHub 不支持 Fork 私有化的问题,也确保了我们能够及时获取上游仓库的更新。