Tips - AIに与えるコンテキストから情報を除外する方法
GitHub Copilotを組織で運用する際、「このコードはAIに読ませたくない」という要件に直面したことはありませんか。セキュリティ上重要な情報、独自のビジネスロジック、あるいは顧客データを含むファイル——これらをCopilotの学習対象から除外できる機能が、GitHub Copilotには標準で備わっています。
この記事では、GitHub Copilotのコンテンツ除外機能について、実践的な設定方法から監査まで、網羅的に解説します。
1. コンテンツ除外機能の概要
コンテンツ除外機能を使用すると、特定のファイルやディレクトリをGitHub Copilotの処理対象から除外できます。これにより、以下のような運用が可能になります。
- 機密情報を含むファイルの保護
- 社外秘のビジネスロジックの保護
- レガシーコードベースの除外
- テストデータやモックデータの除外
1.1 利用可能なプラン
この機能は以下のプランで利用できます。
- GitHub Copilot Business
- GitHub Copilot Enterprise
1.2 権限レベル
2. 重要な制約事項
設定を始める前に、以下の制約を理解しておく必要があります。
コンテンツ除外が適用されないツール
- GitHub Copilot CLI
- Copilot coding agent
- IDE内のCopilot ChatにおけるAgent mode
これらのツールでは、現時点でコンテンツ除外設定が反映されません。
3. 設定レベルの階層構造
コンテンツ除外は3つのレベルで設定でき、それぞれ異なるスコープで動作します。
3.1 リポジトリレベルの設定
最も細かい粒度での制御が可能です。特定のリポジトリ内のファイルを除外します。
設定手順
- GitHubでリポジトリのメインページに移動
- リポジトリ名の下にある「Settings」をクリック
- サイドバーの「Code & automation」セクションから「Copilot」→「Content exclusion」を選択
- 「Paths to exclude in this repository」ボックスにパスを入力
パス指定の基本フォーマット
- "/PATH/TO/DIRECTORY/OR/FILE"
各パスは別の行に記述し、#で始まる行はコメントとして扱われます。
実践的な設定例
# 特定のファイルを除外
- "/src/some-dir/kernel.rs"
# リポジトリ内のどこにあっても、特定の名前のファイルを除外
- "secrets.json"
# ワイルドカードを使用したパターンマッチング
- "secret*"
# 拡張子による除外
- "*.cfg"
# ディレクトリ以下をすべて除外
- "/scripts/**"
3.2 組織レベルの設定
組織全体で統一的なポリシーを適用できます。Git管理下のファイルだけでなく、ファイルシステム上のあらゆるファイルを対象にできます。
設定手順
- GitHubの右上からプロフィール画像をクリックし、「Organizations」を選択
- 対象の組織の横にある「Settings」をクリック
- 左サイドバーから「Copilot」→「Content exclusion」を選択
- 「Repositories and paths to exclude」ボックスに設定を入力
設定フォーマット
組織レベルでは、2つの指定方法があります。
方法1: ファイルシステム全体からの除外
"*":
- "パターン"
方法2: 特定リポジトリ内のファイル除外
REPOSITORY-REFERENCE:
- "/PATH/TO/DIRECTORY/OR/FILE"
- "/PATH/TO/DIRECTORY/OR/FILE"
リポジトリ参照の記法
リポジトリは以下のいずれのプロトコルでも参照できます。
http[s]://host.xz[:port]/path/to/repo.git/
git://host.xz[:port]/path/to/repo.git/
[user@]host.xz:path/to/repo.git/
ssh://[user@]host.xz[:port]/path/to/repo.git/
重要: user@や:portの部分は、除外対象の計算では無視されます。
組織レベルの実践的な設定例
# すべてのファイルシステムルートから.envファイルを除外
"*":
- "**/.env"
# 組織内の特定リポジトリで除外
octo-repo:
- "/src/some-dir/kernel.rs"
# GitHubの特定リポジトリで除外
https://github.com/example/react.git:
- "secrets.json"
- "/src/**/temp.rb"
# 任意の組織のcopilotリポジトリで除外
git@github.com:*/copilot:
- "/__tests__/**"
- "/scripts/*"
# GitLab上のリポジトリで除外
git@gitlab.com:example-org/example-runner.git:
- "/main_test.go"
- "{server,session}*"
- "*.m[dk]"
- "**/package?/*"
- "**/security/**"
3.3 エンタープライズレベルの設定
エンタープライズ全体のCopilotユーザーに一括で適用される最上位の設定です。
設定手順
- GitHubの右上からプロフィール画像をクリック
- 環境に応じて「Enterprise」または「Enterprises」をクリックし、対象のエンタープライズを選択
- ページ上部の「AI controls」をクリック
- サイドバーから「Copilot」を選択
- 「Content exclusion」をクリック
- 組織レベルと同じ記法でパスを指定
組織レベルとの違い
エンタープライズレベルの設定は、エンタープライズ内のすべてのCopilotユーザーに適用されます。一方、組織レベルの設定は、その組織からCopilotの席を割り当てられたユーザーにのみ適用されます。
4. パターンマッチングの詳細
パス指定にはfnmatchパターンマッチング記法が使用できます。パターンは大文字小文字を区別しません。
4.1 よく使うパターン
| パターン | 説明 | 例 |
|---|---|---|
* |
任意の文字列(スラッシュを除く) |
secret* → secret.txt, secrets.json
|
** |
任意の文字列(スラッシュを含む) |
/scripts/** → /scripts/以下すべて |
? |
任意の1文字 |
package? → packages, packaged
|
[abc] |
指定文字のいずれか |
*.m[dk] → *.md, *.mk
|
{a,b} |
いずれかの文字列 |
{server,session}* → server.js, session.rb
|
5. 設定変更のテスト
コンテンツ除外設定を変更した後は、正しく動作しているか確認することが重要です。
5.1 設定の伝播
設定変更がIDEに反映されるまで、最大30分かかる場合があります。
手動で設定を再読み込みする方法
JetBrains IDEsおよびVisual Studio
- アプリケーションを閉じて再起動
Visual Studio Code
- コマンドパレットを開く(Shift+Command+P (Mac) / Ctrl+Shift+P (Windows/Linux))
-
reloadと入力 - 「Developer: Reload Window」を選択
Vim/Neovim
- ファイルを開くたびに自動的にGitHubから取得されます
5.2 インライン補完のテスト手順
5.3 Copilot Chatのテスト手順
- IDEでCopilot Chatパネルを開く
- 除外対象のファイルを開き、他のファイルはすべて閉じる
- 開いているファイルがコンテキストファイルとしてプロンプトに添付されていることを確認
- 「このファイルを説明してください」というプロンプトを入力
- ファイルが除外されている場合、Copilot Chatはファイルを使用して応答を生成できず、応答内の参照リストにファイルが表示されません
6. 変更履歴の監査
コンプライアンスやセキュリティの観点から、誰がいつ設定を変更したかを追跡することが重要です。
6.1 リポジトリレベルの変更履歴確認
詳細情報の確認方法
- リポジトリのメインページに移動
- 「Settings」をクリック
- サイドバーの「Code & automation」から「Copilot」を選択
- ページ下部にスクロール
- 最終変更者の名前と変更日時を確認
- 変更時刻をクリック
- 組織の監査ログページが表示され、
copilot.content_exclusion_changedアクションの最新の記録が表示されます - 各エントリの末尾にある省略記号(...)をクリックして詳細を表示
-
excluded_pathsエントリが切り詰められている場合、マウスをホバーすると完全な内容が表示されます
6.2 組織レベルの変更履歴確認
組織レベルの監査ログでは、リポジトリレベルと組織レベルの両方の変更が一覧表示されます。
7. 実運用での設計パターン
7.1 パターン1: 階層的な除外設計
# エンタープライズレベル: 全社共通の機密情報
"*":
- "**/.env"
- "**/.env.local"
- "**/credentials.json"
# 組織レベル: チーム固有のポリシー
"*":
- "**/secrets/**"
- "**/*_secret*"
https://github.com/example-org/*:
- "/internal/**"
# リポジトリレベル: プロジェクト固有の除外
- "/legacy/**"
- "/vendor/**"
- "*.private.js"
7.2 パターン2: プロジェクト種別による除外
バックエンドAPI用
- "/migrations/**"
- "/seeds/**"
- "database.yml"
- "*_credentials.rb"
フロントエンド用
- "/.env*"
- "/cypress/fixtures/**"
- "**/*.mock.js"
- "/storybook-static/**"
7.3 パターン3: セキュリティ重視の設定
# 認証関連
- "**/auth/**"
- "**/*_token*"
- "**/*_key*"
# 設定ファイル
- "**/.aws/**"
- "**/.ssh/**"
- "**/config/secrets/**"
# データファイル
- "**/*.pem"
- "**/*.p12"
- "**/*.pfx"
8. トラブルシューティング
8.1 よくある問題と解決方法
問題1: 設定が反映されない
原因:
- 設定の伝播に時間がかかっている(最大30分)
- パス記法が誤っている
解決策:
- IDEを再起動して手動で設定を再読み込み
- パスが正しい形式か確認(先頭の
-、スペースなど)
問題2: パターンマッチングが期待通りに動作しない
原因:
- パターン記法の誤り
- 大文字小文字の混在(ただし、パターンは大文字小文字を区別しない)
解決策:
- fnmatch記法のドキュメントを参照
- より具体的なパスで試してから、段階的にパターンを拡張
問題3: 継承された除外設定が表示される
これは問題ではなく、正常な動作です。リポジトリが親組織またはエンタープライズから除外設定を継承している場合、ページ上部にグレーのボックスで表示されます。これらの設定は編集できません。
9. まとめ
GitHub Copilotのコンテンツ除外機能は、AI支援開発とセキュリティ要件を両立させる強力なツールです。
重要なポイント
- 3つの階層(エンタープライズ、組織、リポジトリ)で細かく制御可能
- fnmatchパターンマッチングにより柔軟なファイル指定が可能
- 変更履歴は監査ログで完全に追跡可能
- 設定反映には最大30分かかる場合がある
実践のために
- まず小規模なリポジトリでテスト設定を行う
- 段階的に除外範囲を拡大する
- 定期的に監査ログを確認する
- チームメンバーに設定変更を周知する
適切に設定されたコンテンツ除外により、組織はCopilotの生産性向上と、機密情報の保護を同時に実現できます。この機能を活用して、安全で効率的な開発環境を構築してください。