GitHubの既存プロジェクトもデフォルトブランチをmainに


背景

某騒動により、GitHubの初期ブランチ名がmainに変えられています。

そして今日、CIの調整中に mainブランチがデフォルトであること を前提とした何某に遭遇しました。
本来そのような作りは受け容れられないものではありますが、ここで私の心は折れました。

これからも自分のプロジェクトでmasterとmainを共存させていくことで、新しい何かを触るときに小さくつまずく可能性を否定したいと考え、既存のプロジェクトもmainをデフォルトブランチに変えてしまうことにしたのです。

リスク

  • 既存のPRやブランチの関係性、CIの挙動を破壊してしまうかもしれない
  • いずこかのリンクを無効化してしまうかもしれない

ので、 当面masterブランチは消さないでおく ことにしました。
また、 リポジトリの中に "master" という文字列が含まれる場合は丁寧に手作業で処理する という方針としました。

私の個人プロジェクト群はこの程度のリスクしか思いつきませんが、 他にも未検出のリスクがある可能性は大いにあります。
本記事のスクリプトの 利用による損害には一切の責任は負いません ので、慎重に利用してください。

スクリプト

次のようなbashスクリプトを用意して、片端から置換していきました。

#!/bin/bash

DOMAIN=github.com
OWNER=kyoh86

PROJ_DIR="${HOME}/Projects/github.com"

if [ -d "${PROJ_DIR}" ]; then
  :
elif [ -e "${PROJ_DIR}" ]; then
  echo "invalid file exist: ${PROJ_DIR}"
  exit 1
else
  mkdir -p "${PROJ_DIR}"
fi

function run() {
  gh api --paginate "/users/${OWNER}/repos?type=owner&visibility=public" \
    | jq -r '.[]|select(.default_branch=="master" and .fork==false)|.full_name' \
    | while read -r repo
  do
    repo_dir="${PROJ_DIR}/${repo}"
    if [ -d "${repo_dir}" ]; then
      echo "# ${repo} is already processed"
    else
      echo "# processing ${repo}"
      git clone "https://${DOMAIN}/${repo}" "${repo_dir}" || return

      rg 'master' "${repo_dir}"
      grep_result=$?
      if [ $grep_result -eq 0 ]; then
        :
      else
        echo "# master not found"
        git -C "${repo_dir}" branch -m main && \
        git -C "${repo_dir}" push origin main  && \
        gh api --silent -X PATCH "/repos/${repo}" --field default_branch="main"
      fi
    fi
  done
}

run

同じような悩みを抱えた方の助けになれば幸いです。
gh 便利ですね。