GitHub Fork 不能私有化?教你自动同步上游分支!
2024-07-15 10:35:15
在 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 私有化的问题,也确保了我们能够及时获取上游仓库的更新。