之前写的一套脚本,解决我个人的 github 仓库备份问题,看到 ns 做活动就来参加一下。
这是一个自动将 GitHub 仓库镜像到 Gitea 的 Shell 脚本。支持批量同步所有仓库,可以设置跳过特定仓库,并具有良好的错误处理机制。
由于 GitHub 仓库较多,因为各种原因担心数据风险和访问困难。代码托管在自建 gitea 虽然访问快,但是脱离了生态很难跟其他的 PaaS 平台对接。
于是就编写了一套脚本,这套脚本从 Github api 获取 repo 清单,逐个 mirror 后推送到 gitea,最后收集同步报告发送邮件/飞书通知。结合 crontab 可实现自动化的 git repo 同步备份。
自用稳定运行了半年了,分享给大家。
使用方法在仓库中有详细介绍。
截图
邮件效果:

运行效果:

功能特性
- 自动同步 GitHub 所有仓库到 Gitea
- 支持设置跳过特定仓库
- 分级推送策略(先尝试 mirror,失败后逐个推送分支)
- 详细的进度显示和错误提示
- 支持通过环境变量配置
- 适合配合 crontab 使用
- 支持运行后收集报告并发送邮件
必要条件
- Git
- curl
- jq
- GitHub Token(如需访问私有仓库)
- Gitea Token
基本用法
环境变量
| 变量名 | 必需 | 说明 | 示例 |
|---|---|---|---|
| GITHUB_USER | 是 | GitHub 用户名 | songtianlun |
| GITHUB_TOKEN | 否 | GitHub 访问令牌 | ghp_xxxxxxxxxxxx |
| GITEA_URL | 是 | Gitea 实例地址 | https://git.example.com |
| GITEA_USER | 是 | Gitea 用户名 | username |
| GITEA_TOKEN | 是 | Gitea 访问令牌 | d4209xxxxxxxxxxxxx |
| SKIP_REPOS | 否 | 跳过的仓库列表(逗号分隔) | repo1,repo2,repo3 |
| WORK_DIR | 否 | 临时工作目录 | /tmp/git-mirror |
| ENABLE_MAIL | 否 | 是否启用邮件通知 | true 或 false |
| SMTP_SERVER | 否 | SMTP 服务器地址 | smtp.gmail.com |
| SMTP_PORT | 否 | SMTP 端口 | 587 |
| SMTP_USER | 否 | SMTP 用户名 | [email protected] |
| SMTP_PASS | 否 | SMTP 密码 | your-password |
| MAIL_TO | 否 | 接收通知的邮箱 | [email protected] |
| MAIL_FROM | 否 | 发件人地址 | [email protected] |
日志文件
脚本会自动创建日志文件,包含完整的运行记录:
- 默认日志目录:
/tmp/github-mirror-logs - 日志文件名格式:
mirror-YYYYMMDD-HHMMSS.log - 每次运行创建新的日志文件
运行方法
直接运行
GITHUB_USER=username \
GITHUB_TOKEN=your-github-token \
GITEA_URL=https://git.example.com \
GITEA_USER=username \
GITEA_TOKEN=your-gitea-token \
bash main.sh
配置环境变量后运行
# 设置环境变量
export GITHUB_USER=username
export GITHUB_TOKEN=your-github-token
export GITEA_URL=https://git.example.com
export GITEA_USER=username
export GITEA_TOKEN=your-gitea-token
# 运行脚本
bash main.sh
设置定时任务
编辑 crontab:
crontab -e
添加定时任务(每天凌晨 2 点运行):
0 2 * * * GITHUB_USER=username GITHUB_TOKEN=xxx GITEA_URL=https://git.example.com GITEA_USER=username GITEA_TOKEN=xxx /path/to/main.sh >> /path/to/main.log 2>&1
跳过特定仓库
GITHUB_USER=username \
GITEA_URL=https://git.example.com \
GITEA_USER=username \
GITEA_TOKEN=xxx \
SKIP_REPOS="repo1,repo2,repo3" \
bash main.sh
更详细的用法见REAEME
@福尔摩斯 这样符合要求不
我的操作和你相反,将gitea仓库备份到github私有仓库, 利用gitea mirror push功能。起个系统级webhook发现创建repo的创建就自动创建mirror😂
@songshi #2 哈哈哈,这个操作很棒。
可以看看我整的无成本稳定备份方案
https://blog.52013120.xyz/post/51.html
@爱折腾的sky #4 赞,利用 github action,这样连服务器都不用了
求大佬们投一票呀,六号,非常感谢