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

