Git
英語 ▾ トピック ▾ 最新バージョン ▾ git-pack-objects 最終更新日: 2.43.0

名前

git-pack-objects - オブジェクトの圧縮アーカイブを作成する

概要

git pack-objects [-q | --progress | --all-progress] [--all-progress-implied]
	[--no-reuse-delta] [--delta-base-offset] [--non-empty]
	[--local] [--incremental] [--window=<n>] [--depth=<n>]
	[--revs [--unpacked | --all]] [--keep-pack=<pack-name>]
	[--cruft] [--cruft-expiration=<time>]
	[--stdout [--filter=<filter-spec>] | <base-name>]
	[--shallow] [--keep-true-parents] [--[no-]sparse] < <object-list>

説明

標準入力からオブジェクトのリストを読み込み、指定されたベース名を使用して1つ以上の圧縮アーカイブをディスクに書き込むか、圧縮アーカイブを標準出力に書き込みます。

圧縮アーカイブは、2つのリポジトリ間でオブジェクトを転送する効率的な方法であると同時に、アクセス効率の高いアーカイブ形式でもあります。圧縮アーカイブでは、オブジェクトは圧縮された全体として格納されるか、他のオブジェクトとの差分として格納されます。後者はしばしばデルタと呼ばれます。

圧縮アーカイブ形式 (.pack) は、それ以上の情報なしで展開できるように設計されています。したがって、デルタが依存する各オブジェクトは、パック内に存在する必要があります。

パック内のオブジェクトに高速でランダムアクセスするために、パックインデックスファイル (.idx) が生成されます。インデックスファイル (.idx) と圧縮アーカイブ (.pack) の両方を $GIT_OBJECT_DIRECTORY の pack/ サブディレクトリ(または $GIT_ALTERNATE_OBJECT_DIRECTORIES 上のディレクトリのいずれか)に配置すると、Git は圧縮アーカイブから読み取ることができます。

git unpack-objects コマンドは圧縮アーカイブを読み取り、パックに含まれるオブジェクトを「オブジェクト1つにつきファイル1つ」形式に展開できます。これは通常、ピアによって効率的なネットワーク転送のためにオンザフライでパックが作成されるときに、スマートプルコマンドによって実行されます。

オプション

base-name

<base-name> を使用して作成されたファイルの名前を決定し、ファイルのペア (.pack と .idx) に書き込みます。このオプションを使用する場合、ペア内の2つのファイルは <base-name>-<SHA-1>.{pack,idx} ファイルに書き込まれます。<SHA-1> はパックの内容に基づいたハッシュであり、コマンドの標準出力に書き込まれます。

--stdout

(.pack ファイルに書き込まれるはずだった) パックの内容を標準出力に書き込みます。

--revs

個々のオブジェクト名ではなく、標準入力からリビジョン引数を読み取ります。リビジョン引数は、--objects フラグ付きの git rev-list と同じ方法で処理され、その commit 引数を使用して出力するオブジェクトのリストを構築します。結果のリスト上のオブジェクトはパックされます。リビジョン以外にも、--not または --shallow <SHA-1> 行も受け付けられます。

--unpacked

これは --revs を意味します。標準入力から読み取られたリビジョン引数のリストを処理する際、パックされていないオブジェクトにパックされるオブジェクトを制限します。

--all

これは --revs を意味します。標準入力から読み取られたリビジョン引数のリストに加えて、refs/ 以下のすべての ref が含まれるように指定されているとみなします。

--include-tag

参照するオブジェクトが結果のパックファイルに含まれている場合、要求されていない注釈付きタグを含めます。これは、ネイティブのGitクライアントに新しいタグを送信するのに役立ちます。

--stdin-packs

パックファイルのベース名 (例: pack-1234abcd.pack) をオブジェクト名またはリビジョン引数ではなく、標準入力から読み取ります。結果のパックには、含まれるパックにリストされているすべてのオブジェクト (^ で始まらないもの) が含まれ、除外されたパック (^ で始まるもの) にリストされているオブジェクトは除外されます。

--revs、または --revs を意味するオプション (--all など) とは互換性がありません。ただし、--unpacked は互換性があります。

--cruft

到達不能なオブジェクトを、.mtimes ファイルの存在によって示される個別の「cruft」パックにパックします。通常、git repack --cruft によって使用されます。呼び出し元はパック名のリストを提供し、どのパックがリポジトリに残るか、どのパックが削除されるか (- プレフィックスで示される) を示します。cruft パックの内容は、存続するパックに含まれていないオブジェクトであり、猶予期間 (以下の --cruft-expiration を参照) を超えていないか、猶予期間を超えているが、猶予期間を超えていない他のオブジェクトから到達可能なオブジェクトです。

入力で到達可能なすべてのオブジェクトを含むパックをリストし (他のすべてのパックを削除待ちとしてリストし)、対応する cruft パックには到達不能なすべてのオブジェクト (mtime が --cruft-expiration より新しいもの) と、mtime が --cruft-expiration より古い到達不能なオブジェクトが含まれますが、mtime が --cruft-expiration より新しい到達不能なオブジェクトから到達可能です。

--unpack-unreachable--keep-unreachable--pack-loose-unreachable--stdin-packs、および --revs を意味するその他のオプションとは互換性がありません。

--cruft-expiration=<approxidate>

指定されている場合、オブジェクトは、<approxidate> より古い mtime を持っている場合、cruft パックから削除されます。指定されていない場合 (--cruft が指定されている場合)、オブジェクトは削除されません。

--window=<n>
--depth=<n>

これらの2つのオプションは、パックに含まれるオブジェクトがデルタ圧縮を使用してどのように格納されるかに影響します。オブジェクトは最初に内部的にタイプ、サイズ、およびオプションで名前によってソートされ、--window 内の他のオブジェクトと比較して、デルタ圧縮を使用することでスペースを節約できるかどうかを確認します。--depth は最大デルタ深度を制限します。深すぎる場合、アンパッカー側の性能に影響します。必要なオブジェクトを取得するには、デルタデータをその回数だけ適用する必要があるためです。

--window のデフォルト値は 10、--depth のデフォルト値は 50 です。最大深度は 4095 です。

--window-memory=<n>

このオプションは、--window に追加の制限を提供します。ウィンドウサイズは、メモリで <n> バイトを超えないように動的に縮小されます。これは、大きくても小さくてもオブジェクトが混在するリポジトリで、大きなウィンドウでメモリを使い果たさないようにしながら、小さなオブジェクトに対して大きなウィンドウを利用できるようにするために役立ちます。サイズは "k"、"m"、または "g" をサフィックスとして付けることができます。--window-memory=0 はメモリ使用量を無制限にします。デフォルトは、pack.windowMemory 設定変数から取得されます。

--max-pack-size=<n>

まれなシナリオでは、ファイルシステムで特定のサイズより大きなファイルを作成できない場合があり、このオプションを使用して、コマンドに、指定されたサイズを超えない複数の独立したパックファイルに出力パックファイルを分割するように指示できます。サイズは "k"、"m"、または "g" をサフィックスとして付けることができます。許可される最小サイズは 1 MiB に制限されています。デフォルトは無制限ですが、設定変数 pack.packSizeLimit が設定されている場合は除きます。このオプションは、リポジトリを大きくし、遅くする可能性があります。pack.packSizeLimit の説明を参照してください。

--honor-pack-keep

このフラグにより、.keep ファイルを持つローカルパックに既に存在するオブジェクトは、それ以外の場合にパックされる場合でも、無視されます。

--keep-pack=<pack-name>

このフラグにより、指定されたパックに既に存在するオブジェクトは、それ以外の場合にパックされる場合でも、無視されます。<pack-name> は、先頭ディレクトリのないパックファイル名です (例: pack-123.pack)。複数のパックを保持するために、このオプションを複数回指定できます。

--incremental

このフラグにより、パックに既に存在するオブジェクトは、それ以外の場合にパックされる場合でも、無視されます。

--local

このフラグにより、代替オブジェクトストアから借用されたオブジェクトは、それ以外の場合にパックされる場合でも、無視されます。

--non-empty

少なくとも1つのオブジェクトが含まれる場合にのみ、圧縮アーカイブを作成します。

--progress

-q が指定されていない限り、標準エラーストリームにターミナルに接続されている場合、デフォルトで進捗状況が報告されます。このフラグは、標準エラーストリームがターミナルに送信されていない場合でも、進捗状況を強制的に表示します。

--all-progress

--stdout オプションが指定されている場合、オブジェクトの計数フェーズと圧縮フェーズ中に進捗状況が表示されますが、書き出しフェーズ中は抑制されます。これは、出力ストリームが別のコマンドに直接リンクされており、そのコマンドが受信したパックデータの処理中に独自の進捗状況を表示する場合があるためです。このフラグは--progressに似ていますが、--stdoutが使用されている場合でも、書き出しフェーズの進捗状況レポートを強制します。

--all-progress-implied

進捗表示が有効になった場合に--all-progressを暗示的に使用するものです。--all-progressとは異なり、このフラグ自体は進捗表示を強制しません。

-q

このフラグは、コマンドが標準エラーストリームにその進捗状況を報告しないようにします。

--no-reuse-delta

既存のパックを持つリポジトリにパックアーカイブを作成する場合、コマンドは既存のデルタを再利用します。これにより、最適化されていないパックが作成される場合があります。このフラグは、コマンドに既存のデルタを再利用せず、ゼロから計算するように指示します。

--no-reuse-object

このフラグは、デルタ化されていないオブジェクトを含む、既存のオブジェクトデータを一切再利用せず、すべてを再圧縮することをコマンドに指示します。これは--no-reuse-deltaを暗示します。パックデータに異なる圧縮レベルを一律に適用する必要がある特殊な場合にのみ役立ちます。

--compression=<n>

生成されたパック内の新規に圧縮されたデータの圧縮レベルを指定します。指定しない場合、パックの圧縮レベルはまずpack.compression、次にcore.compressionによって決定され、どちらも設定されていない場合はzlibのデフォルトである-1になります。ソースに関係なくすべてのデータに一律の圧縮レベルを強制する場合は、--no-reuse-objectを追加してください。

--[no-]sparse

--revsオプションと組み合わせて、パックに含めるオブジェクトを決定するための「sparse」アルゴリズムを切り替えます。このアルゴリズムは、新しいオブジェクトを導入するパスに表示されるツリーのみを走査します。これは、小さな変更を送信するためのパックを計算する場合に、パフォーマンスを大幅に向上させる可能性があります。ただし、含まれるコミットに特定の種類の直接的な名前変更が含まれている場合、パックファイルに追加のオブジェクトが追加される可能性があります。このオプションが含まれていない場合、デフォルトでpack.useSparseの値(特に指定がない限りtrue)になります。

--thin

送信者と受信者の共通オブジェクトを省略することで、「thin」パックを作成し、ネットワーク転送を削減します。このオプションは、--stdoutと組み合わせて使用する場合にのみ意味があります。

注:シンパックは、必要なオブジェクトを省略するため、パックアーカイブ形式に違反しており、そのままではGitでは使用できません。自己完結型のプロパティを復元するには、git index-pack --fix-thingit-index-pack[1]を参照)を使用してください。

--shallow

浅いリポジトリを持つクライアントに提供されるパックを最適化します。このオプションと--thinを組み合わせると、速度を犠牲にしてパックのサイズを小さくできます。

--delta-base-offset

パックアーカイブでは、デルタのベースオブジェクトを20バイトのオブジェクト名またはストリーム内のオフセットとして表現できますが、古いバージョンのGitは後者を理解しません。デフォルトでは、git pack-objectsは互換性のために前者の形式のみを使用します。このオプションを使用すると、コマンドはコンパクトにするために後者の形式を使用できます。平均デルタチェーンの長さによっては、このオプションにより、結果のパックファイルが通常3〜5%縮小されます。

注:git gcgit-gc[1]を参照)、git repackgit-repack[1]を参照)などのポーセリンコマンドは、オブジェクトをリポジトリのパックファイルに入れる場合、最新のGitではデフォルトでこのオプションを渡します。git bundlegit-bundle[1]を参照)もバンドルを作成する場合にこのオプションを渡します。

--threads=<n>

最適なデルタマッチを検索する際に生成するスレッド数を指定します。これには、pack-objectsがpthreadsでコンパイルされている必要があります。そうでない場合、このオプションは警告と共に無視されます。これは、マルチプロセッサマシンでのパッキング時間を短縮することを目的としています。ただし、デルタ検索ウィンドウに必要なメモリ量は、スレッド数に応じて乗算されます。0を指定すると、GitはCPU数を自動検出し、スレッド数をそれに応じて設定します。

--index-version=<version>[,<offset>]

これはテストスイートでのみ使用することを目的としています。これにより、生成されたパックインデックスのバージョンを強制し、指定されたオフセットより上のオブジェクトに64ビットインデックスエントリを強制できます。

--keep-true-parents

このオプションを使用すると、グラフトによって非表示になっている親もパックされます。

--filter=<filter-spec>

結果のパックファイルから特定のオブジェクト(通常はBLOB)を省略します。有効な<filter-spec>形式については、git-rev-list[1]を参照してください。

--no-filter

以前の--filter=引数を無効にします。

--missing=<missing-action>

今後の「部分クローン」開発に役立つデバッグオプションです。このオプションは、見つからないオブジェクトの処理方法を指定します。

--missing=error形式は、見つからないオブジェクトが見つかった場合にpack-objectsがエラーで停止するように要求します。リポジトリが部分クローンである場合、見つからないオブジェクトとして宣言する前に、見つからないオブジェクトのフェッチが試みられます。これがデフォルトのアクションです。

--missing=allow-any形式は、見つからないオブジェクトが見つかった場合でもオブジェクトのトラバーサルを続行できるようにします。見つからないオブジェクトのフェッチは行われません。見つからないオブジェクトは、結果からサイレントに省略されます。

--missing=allow-promisor形式はallow-anyに似ていますが、予期されるpromisorが見つからないオブジェクトに対してのみオブジェクトのトラバーサルを続行できます。見つからないオブジェクトのフェッチは行われません。予期しない見つからないオブジェクトはエラーを発生させます。

--exclude-promisor-objects

promisorリモートにあることがわかっているオブジェクトを省略します。(このオプションの目的は、ローカルに作成されたオブジェクトのみを操作することです。そのため、再パックするときに、ローカルに作成されたオブジェクト[promisorなし]とpromisorリモートからのオブジェクト[promisorあり]の区別を維持できます。)これは部分クローンで使用されます。

--keep-unreachable

--unpacked=オプションで名前が付けられたパック内のrefsから到達できないオブジェクトは、*.keepファイルでマークされたパックにない到達可能なオブジェクトに加えて、結果のパックに追加されます。これは--revsを暗示します。

--pack-loose-unreachable

到達不可能なルーズオブジェクトをパックします(そして、そのルーズな対応物は削除されます)。これは--revsを暗示します。

--unpack-unreachable

到達不可能なオブジェクトをルーズ形式で保持します。これは--revsを暗示します。

--delta-islands

「島」に基づいてデルタマッチを制限します。以下のDELTA ISLANDSを参照してください。

DELTA ISLANDS

可能であれば、pack-objectsは既存のオンディスクデルタを再利用して、新しいデルタをその場で検索する必要性を回避しようとします。これは、フェッチを提供するための重要な最適化です。サーバーはほとんどのオブジェクトをまったく展開する必要がなくなり、ディスクから直接バイトを送信できるためです。受信者が持っていない(そして、すでに送信していない)ベースに対してオブジェクトがデルタとして格納されている場合、この最適化は機能しません。その場合、サーバーはデルタを「破棄」し、新しいデルタを見つける必要があります。これはCPUコストが高くなります。したがって、パフォーマンスのために、オンディスクデルタ関係にあるオブジェクトのセットが、クライアントがフェッチするオブジェクトのセットと一致することが重要です。

通常のレポジトリでは、これは自動的に機能する傾向があります。オブジェクトは主にブランチとタグから到達可能であり、クライアントがフェッチするものです。サーバーで見つかるデルタは、クライアントが持っているか、持つ可能性のあるオブジェクト間のデルタである可能性が高いです。

しかし、一部のリポジトリ設定では、いくつかの関連するが独立したrefの先端のグループがあり、クライアントはそれらのグループを個別にフェッチする傾向があります。たとえば、単一の共有オブジェクトストアにリポジトリのいくつかの「フォーク」をホストし、クライアントがGIT_NAMESPACEまたは代替メカニズムを使用する個別のリポジトリとしてそれらを表示できるようにしているとします。ナイーブな再パックでは、オブジェクトの最適なデルタが別のフォークにのみ見つかるベースに対するものであることがわかります。しかし、クライアントがフェッチすると、ベースオブジェクトを持たないため、その場で新しいデルタを見つける必要があります。

同様の状況は、refs/heads/およびrefs/tags/の外側に、関連するオブジェクトを指す多くのrefs(たとえば、一部のホスティングプロバイダーで使用されるrefs/pullまたはrefs/changes)がある場合に存在する可能性があります。デフォルトでは、クライアントはヘッドとタグのみをフェッチし、それらの他のグループにのみ見つかるオブジェクトに対するデルタはそのまま送信できません。

デルタアイランドは、refsを個別の「アイランド」にグループ化することでこの問題を解決します。Pack-objectsは、どのオブジェクトがどのアイランドから到達可能かを計算し、オブジェクトAからAのすべてのアイランドに存在しないベースに対するデルタを作成することを拒否します。これにより、パックのサイズがわずかに大きくなります(デルタの機会を逃すため)が、1つのアイランドのフェッチで、アイランドの境界を超えるためにその場でデルタを再計算する必要がないことが保証されます。

デルタアイランドで再パックすると、デルタウィンドウは、設定によって禁止されている候補で詰まる傾向があります。大きな--windowで再パックすると役立ちます(オブジェクトペアを計算する前に、アイランドに基づいてオブジェクトペアを拒否できるため、それ以外の場合は時間がかかりません)。

アイランドは、複数回指定できるpack.islandオプションを使用して設定されます。各値は、ref名を照合する左アンカー付き正規表現です。たとえば

[pack]
island = refs/heads/
island = refs/tags/

ヘッドとタグをアイランド(名前は空文字列です。名前付けの詳細については後述)に入れます。これらの正規表現に一致しないリファレンス(例:refs/pull/123)は、どのアイランドにも属しません。したがって、refs/pull/からのみ到達可能(ヘッドまたはタグからは到達不可)なオブジェクトは、refs/heads/のベースとして使用される候補にはなりません。

リファレンスはそれらの「名前」に基づいてアイランドにグループ化され、同じ名前を生成する2つの正規表現は同じアイランドにあるとみなされます。名前は、正規表現からキャプチャグループを連結することで計算され、間にハイフン(-)が入ります。(キャプチャグループがない場合は、上記の例のように名前は空文字列になります。)これにより、任意の数のアイランドを作成できます。ただし、サポートされるキャプチャグループは最大14個までです。

たとえば、各フォークのリファレンスをrefs/virtual/IDに格納し、IDは数値識別子であるとします。その場合、次のように設定できます。

[pack]
island = refs/virtual/([0-9]+)/heads/
island = refs/virtual/([0-9]+)/tags/
island = refs/virtual/([0-9]+)/(pull)/

これにより、各フォークのヘッドとタグがそれぞれ独自のアイランド(「1234」など)に配置され、各フォークのプルリファレンスは独自の「1234-pull」に入ります。

各正規表現について、単一のアイランドを選択することに注意してください。「最後に適用されたものが優先」という順序を使用します(これにより、レポジトリ固有の設定がユーザー全体の構成よりも優先されるなど)。

設定

さまざまな設定変数がパッキングに影響します。git-config[1](「pack」と「delta」を検索)を参照してください。

特に、デルタ圧縮は、core.bigFileThreshold設定変数よりも大きいオブジェクトと、属性deltaがfalseに設定されているファイルには使用されません。

Git

git[1]スイートの一部

scroll-to-top