自分の意図と異なるPRが勝手にクローズされていたので調べた。
前提
タスク管理の方法
今のPJでは、GitHub Issueとは別に独自のタスクリストを管理している。
各タスクには、次のように番号が振られており、基本的にこのタスクをもとに作業してPRを作っている。
No.998
No.999
No.1000
PRタイトルの付け方
PRを作成するときは、どのタスクに対する対応なのか分かるように、タイトルへタスクNo.を記載している。
例えば、次のようなタイトルにしている。
fix #999 ○○を修正
ここでの #999 はGitHubのIssueやPRを表しているわけではなく、PJ独自のタスクNo.999という意図だった。
発生した事象
あるPRをマージしたタイミングで、関係のないOpen中のPRがCloseされた。
自分ではCloseしていないはずなのに、GitHub上では自分がCloseしたことになっていた。
原因
GitHubのClosing keywords
GitHubには、PRやコミットからIssueを自動的にCloseするための Closing keywords という仕組みがある。
Using keywords in issues and pull requests
例えば、次のような表現がClosing keywordsとして認識される。
fix #999
fixes #999
close #999
closes #999
resolve #999
resolves #999
このように書かれたPRやコミットが デフォルトブランチ へマージされると、参照されている #999 を自動的にCloseできる。
通常であれば、
fix #999
と書くことで、
この変更によってGitHub Issue #999が解決する
という意味になる。
ただし、GitHubの #999 はIssueだけではなくPull Requestを指す場合もある。
#999 がOpen中のPRだった場合、そのPR自体がCloseされる。
タスクNo.とPR番号の一致
今回のPJでは、次の番号がそれぞれ別に採番されている。
- PJ独自のタスクNo.
- GitHubのIssue / PR番号
そして、両者の番号が近くなっていた。
例えば、次のような状態だった。
PJ独自のタスク: No.999
GitHub上のPR: #999
この状態で、タスクNo.999に対応したPRへ、次のように記載した。
fix #999
こちらの意図は、
タスク No.999 を修正
というものだったが、GitHubは、
GitHub上の #999 を修正
と解釈する。
その結果、次の流れでPRがCloseされていた。
fix #999と書かれたPRをマージする- GitHubがClosing keywordとして認識する
- GitHubがGitHub上の
#999を参照する #999がOpen中のPRだった場合、PR #999がCloseされる
つまり、PJ独自のタスクNo.とGitHub上のIssue / PR番号が偶然一致したことで、自動Closeが発生していた。
対応策
タスクNo.の表記方法
独自の番号をPRへ記載する場合は、GitHubのIssue / PR参照と誤認されない形式にするとよい。
例えば、次のように # を付けない形にする。
fix 課題999
fix 999
GitHubのClosing keywordsは、IssueやPR番号と組み合わせて使われるため、独自タスク番号には # を付けないようにする。
まとめ
GitHubのPRタイトルやコミットメッセージに fix #999 のような表現を書くと、意図せずClosing keywordsとして解釈されることがある。
独自のタスク番号を表すために # を使っている場合は、GitHubのIssue / PR番号と衝突する可能性がある。
Closing keywords、知らなかったぜ...