path-walk API は、到達可能なオブジェクトを走査するために使用しますが、共通のパスに基づいて、または型ごとに、バッチ単位でオブジェクトを訪問します。
たとえば、到達可能なコミットはすべて1つのグループとして訪問されます。タグもすべて1つのグループとして訪問されます。続いて、すべてのルートツリーが訪問されます。どこかの時点で、パス my/dir/to/A を介して到達可能なすべてのブロブが訪問されます。同じオブジェクトに到達するためのパスが複数ある場合でも、そのうちの1つのパスだけを使用してそのオブジェクトを訪問します。
Basics
path-walk API を使用するには、 path-walk.h をインクルードし、 カスタマイズした path_walk_info 構造体を指定して walk_objects_by_path() を呼び出します。 この構造体は、 走査をどのように進めるかに関するすべてのオプションを設定するために使用します。 以下、 各オプションとその用途を詳しく見ていきましょう。
-
path_fnandpath_fn_data -
もっとも重要なオプションは
path_fnオプションです。これは、型とパスでグループ化されたオブジェクトのオブジェクトIDに対してロジックを実行できるコールバックへの関数ポインタです。この関数は、コールバック関数にカスタムデータ構造を渡すために、path_fn_dataメンバーに対応するdata値も受け取ります。 -
revs -
到達可能なオブジェクト集合の厳密な詳細を設定するには、
revsメンバーを使用し、revision.hのリビジョン機構を使って初期化します。setup_revisions() やparse_revision_opt() などの呼び出しでrevsを初期化します。prepare_revision_walk() はwalk_objects_by_path() の内部で呼び出されるため、呼び出さないでください。また、
revs構造体に対して--objectsフラグを指定しないことも重要です。リビジョンウォークはコミットを走査するためにのみ使用し、オブジェクトはそれらの開始コミットに基づいて別の方法で走査します。 -
commits -
blobs -
trees -
tags -
デフォルトでは、これらのメンバーは有効になっており、path-walk API がこれらの型のオブジェクトに対して
path_fnを呼び出すべきであることを示します。特化したアプリケーションでは、オブジェクトの走査を単純にしたりpath_fnの呼び出し回数を減らしたりするために、いくつかのオプションを無効化できます。この方法でコミットだけを走査することも可能ですが、利用側はリビジョンウォーク API を使うほうがよいでしょう。
-
prune_all_uninteresting -
デフォルトでは、path-walk API は到達可能なパスをすべて出力します。このオプションにより、含まれるオブジェクトがすべて
UNINTERESTINGフラグでマークされているパスには関心がないことを利用側が宣言できます。これには、リビジョンウォークでboundaryオプションを使用して、UNINTERESTINGフラグでマークされたコミットを走査が出力するようにする必要があります。 -
edge_aggressive -
性能上の理由から、通常は UNINTERESTING オブジェクトを見つけるために境界コミットだけを探索します。しかし、浅いクローン(shallow clones)の場合は、 UNINTERESTING な先端コミットから到達可能なすべてのツリーとブロブを UNINTERESTING としてマークすると役に立つことがあります。これはリビジョン API の
--objects-edge-aggressiveの挙動に一致します。 -
pl -
このパターンリストポインタを使うと、 path-walk の検索対象をパターン集合に絞り込み、指定されたパターンに一致するパスだけを出力できます。パターンリストの詳細については gitignore(5) または git-sparse-checkout(1) を参照してください。 パターンリストが cone-mode のパターンを使用している場合、 path-walk API は走査するパス集合を刈り込んで性能を改善できます。
Examples
使用例については以下を参照してください:
t/helper/test-path-walk.c,
builtin/pack-objects.c,
builtin/backfill.c