はじめに
皆様日ごろチームで開発を進める際にはコーディング規約やLinterなども駆使して、
ソースコードの品質を保ち統一性を持たせるということをしていると思います。
今回はそのソースコードに対して行っているようなことを、Gitのブランチ名に対しても行おうというものです。
以下ここに至った背景などから説明しますが、実際の解決法をまず知りたい!という方は
規則に沿ったブランチ以外はPush出来ないようにする方法のセクションをご覧ください。
背景
本件を実施するにあたっては以下のような背景がありました。
自由なブランチ名により発生する弊害を防ぐ
ルールを設ける前は特に制限をせずに運用していました。
そこで起こった例として #123-xxx
というブランチが作られたことがありました。
一見すると特に問題が無いようにも思えるのですがこのブランチに対してgit操作をしようとすると
""(ダブルクォート)で囲まないといけない
という事象が発生します。
# 以下は通らない
git checkout #123-xxx
# こちらのようにダブルクォートで囲む必要がある
git checkout "#123-xxx"
何かしらのGUIツールを使ってGit操作をしている場合はそこまで気にならないかもしれないのですが、
CUIを基本的に使う場合には多少の面倒が発生することになります。
他にもGitHubではIssue画面からブランチを作成することもできますが、デフォルトで
{Issue番号}-{Issueタイトル}
という命名がされるようになっています。
つまりIssueのタイトルに日本語を用いた場合、上記キャプチャのようなブランチ名が作成されることになります。
#
などの記号くらいならまだ良いですが日本語などが混ざると運用上でさらに面倒になることが容易に想像できるため、これを防ぎたいのが1つ目の背景です。
Issueとの対応をわかりやすくする
DraftPRを作ったりするほどでもないがいったん今の作業をリモートにPushしておきたい、
のような状況はよくあると思うのですが、
チームで開発を進めていると共同作業をしたり、他の人のヘルプをするなどといった場面も出てくることがあると思います。
その場合にリモート(GitHub)上に存在するブランチにおいて、
どのブランチがどのIssueに対する作業をしているものなのかをわかりやすくしておく
ことで
チーム内での認識を取りやすくしたい、というのが2つ目の背景です。
規則に沿ったブランチ以外はPush出来ないようにする方法
ここからは実際にどのようにすれば本件を実現できるのかの具体的な例を紹介します。
今回の例としては
{Issue-番号}-{任意の半角英数字およびハイフン・アンダースコア}
の規則を守ったブランチだけをPushできるような設定を組みます。
ブランチ例) 123-foo-bar
RuleSetsの設定
対象のリポジトリの Settings > Rules > Rulesets で上記キャプチャのような設定を作成します。
Branch targeting criteria
Add Target > Exclude By Pattern
を選択し、
Branch naming Pattern
に[0-9]*-[A-Za-z0-9-_]*
を設定する。
Branch Rules
Restrict creations
にチェックを入れる。
上記の2つが設定出来たら最後に画面下部「Save Changes」で設定を保存します。
こちらの設定を入れることで
{Issue-番号}-{任意の半角英数字およびハイフン・アンダースコア}
以外のブランチ名ではリモートへのPush(ブランチ作成)が出来ないようになります。
実動作例
こちらの設定を入れたうえでローカルからリモートへ規則に従っていないブランチをPushしようとしてみます。
#123-xxx
というブランチのPushを試みたところ
! [remote rejected] #123-xxx -> #123-xxx (push declined due to repository rule violations)
とルールによりPush出来なかったことが表示されています。
また割愛しますが、冒頭少し紹介したGitHubのIssue上からブランチを作ろうとしたときも
同様にルールを守っていない場合きちんとエラーになります。
おわりに
いかがだったでしょうか。
ブランチ名は人間のマニュアル運用でどうにかなることが大半かもしれませんが
機械的に防げるものは防ぎましょう!ということで参考になれば幸いです。