GitHubでPRが勝手にクローズされる現象

目次

自分の意図と異なる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されていた。

  1. fix #999 と書かれたPRをマージする
  2. GitHubがClosing keywordとして認識する
  3. GitHubがGitHub上の #999 を参照する
  4. #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、知らなかったぜ...

記事一覧へ戻る