← 開発ノート

GitHub・Sourcegraph・ローカル Git でコードを検索する

コード検索は、リポジトリとファイルの範囲を固定してから、見つかった実装を文脈の中で読みます。シンボル名の一致は手掛かりであり、依存バージョンや意図する動作に合う証拠ではありません。

GitHub コード検索、Sourcegraph、ローカルのチェックアウトは、検索可能なデータが異なります。必要なリポジトリへアクセスできるツールを選び、公開インスタンスがすべてのリポジトリやリビジョンを索引化しているとは考えないでください。

処理の流れ

結果を増やす前にクエリの範囲を絞ります。版が重要なら、既定ブランチに頼らず、対象リビジョンを開くか、そのチェックアウトを検索します。

結果を増やす前にクエリの範囲を絞ります。版が重要なら、既定ブランチに頼らず、対象リビジョンを開くか、そのチェックアウトを検索します。

各サービス固有のクエリ言語を使う

GitHub コード検索クエリでは、次の修飾子と引用符付きのフレーズを組み合わせられます。

repo:spring-projects/spring-framework language:java path:WebClient.java "interface WebClient"

対応する Sourcegraph フィルターはリポジトリとファイルの正規表現を使います。

repo:^github\.com/spring-projects/spring-framework$ lang:java file:WebClient\.java$ "interface WebClient"
目的 GitHub コード検索 Sourcegraph
リポジトリ repo:owner/name repo: の正規表現。厳密な一致にはアンカーを使う
Java language:java lang:java または language:java
ファイル範囲 path: のパスフィルター file: の正規表現
完全一致フレーズ 引用符付きフレーズ キーワードモードの引用符付きフレーズ

これはクエリの組み立て例であり、実際の検索件数を測定したものではありません。二つのパスフィルターが同じ集合を返すとは限りません。Sourcegraph の例はファイル名の末尾をアンカーで固定しています。アクセス権、索引化された内容、選択したリビジョンも結果を左右します。

空のディレクトリでローカル検索を再現する

この小さなモックには Git と POSIX シェルが必要です。demo-search が既にあると mkdir は意図的に失敗するので、新しい作業ディレクトリを選びます。

set -eu
mkdir demo-search
cd demo-search
git init -q
mkdir src docs
printf '%s\n' 'interface WebClient {}' > src/WebClient.java
printf '%s\n' 'interface WebClient is discussed here' > docs/notes.txt
git add src docs
git grep -n -F 'interface WebClient' -- src

出力:

src/WebClient.java:1:interface WebClient {}

同じフレーズは docs/notes.txt にもありますが、-- src が検索を制限します。git grep -F はパターンを固定文字列として扱い、-n は行番号を表示します。既定の作業ツリー検索は追跡ファイルを使うため、先にファイルをインデックスへ追加しています。この例はコミットを作りません。実際のチェックアウトでは、意図する範囲を保ったままパスとパターンを置き換えます。

結果を利用する前に、呼び出し元、テスト、ライセンス、リビジョンを読んでください。同じ宣言でも別の版では動作が異なることがあります。検索の一致から推測せず、WebClient 応答テストでクライアントの契約を確認してください。

コメント

GitHubで見る ↗