迁移 Github 仓库分支

During long time I've always wanted to migrate my Github repos from master to main, and today I finally made up my mind to start.

How to...

The operation steps are as follows:

Install tools

  • install git
  • install gh (guthub-cli), and login:
    gh auth login

run script

#!/bin/bash

# !!! 把这里的 'YOUR_GITHUB_USERNAME' 替换成你的 GitHub 用户名 !!!
GH_USER="YOUR_GITHUB_USERNAME"

# --- 脚本开始 ---

echo "正在获取用户 '$GH_USER' 的所有仓库..."

# 使用 gh cli 获取仓库列表,并过滤掉已经归档的仓库
# jq '.[].name' 会将返回的json数组解析为纯文本的仓库名列表
REPOS=$(gh repo list $GH_USER --limit 1000 --json name,isArchived --jq '.[] | select(.isArchived == false) | .name')

if [ -z "$REPOS" ]; then
  echo "没有找到任何仓库,或者 gh cli 未能正确获取列表。"
  exit 1
fi

echo "找到以下仓库,将开始处理:"
echo "$REPOS"
echo "---"

# 遍历每一个仓库
for REPO in $REPOS; do
  echo "🚀 正在处理仓库: $REPO"

  # 创建一个临时目录用于克隆
  TEMP_DIR="temp_repo_$(date +%s)"
  git clone "[email protected]:$GH_USER/$REPO.git" "$TEMP_DIR"

  # 如果克隆失败,则跳过
  if [ $? -ne 0 ]; then
    echo "❌ 克隆仓库 $REPO 失败,跳过。"
    rm -rf "$TEMP_DIR"
    continue
  fi

  cd "$TEMP_DIR"

  # 检查是否存在 'master' 分支
  if ! git show-ref --verify --quiet refs/heads/master; then
    echo "ℹ️ 仓库 $REPO 中没有 'master' 分支,跳过。"
    cd ..
    rm -rf "$TEMP_DIR"
    continue
  fi

  # 检查是否已存在 'main' 分支
  if git show-ref --verify --quiet refs/heads/main; then
    echo "✅ 仓库 $REPO 中已存在 'main' 分支,跳过。"
    cd ..
    rm -rf "$TEMP_DIR"
    continue
  fi

  echo "  - 正在将 'master' 重命名为 'main'..."
  git branch -m master main

  echo "  - 正在将新的 'main' 分支推送到远程..."
  git push -u origin main

  echo "  - 正在使用 GitHub CLI 更新默认分支为 'main'..."
  gh repo edit "$GH_USER/$REPO" --default-branch main

  # 检查 gh 命令是否成功
  if [ $? -ne 0 ]; then
    echo "⚠️  警告: 更新 $REPO 的默认分支失败。可能是因为分支保护规则。请手动去 GitHub 网站设置。"
  else
    echo "  - 默认分支更新成功。"
  fi

  # 警告:如果 master 分支受保护,此步骤可能会失败
  echo "  - 正在删除远程的 'master' 分支..."
  git push origin --delete master
  if [ $? -ne 0 ]; then
    echo "⚠️  警告: 删除远程 'master' 分支失败。可能是因为它受保护。请手动删除。"
  else
    echo "  - 远程 'master' 分支删除成功。"
  fi

  # 清理
  cd ..
  rm -rf "$TEMP_DIR"

  echo "✅ 仓库 $REPO 处理完毕。"
  echo "---"
done

echo "🎉 所有仓库处理完成!"

Save as a bash script,and run it.

chmod +x migrate_to_main.sh
./migrate_to_main.sh

Update local repos

# 1. 切换到原来的 master 分支
git checkout master

# 2. 将本地的 master 重命名为 main
git branch -m master main

# 3. 从远程获取最新的分支信息
git fetch --prune

# 4. 移除本地分支与旧的远程 master 的关联
git branch --unset-upstream

# 5. 将本地的 main 分支与新的远程 main 分支关联起来
git branch -u origin/main

留下评论

您的邮箱地址不会被公开。 必填项已用 * 标注