🚚

GitHub CLI を使ってモノレポのリポジトリへ issue を移す

2024/02/20に公開

こんにちは。 ソーシャルPLUS の業務委託エンジニアの steshima です。

ソーシャルPLUS のフロントエンド開発では現在モノレポ化を進めており、その過程で古いリポジトリの issue をモノレポへ移したかったため、 GitHub CLI を使ってまとめて移行しました。

GitHub CLI を使って issue を移す

最終的に実行したコマンドは下記です。
gh issue list で移行元リポジトリの issue 番号を取得し、それを使って gh issue transfer で指定先のリポジトリへ移すといった流れになっています。

$ cd 移行元のリポジトリ
$ gh issue list -s open -L 100 --json number --jq '.[] | .number' | xargs -I{} gh issue transfer {} https://github.com/sample-org/sample-repo

細かく見ていくと、まず gh issue list で現在のリポジトリの issue の一覧を取得します。
-s open でオープンな issue を対象にし、-L 100 で最大100件の issue を取得するようにしています。
注意点としては、リミットを指定しない場合デフォルトで最新30件までを取得するので、それ以上の issue を移行する場合は指定が必要です。

そして --json number で対象のフィールドを JSON 形式で取得します。
フィールドは titleupdatedAt など様々な issue の情報を取得できますが、ここでは issue 番号が欲しいので number を指定します。

$ gh issue list -s open -L 100 --json number
[
  {
    "number": 11
  },
  {
    "number": 10
  }
  ...
]

上記のように JSON 形式で取得できますが、--jq オプションを組み合わせて jq コマンドの expression を指定して数値のみを取得します。

$ gh issue list -s open -L 100 --json number --jq '.[] | .number'
11
10
...

その後、xargsgh issue transfer を使って1件ずつ移行しています。

移行後の issue にラベルをつける

どのリポジトリから移行した issue なのかを判別するためにラベルをつけたかったので、gh issue editコマンドで一括付与しました。

$ cd 移行先のリポジトリ
$ gh issue list -s open -L 100 --search "updated:>=2024-02-20T13:00:00+0900" --json number --jq '.[] | .number' | xargs -I{} gh issue edit {} --add-label "repository A"

移行先のリポジトリから移行した issue の一覧を --search オプションを使って取得しています。
移行作業時は移行先リポジトリの issue の更新頻度は高くなかったため updated を指定して更新日時で絞り込んでいます。

後は先程と同様の流れで1件ずつ繰り返しでラベルを付与しています。

本来であれば、移行先に同じラベルがあれば引き継がれるため前もってラベルを付与しておくとこうした作業をせずに済みます。

引き継がれる issue 情報

issue 移行時に下記情報が引き継がれます。

  • タイトル
  • 本文
  • コメント
  • アサイン
  • マイルストーン

また、下記のような GitHub Projects の情報も同じプロジェクトであれば引き継がれます。

基本的には欲しい情報は引き継がれている印象ですが、試しに1件移行してみて漏れなどないか確認しておくとやらかしが無くて済みそうです。
というのも、自分がこの移行作業をした時になぜか GitHub Projects の各フィールドの設定値(上記画像でいう Priority など)が引き継がれずにリセットされてしまい、50件程あった issue を再精査する羽目になったためです😇
実際に作業したのは数ヶ月前で、執筆時点(2024/2/20)では問題なく引き継がれていたので、もしかしたら GitHub CLI 側に変更があったのかもしれません。

余談ですが、issue の移行は GitHub のブラウザページ上からも実行できます。
少し気づきにくいですが issue 画面のサイドメニューの下の方にあるので、さっと数件だけ移行したい場合はここから行うと良さそうです(あまり無さそうですが)。

参考

SocialPLUS Tech Blog

Discussion