git subtreeでPRテンプレを複数のリポジトリで共有しよう

# はじめに
こんにちは、@mellbrother です。

みなさん、PRテンプレを一箇所で管理できればメンテが簡単なのにと思ったことはないでしょうか？

複数のリポジトリを取り扱う際、同じようなPRテンプレを各リポジトリに追加しているケースも多いかと思います。

頻繁に更新するものではないのですが、いざ更新するとなるとリポジトリの数だけPRテンプレを最新化する必要があり、結構面倒です。

また、PRテンプレ更新のたびに、全てのリポジトリのPRテンプレをしっかり更新していれば、各リポジトリの更新作業が同じになるので、多少作業は減りますが（それでも面倒ですが...）、更新できていないリポジトリがあると差分がどこかをチェックする必要があり、より面倒です。

今回はこの手間をなくすためにPRテンプレを一箇所で管理し、各リポジトリでそれぞれPRテンプレをメンテしなくて良いような構成を考えてみました。

興味のある方は読んでみてください。

# この記事の対象者
- 複数のリポジトリで同じPRテンプレを使用している人
- PRテンプレを一箇所で管理したい人

# 設定手順
### PRテンプレを管理するリポジトリを作成
まずは、PRテンプレを管理するリポジトリを作成しましょう。
このリポジトリにマークダウン形式のPRテンプレを追加していくことになります。

今回はPR-Templateという名前でリポジトリを作成しました。
PRテンプレとしてはtemplate1.mdというファイルを作成し、追加しています。
（テンプレが複数ある場合は複数置いてしまって大丈夫です）

![スクリーンショット 2023-12-09 19.02.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518208/c7fda9ce-0072-759a-f8ae-2f2730e78344.png)


### 開発用リポジトリでPRテンプレを使用できるように設定
続いて、開発用のリポジトリで先ほど作成したPRテンプレを使用できるように設定をしていきましょう。

#### 開発用リポジトリを作成
開発用のリポジトリがない場合は新規に作成します。
（作成した場合は、クローンをしておいてください）

今回はpr-template-shareという名前でリポジトリを作成しました。
（作成時点では空のフォルダで大丈夫です）

![スクリーンショット 2023-12-09 19.08.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518208/8831a4f3-261a-deca-4738-e8a43449a640.png)


#### git subtreeでPRテンプレを追加
開発用のリポジトリにPRテンプレを追加していきましょう。

まずはリモートリポジトリの登録です
先ほどクローンしたフォルダを開き、ターミナルで以下のコマンドを実行します（gitパスは画像の部分です）。

```
git remote add <任意の名前(今回はPR-Template)> <PR-Templateのgitパス>
```
![スクリーンショット 2023-12-09 19.14.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518208/1afdc840-b0fe-5c74-b7d7-71a24288b4af.png)

正しく登録できたかはこちらのコマンドで確認できます。
```
git remote -v
```

続いて、git subtreeを使ってPRテンプレを追加します。
```
git subtree add --prefix=.github/PULL_REQUEST_TEMPLATE PR-Template main
```

`.github/PULL_REQUEST_TEMPLATE`フォルダの下 に `template1.md` があればOKです。

# 実際に使ってみる
それではPRテンプレが使えるのか確認してみましょう。。

まず、開発用のリポジトリでブランチを切り、何らかの変更を加えてPUSHします。

その後githubで開発用のリポジトリを開き、PRを作成していきます

github の画面に表示される Compare & pull request、または New pull request を押してください **(その後に表示される下記画像のCreate pull request は押下しないでください)**。

![スクリーンショット 2023-12-09 19.55.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518208/f8d8756f-081f-1200-8f9e-595b24aacfed.png)

この時点でPRテンプレは表示されていないと思いますが、この画面のURLにクエリパラメータを付与すればPRテンプレを適用することができます。

今表示している画面のURLの後ろに`?expand=1&template=template1.md`を追加して Enter を押してみてください。

![スクリーンショット 2023-12-09 19.56.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518208/1404b618-53b1-b00a-d0f7-8ecb8c7def3b.png)


PRテンプレが適用されていることがわかると思います。

# クエリパラメータの設定を自動化する
上に記載した内容でPRテンプレの適用は完了しましたが、毎回クエリパラメータを付与するのは面倒ですよね。

そのため、今回はchrome拡張を利用して、クエリパラメータの付与を自動化してみようと思います。

まず、chrome の拡張機能の[Requestly](https://chrome.google.com/webstore/detail/mdnleldcmiljblolnjhpnblkcekpdkpa)を入れましょう（リダイレクトができれば他のものでも大丈夫です）。

その後、Requestlyで
```
/https://github.com/[アカウント名]/([0-9a-zA-Z._/\-]+)/compare/([0-9a-zA-Z._/\-]+)/
```
を
```
https://github.com/[アカウント名]/$1/compare/$2?expand=1&template=template1.md
```
にリダイレクトさせるように設定しましょう（アカウント名は適宜変えてください）。

![スクリーンショット 2023-12-09 19.34.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518208/71e242ac-1f47-bd10-d4fc-abbdd7d9ddf7.png)


これで設定は完了です。

※ 特定のリポジトリのみリダイレクトさせたい場合などは、正規表現の値を調整してください

# Requestlyの設定後にPRを作成してみる

先ほどと同じようにPRを作成しましょう。
1. 開発用のリポジトリでブランチを切り、何かしら変更を加え、PUSHする
1. githubで開発用のリポジトリを開き、Compare & pull request、または New pull request を押す

![スクリーンショット 2023-12-09 19.59.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518208/2283bb07-e28c-a0a3-614f-4c49b685e61c.png)

今回はクエリパラメータを追加していないのにPRテンプレ適用済みのPRが作成されたと思います。

# さいごに
いかがだったでしょうか？
このようにするとPRテンプレを一箇所で管理できるため、修正の際に複数のPRテンプレを更新しなくてよくなります。

管理しているPRテンプレを更新した際は、各リポジトリで最新化する必要がありますが、コマンドを実行するだけで済むので、修正コストもそこまでかからないと思います。

もし同じ悩みを抱えている方がいましたら、この方法を検討してみてください。

ではまたの機会に

# 作業していて気づいたこと
作業していて、注意したほうがいいなと思った点などを簡単に記載します。

- PRテンプレを管理するリポジトリに対する PUSH 権限が必要です
  - 権限がない場合は、権限をもらうか、fork したリポジトリ等を利用してください
- `pull_request_template.md` は使用しないでください
  - `pull_request_template.md` があるとクエリパラメータを付与しても`PULL_REQUEST_TEMPLATE` フォルダのPRテンプレが使用できないようです
- `git subtree add --prefix=.github/PULL_REQUEST_TEMPLATE template-share-repository main` 実行時に、git の差分があると`fatal: working tree has modifications.  Cannot add.`というエラーが発生するので、commit/stash などでファイル差分をなくしておいてください
- `git subtree` と似た機能に `git submodule` がありますが、こちらではうまくいきませんでした
  - おそらくPRテンプレの実体が開発用リポジトリに存在しないため、PRテンプレの適用が正常に実行されないのだと思います