😩
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
便利ですね。
Discussion