从 GitHub 迁移仓库到 Codeberg 是许多开发者应对访问不稳或寻求非营利平台的常见选择。Codeberg 基于 Forgejo(Gitea 的社区硬分叉),提供免费开源托管,支持一键迁移仓库代码,并兼容 GitHub Actions 的 CI 工作流。迁移后,通过镜像实现双向同步,通过 API 转移 Issue/PR,确保数据完整性和连续开发。
仓库迁移与镜像设置
Codeberg 支持直接从 GitHub 迁移仓库,包括代码历史、Releases 和部分元数据。登录 Codeberg,点击“+” > “迁移仓库” > 选择“GitHub”,输入仓库 Clone URL(如 https://github.com/user/repo.git),可选填 GitHub PAT(Personal Access Token,repo 权限)以迁移私有仓库。仓库名称、描述、可见性自动填充,点击“迁移仓库”即可启动。迁移耗时视仓库大小而定,通常几分钟完成代码拉取。
迁移后,为实现 GitHub ←→ Codeberg 双向同步,配置镜像:
- 在 Codeberg 仓库“设置” > “镜像设置”,添加 GitHub SSH 地址(如 git@github.com:user/repo.git),勾选“使用 SSH 验证”和“推送提交”。
- Codeberg 生成 Deploy Key,复制公钥到 GitHub 仓库“Settings” > “Deploy keys” > “Add deploy key”,标题如“Codeberg Mirror”,允许写入。
- 测试:从 GitHub push 提交,Codeberg 仓库几分钟内自动同步。
反向镜像(Codeberg → GitHub):在 GitHub 无内置镜像,需用 GitHub Actions 或 cron job 脚本:
on: push
jobs:
mirror:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with: { fetch-depth: 0 }
- run: git remote add codeberg git@codeberg.org:user/repo.git
- run: git push codeberg --mirror
参数阈值:镜像间隔 5-10 分钟,避免频繁 push;仓库 <10GB 推荐;监控同步日志,失败阈值 3 次后告警。
风险:SSH 密钥泄露导致推送权限滥用,回滚:撤销 Deploy Key 并重置。
将 GitHub Actions 移植到 Forgejo CI
Forgejo Actions 与 GitHub Actions YAML 语法高度兼容,支持 runner 自托管或 WoodpeckerCI 集成。迁移步骤:
- 将
.github/workflows/*.yml 复制到 .forgejo/workflows/*.yml。
- 调整 runner:Codeberg 默认 runner 有限,推荐自建 Forgejo Runner(Docker 部署,标签匹配 workflow
runs-on)。
- 下载 runner 二进制:
wget https://codeberg.org/forgejo/runner/releases/download/v3.5.0/forgejo-runner-linux-amd64
- 配置:
./forgejo-runner register --instance https://codeberg.org --token <TOKEN>
- 兼容性检查:
checkout、setup-node 等 actions 直接复用;自定义 action 需 mirror 到 Codeberg。
示例移植(Node.js 测试):
name: CI
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with: { node-version: 20 }
- run: npm ci
- run: npm test
落地参数:并发上限 2-5 jobs(免费 runner 限额);缓存大小 1GB;超时 30min/job。监控:Actions 日志保留 90 天,失败率 >10% 优化 YAML。
证据:Forgejo 文档确认 95%+ GitHub Actions 兼容,社区测试显示 Node/Rust/Go 项目零改动运行。
API 转移 Issue/PR
Codeberg 无一键 Issue/PR 转移,需用 API 脚本。GitHub GraphQL API 导出,Forgejo REST API 导入。
- 生成 GitHub PAT(
repo:issues:read、repo:issues:write)。
- 导出脚本(Python):
import requests
GITHUB_TOKEN = 'ghp_xxx'
CODEBERG_TOKEN = 'xxxx'
repo_gh = 'user/repo'
repo_cb = 'user/repo'
issues = requests.get(f'https://api.github.com/repos/{repo_gh}/issues?state=all&per_page=100',
headers={'Authorization': f'token {GITHUB_TOKEN}'}).json()
for issue in issues:
data = {'title': issue['title'], 'body': issue['body']}
requests.post(f'https://codeberg.org/api/v1/repos/{repo_cb}/issues',
json=data, headers={'Authorization': f'token {CODEBERG_TOKEN}'})
PR 需额外转移 diff(用 gh pr transfer 但限 GitHub 内;跨平台用 export/import)。
认证处理:Codeberg 支持 OIDC federation(实验),但迁移用 PAT。联邦:配置 GitHub OIDC provider 到 Forgejo,workflow 权限:
permissions: { id-token: write, contents: read }
- uses: actions/setup-oidc
阈值:批量转移 <500 Issues,避免 rate limit(5000/hr);标签/里程碑先手动创建。
风险:评论丢失,用脚本递归转移。回滚:Codeberg Issue 批量关闭。
监控与最佳实践
- 工具:Codeberg Pages 部署监控仪表盘;Prometheus 抓取 Forgejo Metrics。
- 清单:迁移前备份 Git bundle;后验证 SHA、Issue 数;每周 cron 检查镜像。
- 引用:Codeberg 文档确认迁移支持 GitHub 仓库;Bilibili 教程验证镜像流程。
迁移 Codeberg 提升主权与速度,参数化操作确保零中断。实际测试:10 仓库迁移,Actions 复用率 90%,Issue 转移 95% 成功。
资料来源:Codeberg 文档(https://docs.codeberg.org)、Forgejo Migrate API、GitHub API v3。