こんにちは、CX事業本部 IoT事業部の若槻です。
GitHubの新規Repositoryのデフォルトブランチの名前はかつてmaster
でしたが、2020/10よりmain
に変更されました。
私はこのアップデート後もしばらくの間は、アップデート以前に作成したRepositoryはブランチ名をmaster
のまま使い続けていましたが、最近になって既定でmain
で作成されたRepositoryがほとんどを占めて来たため、すべてのRepositoryでmain
に統一したくなりました。
そこでmaster
のままになっているRepositoryのデフォルトブランチをmain
に変更する操作を行ったのですが、その際に既存のPull RequestのBaseブランチを忘れずに変更する必要があったので、対処内容を書き残しておきます。
デフォルトブランチをmainに変更
ローカルのブランチ名をmaster
からmain
に変更してリモートにPushします。
git branch -m master main
git push -u origin main
次にGitHub側のBranchesでデフォルトブランチをmain
に変更します。
あとはリモートからmaster
ブランチを削除すれば変更は完了なのですが、master
をBaseブランチとしているPull Requestが残っているので、master
を削除するとPull Requestは自動でクローズされるという警告が表示されます。
勝手にクローズされては困りますし、(いずれにせよ対応としては必要なので)master
を削除する前に既存のPull RequestのBaseブランチをmain
に変更します。
既存のPull RequestのBaseをmainに変更
Open中のPull Requestの数が結構あるので、Baseブランチの変更はGitHub CLIを使って行います。
$ gh --version
gh version 2.14.4 (2022-08-10)
https://github.com/cli/cli/releases/tag/v2.14.4
gh pr listでPull Request一覧を出力してみると、master
をBaseとしたものが20近く残っていますね。これらをGUIから一つずつ変更するのは大変なのでCLIで対応しましょう。
$ gh pr list --json number,baseRefName --jq '.[]'
{"baseRefName":"main","number":1612}
{"baseRefName":"main","number":1608}
{"baseRefName":"master","number":1602}
{"baseRefName":"master","number":1599}
{"baseRefName":"master","number":1598}
{"baseRefName":"master","number":1590}
{"baseRefName":"master","number":1557}
{"baseRefName":"master","number":1553}
{"baseRefName":"master","number":1540}
{"baseRefName":"master","number":1535}
{"baseRefName":"master","number":1531}
{"baseRefName":"master","number":1529}
{"baseRefName":"master","number":1526}
{"baseRefName":"master","number":1524}
{"baseRefName":"master","number":1521}
{"baseRefName":"master","number":1513}
{"baseRefName":"master","number":1477}
{"baseRefName":"master","number":1440}
{"baseRefName":"master","number":1433}
{"baseRefName":"master","number":1430}
{"baseRefName":"master","number":1416}
--jq
オプションではjqのクエリが使用できます。select
クエリを使えばbaseRefName
がmaster
であるPull request一覧を取得できます。
$ gh pr list --json number,baseRefName --jq '.[] | select(.baseRefName == "master") | .'
{"baseRefName":"master","number":1602}
{"baseRefName":"master","number":1599}
{"baseRefName":"master","number":1598}
{"baseRefName":"master","number":1590}
{"baseRefName":"master","number":1557}
{"baseRefName":"master","number":1553}
{"baseRefName":"master","number":1540}
{"baseRefName":"master","number":1535}
{"baseRefName":"master","number":1531}
{"baseRefName":"master","number":1529}
{"baseRefName":"master","number":1526}
{"baseRefName":"master","number":1524}
{"baseRefName":"master","number":1521}
{"baseRefName":"master","number":1513}
{"baseRefName":"master","number":1477}
{"baseRefName":"master","number":1440}
{"baseRefName":"master","number":1433}
{"baseRefName":"master","number":1430}
{"baseRefName":"master","number":1416}
Baseブランチがmaster
のPull RequestのNumber一覧を改行区切りで取得します。
$ pulls=$(gh pr list --json number,baseRefName --jq '.[] | select(.baseRefName == "master") | .number')
$ echo $pulls
1602
1599
1598
1590
1557
1553
1540
1535
1531
1529
1526
1524
1521
1513
1477
1440
1433
1430
1416
各Numberに対してgh pr editを実行し、Baseブランチをmain
に変更します。
echo $pulls | while read line
do
gh pr edit $line --base main
done
再度Pull Request一覧を出力してみると、すべてでBaseブランチがmain
に変更できていますね!
$ gh pr list --json number,baseRefName --jq '.[]'
{"baseRefName":"main","number":1612}
{"baseRefName":"main","number":1608}
{"baseRefName":"main","number":1602}
{"baseRefName":"main","number":1599}
{"baseRefName":"main","number":1598}
{"baseRefName":"main","number":1590}
{"baseRefName":"main","number":1557}
{"baseRefName":"main","number":1553}
{"baseRefName":"main","number":1540}
{"baseRefName":"main","number":1535}
{"baseRefName":"main","number":1531}
{"baseRefName":"main","number":1529}
{"baseRefName":"main","number":1526}
{"baseRefName":"main","number":1524}
{"baseRefName":"main","number":1521}
{"baseRefName":"main","number":1513}
{"baseRefName":"main","number":1477}
{"baseRefName":"main","number":1440}
{"baseRefName":"main","number":1433}
{"baseRefName":"main","number":1430}
{"baseRefName":"main","number":1416}
これによりmaster
ブランチが問題なく削除できるようになりました。
おわりに
GitHubのデフォルトブランチを変更するときは既存のPull requestのBaseブランチも忘れずに変更しようということで対応してみました。
個人的にはmaster
よりもmain
の方が文字数が少なくて打鍵もしやすいので気に入っています。
参考
- masterからmainに変更する(githubのリモート&ローカルブランチ)branches - Qiita
- jqを使って少し複雑な条件式でフィルタリングする方法をまとめてみた - Qiita
- 【bash】行ごとに処理する - Qiita
以上