该项目提供一个轻量的 Git 仓库同步脚本(update.sh),用于将 GitHub、GitLab 等 Git 托管平台的仓库定期同步至 CNB(https://cnb.cool)平台。
支持自动检测组织、仓库、站点配置及 Git 镜像同步,可在 .cnb.yml 中配置为定时任务。
| 功能 | 说明 |
|---|---|
| ✅ 自动检测组织是否存在 | 无权限时自动跳过 |
| ✅ 自动检测仓库是否存在 | 不存在时尝试创建,存在则跳过 |
| ✅ 自动设置源仓库站点链接 | 自动设置仓库的 site 字段指向源仓库地址 |
| ✅ 支持两种推送模式 | mirror(完全镜像)或 safe(仅分支+标签) |
| ✅ 自动执行 Git LFS 同步 | 自动安装并推送 LFS 对象 |
✅ 支持批量同步 (repos.yml) | 一次同步多个仓库 |
| ✅ 可集成 CNB 流水线 | 自动定时执行任务 |
需要在执行环境(容器或流水线)中设置以下环境变量:
export MY_CNB_TOKEN="your_cnb_api_token"
💡 如果未设置
MY_CNB_TOKEN,脚本会自动使用环境变量CNB_TOKEN。 即使该 Token 没有创建组织或仓库的权限,也可正常执行同步(会自动跳过创建步骤)。
chmod +x update.sh
# 同步 GitHub 仓库到 CNB 仓库
./update.sh --github-repo user/repo --cnb-repo-path group/sub/repo --push-mode mirror
# 或使用自定义 Git URL(如 GitLab)
./update.sh --git-url https://gitlab.com/org/repo.git --cnb-repo-path group/sub/repo --push-mode mirror
参数说明:
| 参数 | 说明 | 示例 |
|---|---|---|
--github-repo | GitHub 仓库路径(<user>/<repo>) | user/repo |
--git-url | 完整 Git 仓库地址(可选,优先级高于 --github-repo) | https://gitlab.com/org/repo.git |
--cnb-repo-path | CNB 完整仓库路径(<group>/<subgroup>/<repo>) | group/sub/repo |
--push-mode | 推送模式(默认 mirror) | safe 或 mirror |
在脚本同目录下放置一个 repos.yml 文件,配置仓库映射规则:
repos:
- source: user/repo
cnb_repo_path: group/sub/repo
push_mode: mirror
- source: user/repo
cnb_repo_path: group/sub/repo
push_mode: safe
- source: https://gitlab.com/org/repo.git
cnb_repo_path: group/sub/repo
push_mode: mirror
然后直接运行:
bash update.sh
脚本会自动读取 YAML 配置并同步每个仓库。 如果仓库或组织没有权限创建,会自动检测并跳过,只执行同步部分。
💡
source字段支持两种形式:
- GitHub 短名:
user/repo(自动转换为https://github.com/user/repo.git)- 完整 Git URL:
https://gitlab.com/org/repo.git(支持任意 Git 托管平台)
以下是一个推荐的定时同步配置模板:
.crontab-job: &crontab-job
- docker:
image: docker.cnb.cool/bring/examples/defaultbuildenv:latest
runner:
cpus: 1
stages:
- name: 更新仓库镜像
script: |
chmod +x update.sh
# 默认批量模式(读取 repos.yml)
./update.sh
# 或手动指定单仓库
# ./update.sh --github-repo user/repo --cnb-repo-path group/sub/repo
# 或使用自定义 Git URL
# ./update.sh --git-url https://gitlab.com/org/repo.git --cnb-repo-path group/sub/repo
$:
vscode:
- docker:
image: docker.cnb.cool/bring/examples/defaultbuildenv:latest
services:
- vscode
- docker
main:
# 每小时执行一次
"crontab: 0 * * * *": !reference [.crontab-job]
| 表达式 | 执行频率 | 说明 |
|---|---|---|
"crontab: 0 * * * *" | 每小时 | 推荐配置 |
"crontab: 0 0 * * *" | 每天凌晨执行 | 适合低频同步 |
"crontab: */10 * * * *" | 每 10 分钟 | 调试用 |
执行时会输出详细操作日志,例如:
📚 检测到 repos.yml,进入 YAML 批量同步模式... 🚀 开始同步任务: https://github.com/user/repo → group/sub/repo [mirror] ✅ 组织已存在: group ✅ 仓库已存在,直接更新站点并继续 📥 克隆 CNB 仓库 origin 🔧 添加源远程:source 📥 从源仓库增量 fetch 🚀 Mirror 推送到 CNB ✅ 完成同步
调试方式:
bash -x update.sh
或仅同步单个仓库进行测试:
./update.sh --github-repo user/repo --cnb-repo-path group/sub/repo --push-mode mirror
| 环境变量 | 说明 |
|---|---|
MY_CNB_TOKEN | 自定义 Token(优先) |
CNB_TOKEN | 默认环境 Token(可读写但无创建权限) |
GIT_TERMINAL_PROMPT=0 | 防止 Git 交互提示 |
TZ=Asia/Shanghai | 设置时区(建议) |
git, curl, jq, git-lfs