コンテンツにスキップ

Copilot 用のプロンプトを git subtree で取り込む

Copilot 用のプロンプト集をgit subtreeで取り込み、取り込み元の更新に追従しながら手元でカスタマイズする方法を紹介する。直接ダウンロードする方法やgit submoduleとの違いを比べ、取り込みから更新までのコマンドを示す。

検証時に使用した VSCode、Copilot、gitのバージョンは記録していない。この記事の VSCode 設定は、当時利用したinstructions、chatmodes、promptsの構成に対応するものだ。

背景

VSCode で Copilot を使うときに、instructionsやchatmodes、promptsを設定できる。いずれも、Copilot の動作をカスタマイズするために使う。

github/awesome-copilotのリポジトリには、instructionsやchatmodes、promptsの設定を事前に定義したものがある。awesome-copilot のプロンプト集を取り込んで開発に活用できないかと考えた。

取り込む方法の検討

awesome-copilot のプロンプトを取り込む方法として、3 つの方法を検討した。それぞれの内容と特徴は次のとおりだ。

方法 内容 バージョン管理 カスタマイズ
curl / wget 直接ファイルをダウンロードする しづらい できる
git submodule リポジトリをサブモジュールとして追加する できる 別リポジトリで変更を管理する
git subtree リポジトリをサブツリーとして追加する できる できる

curl や wget では、取り込み元のどのコミットを使ったかを別途記録する必要がある。git submoduleでも編集はできるが、変更のコミットや共有はサブモジュール側のリポジトリで管理する。今回は、取り込んだプロンプトの変更を自分のプロジェクトと同じリポジトリで管理したいため、git subtreeを選んだ。

取り込み手順

git subtreeを利用して、awesome-copilot のプロンプトを取り込む手順は次の通り。

  1. git remote にプロンプト集のリポジトリを追加する。
    git remote add prompts https://github.com/github/awesome-copilot
    
  2. git subtreeを利用して、プロンプト集のリポジトリをサブツリーとして追加する。
    git subtree add --prefix subtree/awesome-copilot prompts main --squash
    
    ここで、--prefixオプションは、サブツリーを追加するディレクトリを指定する。
  3. git logを利用して、取り込んだプロンプトのコミットログを確認する。
    git log
    
  4. 取り込んだプロンプトを利用できるように、VSCode の設定ファイルを更新する。
    .vscode/settings.json
    {
      "chat.promptFilesLocations": {
        ".github/prompts": true,
        "subtree/awesome-copilot/prompts": true
      },
      "chat.instructionsFilesLocations": {
        ".github/instructions": true,
        "subtree/awesome-copilot/instructions": true
      },
      "chat.modeFilesLocations": {
        ".github/chatmodes": true,
        "subtree/awesome-copilot/chatmodes": true
      }
    }
    
  5. 取り込んだプロンプトが Copilot の設定で利用できることを確認する。
    • /xxxを入力した時や chatmodes の切り替え時に、取り込んだプロンプトが表示されることを確認する
  6. 利用目的に合わせて取り込んだプロンプトをカスタマイズする。
  7. git pushを利用して、取り込んだプロンプトをリモートリポジトリにプッシュする。
    git push origin main
    

取り込み元の更新を反映する

取り込んだプロンプトへの変更をコミットした後、プロジェクトのルートで次のコマンドを実行する。promptsは最初に追加した remote 名で、--prefixは取り込み時と同じディレクトリを指定する。

git subtree pull --prefix subtree/awesome-copilot prompts main --squash

git subtree の公式マニュアルにあるとおり、pullは取り込み元の変更を取得してマージする。カスタマイズした箇所と競合した場合は、通常のマージと同じように解消する。

まとめ

git subtreeを利用してプロンプトを取り込むことで、バージョン管理とプロンプトのカスタマイズを両立できる。既存のプロンプト集を活用すれば、一からプロンプトを作成せずに済む。

開発組織でベースとなるプロンプト集を作成すれば、組織内のどのプロジェクトでも共通して利用できる。今回の取り組みを通じて、こうしたプロンプト集を整える取り組みが今後広がっていくのではないかと思った。

余談

今回は 3 つの方法を検討したが、取り込みを終えた後でgit-fetch-fileというツールを知った。git-fetch-file を使うと特定のファイルだけを取り込めるので、subtree ほど大掛かりな仕組みを必要としない場面では選択肢になりそうだ。