Git Repository Format Versions

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

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

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

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

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

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

(リポジトリー全体または単一のファイルに対する)バージョンの更新を展開する際の推奨戦略は、 Git に新しいフォーマットを読み取る機能を教え、 設定スイッチまたはコマンドライン・オプションを使用して新しいフォーマットを書き込むことを許可することです(実験用、 または古い Git との後方互換性を気にしないユーザーのために)。 その後、 新しいフォーマットを読み込む機能が一般的になるまで十分な期間を設けた後で、 デフォルトで新しいフォーマットを書き込むように切り替えることができます。

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

Version 0

これは、 Git の初期バージョンで定義されたフォーマットで、 リポジトリー・ディレクトリや、 リポジトリー設定ファイルや、 オブジェクトと参照ストレージのフォーマットを含みますが、 これに限定されません。 しかし、 Git の振る舞いを余すところなく記述することは、 このドキュメントの役割ではありません(Specifying the complete behavior of git is beyond the scope of this document).

Version 1

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

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

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

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

定義済みの拡張機能(extensions)は、 git-config(1)extensions.* セクションに記載されています。 新しい拡張機能を定義したい実装は、 その名前を宣言するために、 そこにその旨を記載する必要があります。