郑工长

Gitee → GitHub 镜像操作指南(含 SSH 配置与自动化脚本)

发布于 2025年9月28日 | 分类: AI随心分享

在日常开发中,很多团队或个人习惯将主要工作仓库托管在 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_github

3)将 GitHub 公钥添加到 GitHub 账户:

cat ~/.ssh/id_ed25519_github.pub
  • GitHub → 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 yes

5)测试 SSH 连接:

ssh -T git@gitee.com
ssh -T git@github.com

2.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 main

3. 创建 GitHub 镜像仓库

3.1 新建干净仓库

  • GitHub 新建仓库my_project,确保无 README 或其他文件。

  • 获取 SSH 地址:

git@github.com:zhengai/my_project.git

3.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 github

4. 生产服务器拉取代码

  • 生产服务器只需 Gitee SSH Key。

  • 拉取最新代码:

git pull origin main
  • 不需要配置 GitHub 远程(除非未来希望直接从 GitHub 更新)。


5. 日常维护建议

  1. 1)开发:本地修改 → 推 Gitee。

  1. 2)镜像同步:在镜像目录执行:

cd /Users/zhengai/Desktop/github_mirror/my_project.git
git fetch --all
git fetch --tags
git push --mirror github

3)自动化(可选):

  • 在本地写 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.git

2.脚本为
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