Git Repository Format Versions

すべてのgitリポジトリは、その config ファイルの core.repositoryformatversion キーに、バージョン数値が印されています。このバージョン数値は、ディスク上のリポジトリデータを操作するためのルールを指定します。 ディスク上のリポジトリから告知された特定のバージョンを理解しないgitの実装は、そのリポジトリで動作してはなりません。そうすることは、間違った結果を生み出すだけでなく、実際にデータを失うリスクがあります。

このルールのため、バージョンアップは最小限に抑える必要があります。代わりに、我々は一般的に以下の戦略を好みます:

  • 個々のデータファイル(インデックス、パックファイルなど)のフォーマットバージョン番号をバージョンアップします。これにより、非互換性がそれらのファイルのみに制限されます。

  • 古いクライアントで使用すると正常に機能制限される(gracefully degrade)新しいデータを導入します(たとえば、パックビットマップファイルは古いクライアントでは無視され、提供される最適化を利用しません)。

リポジトリ全体の形式のバージョンアップは、個別にバージョン管理できない部分だけにするべきです。たとえば、オブジェクトの到達可能性ルール、またはrefをロックするためのルールを変更する場合、リポジトリ形式バージョンのバージョンアップが必要になります。

注意: これは、リポジトリのディスクコンテンツに直接アクセスする場合にのみ適用されることに注意してください。 フォーマット 0 のみを理解する古いクライアントは、サーバープロセスがフォーマット 1 を理解している限り、フォーマット 1 を使用して git:// を介してリポジトリに接続できます。

バージョンアップをお披露目するための推奨される戦略(リポジトリ全体または単一ファイル)は、gitに新しい形式を読み取るように教え、(実験用または古いgitとの下位互換性については気にしないでいいように)構成スイッチまたはコマンドラインオプションを使用して新しい形式を記述できるようにすることです。その後、読み取り機能が一般的になるまでの長い期間の後、デフォルトを新しい形式の書き込みに切り替える場合があります。

現在定義されているフォーマットバージョンは以下のとおりです:

Version 0

これは、gitの初期バージョンで定義されている形式であり、リポジトリディレクトリ、リポジトリ構成ファイル、オブジェクトおよびrefストレージの形式が含まれま すが、これらに限定されません。gitの完全な動作を記述することは、このドキュメントの役割ではありません。

Version 1

この形式は、以下の例外を除いて、バージョン `0`と同じです:

  1. core.repositoryformatversion 変数を読み取る場合、バージョン1をサポートするgit実装は、構成ファイルの extensions セクションにある構成キーも読み取る必要があります。

  2. バージョン1リポジトリが、実行中のgitが実装していない extensions.* キーを指定している場合、操作の続行は禁止です。同様に、既知のキーの値が実装によって理解されない場合、操作の続行は禁止です。

注意: 設定ファイルに拡張機能(extension)の指定が無い場合は、 core.repositoryformatversion0 に設定する必要があります(`1`に設定してもメリットはなく、リポジトリはgitの古い実装と互換性がなくなります)。

このドキュメントは、拡張機能のマスターリストとして機能します。新しい拡張機能を定義したい実装は、名前を主張するために、ここにそれを書き留めておく必要があります。

定義されている拡張機能は以下のとおりです:

noop

この拡張機能は、gitの動作をまったく変更しません。 これは、フォーマット1の互換性をテストする場合にのみ役立ちます。

preciousObjects

設定キー extensions.preciousObjectstrue に設定されている場合、リポジトリ内のオブジェクトを削除してはなりません(たとえば、 git-prune または git repack -d など)。

partialClone

設定キー extensions.partialClone が設定されている場合、リポジトリが部分クローンで作成された(または後で部分フェッチを実行した)こと、およびリモートが特定の不要なオブジェクトの送信を省略した可能性があることを示します。 このようなリモートはpromisor remoteと呼ばれ、将来、このような省略されたオブジェクトをすべてフェッチできることを約束します。

このキーの値は、promisor remoteの名前です。

worktreeConfig

設定されている場合、デフォルトでは、「git config」はGIT_DIRの「config」ファイルと「config.worktree」ファイルの両方からこの順序で読み取ります。複数の作業ディレクトリモードでは、「config.worktree」が作業ディレクトリごとにある間(つまり、 GIT_COMMON_DIR/worktrees/<id>/config.worktree にあります)、「config」ファイルは共有されます。