在日常开发中,很多团队或个人习惯将主要工作仓库托管在 Gitee 上,尤其在国内项目中更为常见。但随着项目规模增大或面向国际协作的需求出现,GitHub 成为全球开发者交流和 CI/CD 集成的重要平台。
为了兼顾国内访问稳定性和全球协作便利性,将 Gitee 仓库完整镜像到 GitHub 成为一种高效方案。通过这种方式,你可以:
保持本地开发和生产环境对 Gitee 的依赖,无需更改日常工作流程;
在 GitHub 上同步完整分支和标签,方便全球协作、备份和开源发布;
通过自动化脚本或 Actions 实现镜像更新,降低手动操作风险,提高效率。
接下来,我将详细介绍从本地配置到镜像推送的完整操作流程。
1. 背景
本方案旨在实现:
本地开发主要在 Gitee 仓库进行;
将指定的 Gitee 仓库完整镜像到 GitHub 仓库;
生产服务器拉取代码仅需从 Gitee 仓库更新(也可以直接摘取镜像的Github仓库),不影响镜像流程。
2. 本地环境配置
2.1 SSH Key 配置
1)为 Gitee 创建 SSH Key(已存在,可复用)。
2)为 GitHub 创建单独 SSH Key:
ssh-keygen -t ed25519 -C "你的邮箱" -f ~/.ssh/id_ed25519_github3)将 GitHub 公钥添加到 GitHub 账户:
cat ~/.ssh/id_ed25519_github.pubGitHub → Settings → SSH and GPG keys → New SSH Key → 粘贴内容。
4)配置 ~/.ssh/config 区分 Gitee 和 GitHub:
# Gitee
Host gitee.com
HostName gitee.com
User git
IdentityFile ~/.ssh/id_ed25519
IdentitiesOnly yes
# GitHub
Host github.com
HostName github.com
User git
IdentityFile ~/.ssh/id_ed25519_github
IdentitiesOnly yes5)测试 SSH 连接:
ssh -T git@gitee.com
ssh -T git@github.com2.2 本地开发目录
目录路径示例:
/Users/zhengai/my_project本地仓库远程绑定 Gitee:
git remote -v
origin git@gitee.com:zhengai/my_project.git (fetch)
origin git@gitee.com:zhengai/my_project.git (push)日常开发流程:
git add .
git commit -m "your commit message"
git push origin main3. 创建 GitHub 镜像仓库
3.1 新建干净仓库
GitHub 新建仓库my_project,确保无 README 或其他文件。
获取 SSH 地址:
git@github.com:zhengai/my_project.git3.2 镜像仓库目录
新建本地镜像目录:
/Users/zhengai/Desktop/github_mirror/克隆 Gitee 仓库为裸仓库:
git clone --mirror git@gitee.com:zhengai/my_project.git
cd my_project.git添加 GitHub 远程:
git remote add github git@github.com:zhengai/my_project.git推送完整镜像到 GitHub:
git push --mirror github4. 生产服务器拉取代码
生产服务器只需 Gitee SSH Key。
拉取最新代码:
git pull origin main不需要配置 GitHub 远程(除非未来希望直接从 GitHub 更新)。
5. 日常维护建议
1)开发:本地修改 → 推 Gitee。
2)镜像同步:在镜像目录执行:
cd /Users/zhengai/Desktop/github_mirror/my_project.git
git fetch --all
git fetch --tags
git push --mirror github3)自动化(可选):
在本地写 sync_gitee_to_github.sh 脚本,定时或手动执行。
或使用 GitHub Actions 定时从 Gitee 拉取镜像。
6. 优点
本地开发与镜像仓库完全分离,降低误操作风险。
GitHub 镜像保持 Gitee 的完整分支和标签。
生产服务器仅从 Gitee 拉取,不依赖镜像,提高安全性。
7. 注意事项
确认推送到 GitHub 时使用 正确的 SSH Key。
-mirror 会同步所有 refs,包括删除的分支,执行前请确认。
可以通过 git remote -v 查看远程配置,确保 Gitee/GitHub 分清。
自动化脚本 sync_gitee_to_github.sh
1.假设你有一个 仓库映射列表文件 repo_list.txt,格式如下:
# 格式: GITEE_SSH_URL GITHUB_SSH_URL
git@gitee.com:zhengai/another_repo.git git@github.com:zhengai/another_repo.git2.脚本为
sync_all_gitee_to_github.sh
#!/bin/bash
# sync_all_gitee_to_github.sh
# 批量自动将多个 Gitee 仓库镜像到 GitHub
REPO_LIST_FILE="./repo_list.txt"
BASE_MIRROR_DIR=~/Desktop/github_mirror
if [ ! -f "$REPO_LIST_FILE" ]; then
echo "Error: repo_list.txt not found!"
exit 1
fi
mkdir -p $BASE_MIRROR_DIR
while read -r line; do
# 忽略空行和注释
[[ -z "$line" || "$line" =~ ^# ]] && continue
GITEE_REPO=$(echo $line | awk '{print $1}')
GITHUB_REPO=$(echo $line | awk '{print $2}')
REPO_NAME=$(basename $GITEE_REPO .git)
MIRROR_DIR="$BASE_MIRROR_DIR/$REPO_NAME.git"
echo "=============================="
echo "处理仓库: $REPO_NAME"
echo "Gitee: $GITEE_REPO"
echo "GitHub: $GITHUB_REPO"
echo "镜像目录: $MIRROR_DIR"
echo "=============================="
if [ ! -d "$MIRROR_DIR" ]; then
echo ">>> 克隆 Gitee 仓库"
git clone --mirror $GITEE_REPO $MIRROR_DIR
else
echo ">>> 更新现有镜像仓库"
cd $MIRROR_DIR
git fetch --all
git fetch --tags
fi
cd $MIRROR_DIR
if ! git remote | grep -q github; then
git remote add github $GITHUB_REPO
fi
echo ">>> 推送到 GitHub"
git push --mirror github
echo ">>> 完成: $REPO_NAME"
done < $REPO_LIST_FILE
echo "所有仓库镜像完成!"保存脚本为
sync_all_gitee_to_github.sh,并赋权:
chmod +x sync_all_gitee_to_github.sh执行:
./sync_all_gitee_to_github.sh