logo NodeSeekbeta

【NodeScriptKit】GitHub 仓库批量备份到自建 Gitea 脚本

之前写的一套脚本,解决我个人的 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

你好啊,陌生人!

我的朋友,看起来你是新来的,如果想参与到讨论中,点击下面的按钮!

📈用户数目📈

目前论坛共有72034位seeker

🎉欢迎新用户🎉