自动从 Gitee 同步到 GitHub
建议将脚本放在独立目录运行,避免与现有仓库冲突。如需同步多个仓库,可复制脚本并修改配置参数。
以下是一个自动从 Gitee 同步到 GitHub 的 Shell 脚本,包含错误处理和配置验证:
#!/bin/bash
set -e # 遇到错误立即终止执行
# ===== 用户配置区 =====
GITEE_REPO="git@gitee.com:yourname/project.git" # 替换为你的Gitee仓库地址
GITHUB_REPO="git@github.com:yourname/project.git" # 替换为你的GitHub仓库地址
LOCAL_DIR="/path/to/local/repo" # 本地仓库存储路径
BRANCH="main" # 要同步的分支名称
# ======================
# 颜色定义(用于终端输出)
RED='\033[31m'
GREEN='\033[32m'
YELLOW='\033[33m'
NC='\033[0m' # 恢复默认
# 创建本地目录(如果不存在)
mkdir -p "$LOCAL_DIR"
# 进入工作目录
cd "$LOCAL_DIR" || { echo -e "${RED}无法进入目录 $LOCAL_DIR${NC}"; exit 1; }
# 初始化/更新本地仓库
if [ ! -d .git ]; then
echo -e "${YELLOW}▶ 初始化新仓库...${NC}"
git init
git remote add gitee "$GITEE_REPO"
git remote add github "$GITHUB_REPO"
git fetch --all
git checkout -b "$BRANCH" gitee/"$BRANCH"
else
echo -e "${YELLOW}▶ 检查远程配置...${NC}"
# 动态更新远程仓库地址
git remote set-url gitee "$GITEE_REPO" 2>/dev/null || git remote add gitee "$GITEE_REPO"
git remote set-url github "$GITHUB_REPO" 2>/dev/null || git remote add github "$GITHUB_REPO"
fi
# 同步操作
echo -e "${YELLOW}▶ 从Gitee拉取更新...${NC}"
if ! git pull gitee "$BRANCH"; then
echo -e "${RED}✗ 拉取Gitee更新失败,请检查网络或仓库权限${NC}"
exit 1
fi
echo -e "${YELLOW}▶ 推送至GitHub...${NC}"
if git push github "$BRANCH"; then
echo -e "${GREEN}✓ 同步成功!${NC}"
echo -e "Gitee → ${GITEE_REPO}\nGitHub → ${GITHUB_REPO}"
else
echo -e "${RED}✗ 推送GitHub失败,请检查以下可能:\n1. SSH密钥配置\n2. 仓库写入权限\n3. 网络连接${NC}"
exit 1
fi
# 可选:清理过期分支
git remote prune gitee
git remote prune github
使用说明
-
配置准备
chmod +x sync_repo.sh # 添加执行权限
-
首次运行
./sync_repo.sh
-
定时同步(Crontab示例)
# 每天凌晨3点自动同步 0 3 * * * /path/to/sync_repo.sh >> /var/log/repo_sync.log 2>&1
功能特性
-
智能仓库初始化
- 自动检测
.git
目录存在与否 - 动态更新远程仓库地址(避免手动修改配置)
- 自动检测
-
双通道容灾
- 同时保留 gitee/github 两个远程连接
- 可通过
git fetch gitee
或git fetch github
单独操作
-
安全机制
- 严格错误检测(网络故障、权限问题等)
- 分支保护(不会覆盖未跟踪的本地修改)
-
日志友好
- 彩色终端输出关键操作状态
- 适合集成到CI/CD流水线
故障排查
-
SSH连接测试
ssh -T git@gitee.com # 应返回欢迎信息 ssh -T git@github.com # 应返回欢迎信息
-
手动运行调试
GIT_TRACE=1 GIT_SSH_COMMAND="ssh -v" ./sync_repo.sh
-
查看远程配置
git remote -v git branch -vv