🐷

GitHub CLI(ghコマンド)でIssueを別リポジトリにスムーズに移動する方法

2025/03/01に公開

はじめに

GitHubやZenHubでプロジェクト管理していると、組織変更などに伴い、別リポジトリにIssueを移動したいシーンが出てきます。
しかし、Issueを直接移動する機能はありません。
本記事では、GitHub CLI(gh コマンド)を使って、Issueをスムーズにコピー&移動する方法を紹介します。

どんなときに役立つか

  • 数十件以上のIssueをまとめて移動したい
  • Issueについたラベルも引き継ぎたい
  • クローズ済みのIssueは移行したくない
  • 元のIssueに移動したことを残したい

手順

セットアップ

GitHub CLI が未インストールの場合は、以下の手順でセットアップします。

# macOS(Homebrew)
brew install gh

# Ubuntu(Debianベース)
sudo apt install gh

# Windows(Scoop)
scoop install gh

次に、GitHub アカウントと連携します。

gh auth login

Issue を別のリポジトリに移動するスクリプト

  • OLD_REPOは移行元、NEW_REPOは移行先リポジトリを指定してください。
  • github.comを指定しているので、自社ホスティングされば適宜変更してください
#!/bin/bash

OLD_REPO="YOUR_ORG/YOUR_OLD_REPO"
NEW_REPO="YOUR_ORG/YOUR_NEW_REPO"

# オープンな Issue を取得(クローズ済みを除外)
ISSUE_NUMBERS=($(gh issue list --repo "$OLD_REPO" --state open --json number --jq '.[].number'))

for ISSUE in "${ISSUE_NUMBERS[@]}"; do
  # 元のIssue情報を取得(タイトル、本文、ラベル)
  ISSUE_DATA=$(gh issue view "$ISSUE" --repo "$OLD_REPO" --json title,body,labels)
  TITLE=$(echo "$ISSUE_DATA" | jq -r '.title')
  BODY=$(echo "$ISSUE_DATA" | jq -r '.body')

  # ラベルを配列に変換
  LABELS=$(echo "$ISSUE_DATA" | jq -r '[.labels[].name] | join(",")')

  # 新しいリポジトリにIssueを作成
  if [[ -n "$LABELS" ]]; then
    NEW_ISSUE_URL=$(gh issue create --repo "$NEW_REPO" --title "$TITLE" --body "$BODY\n\n---\n[元のIssue](https://github.com/$OLD_REPO/issues/$ISSUE)" --label "$LABELS" --json url)
  else
    NEW_ISSUE_URL=$(gh issue create --repo "$NEW_REPO" --title "$TITLE" --body "$BODY\n\n---\n[元のIssue](https://github.com/$OLD_REPO/issues/$ISSUE)" --json url)
  fi

  # 新しい Issue 番号を取得
  NEW_ISSUE_NUMBER=$(echo "$NEW_ISSUE_URL" | jq -r '.url' | awk -F'/' '{print $NF}')

  # 元のIssueに「移動しました」コメントを追加
  gh issue comment "$ISSUE" --repo "$OLD_REPO" --body "このIssueは [新しいIssue](https://github.com/$NEW_REPO/issues/$NEW_ISSUE_NUMBER) に移動しました。"

  # 元のIssueをクローズ
  gh issue close "$ISSUE" --repo "$OLD_REPO"

  echo "Issue #$ISSUE を移動しました(新しいIssue #$NEW_ISSUE_NUMBER)"
done

スクリプトの解説

  • オープンなIssueのみ取得(--state open)
  • タイトル、本文、ラベルを取得し、新しいIssueとして作成
  • 元のIssueに移動先のリンクをコメントとして追加
  • 元のIssueをクローズ

スクリプトの使い方

nano move_issues.sh
# スクリプトをコピペして保存
chmod +x move_issues.sh
./move_issues.sh

おわりに

この方法を使えば、GitHubのIssueをスムーズに別リポジトリへ移動できます。
大量のIssueを移動する場合は、ぜひこのスクリプトを活用してください。

Discussion