这个工具可以将GitHub公开仓库镜像到CNB平台(cnb.cool),支持单个仓库镜像或批量镜像。它不仅可以创建新的镜像仓库,还可以同步现有仓库的最新更改。
-
自动化镜像同步
- 克隆GitHub仓库的完整镜像(包括所有分支和标签)
- 自动创建目标CNB仓库(如果不存在)
- 支持增量同步和全量镜像
- 可处理多个仓库的批量同步
-
智能仓库管理
- 自动维护远程仓库配置
- 处理本地缓存目录的创建/更新
- 支持自定义组织/命名空间
- 自动清理临时目录(可选)
-
错误处理机制
- 分阶段推送策略(先尝试--mirror,失败后分步推送)
- 完善的错误日志记录
- HTTP API调用异常处理
- Python 3.6+
- Git 2.20+
- CNB平台有效访问令牌
git clone https://github.com/mirror-gh/gh2cnb.git
cd gh2cnb
pip install -r requirements.txt
[github]
token = your_github_token # 可选,私有仓库需要
[cnb]
token = your_cnb_token
group = your_organization # CNB目标组织/命名空间
[mirror]
# 仓库映射列表(支持单个或批量)
repositories =
owner/repo1,
owner/repo2 => target_group/repo2_mirror
- 镜像单个仓库
# 使用位置参数(推荐方式)
python github_to_cnb.py owner/repo --config config.ini --cleanup
# 或者使用命名参数
python github_to_cnb.py --github-repo owner/repo --config config.ini --cleanup
- 批量镜像
# 在config.ini的[mirror]段配置多个仓库
python github_to_cnb.py -c config.ini
- 自定义目标仓库
python github_to_cnb.py owner/source-repo -n target_group/target-repo
- 增量更新已存在的仓库
# 如果本地目录和CNB仓库都已存在,将只同步最新更改
python github_to_cnb.py owner/repo
graph TD
A[开始] --> B[读取配置]
B --> C{指定仓库?}
C -->|是| D[镜像单个仓库]
C -->|否| E[批量处理配置]
D --> F[创建/验证CNB仓库]
E --> F
F --> G[克隆/更新GitHub仓库]
G --> H[配置CNB远程]
H --> I[推送所有引用]
I --> J{推送成功?}
J -->|是| K[清理临时目录]
J -->|否| L[分步推送]
L --> M[推送分支]
L --> N[推送标签]
M --> O[结果验证]
N --> O
O --> K
K --> P[完成]
-
权限要求
- CNB令牌需要具有创建仓库和推送代码的权限
- 对GitHub仓库至少需要只读访问权限
-
网络配置
- 确保可以访问GitHub(https://github.com)
- 确保可以访问CNB API(https://api.cnb.cool)
-
最佳实践
- 生产环境建议使用
--cleanup
参数避免存储累积 - 定期运行以保持镜像同步
- 敏感令牌必须在配置文件中设置,不支持命令行参数传递
- 日志中会记录所有执行的命令,便于调试
- 生产环境建议使用
-
异常处理
- 网络中断会自动重试标准Git操作
- API调用失败会立即终止流程
- 推送失败时会保留临时目录供调试
-
性能特征
- 首次镜像:使用
git clone --mirror
全量克隆后推送 - 后续同步:使用
git remote update --prune
增量更新(仅传输差异) - 推送策略:优先使用
git push --mirror
,失败时尝试--all
和--tags
- 平均处理时间:≈1.5倍原始仓库克隆时间
- 首次镜像:使用
附:完整参数说明
usage: github_to_cnb.py [-h] [-c CONFIG] [-n CNB_REPO] [--cleanup] [github_repo]
positional arguments:
github_repo GitHub仓库 (格式: owner/repo)
options:
-h, --help show this help message and exit
-c CONFIG, --config CONFIG
配置文件路径 (默认: config.ini)
-n CNB_REPO, --cnb-repo CNB_REPO
CNB仓库 (格式: owner/repo)
--cleanup 操作完成后清理克隆的临时目录 (默认: 不清理)
-
所有操作将在当前目录下的子目录中进行,子目录名称为GitHub仓库名称(将斜杠替换为下划线)。
-
如果本地子目录已存在且是有效的git仓库,将只获取最新更改而不重新克隆。
-
默认情况下不会清理克隆的临时目录,可以通过
--cleanup
参数启用清理。