リポジトリの内部形式は非常に単純です。Gitは本質的に、コンテンツをアドレス指定可能なユーザースペースファイルシステムです。
これがサムネイルスケッチです。
オブジェクト
Gitは、内部データ構造をオブジェクトとして保存します。オブジェクトには、blob(ファイルのようなもの)、trees(ディレクトリのようなもの)、commit(特定の時点でのファイルシステムのスナップショットと、そこに到達する方法に関する情報)、およびタグ(commitへのポインター)の4種類があります。重要なものをマークするのに便利です)。
.git
リポジトリのディレクトリ内を見るobjects
と、SHA-1ハッシュによって名前が付けられたファイルを含むディレクトリが見つかります。それぞれがオブジェクトを表します。配管git cat-file
コマンドを使用してそれらを検査できます。リポジトリの1つからのコミットオブジェクトの例
noufal@sanitarium% git cat-file -p 7347addd901afc7d237a3e9c9512c9b0d05c6cf7
tree c45d8922787a3f801c0253b1644ef6933d79fd4a
parent 4ee56fbe52912d3b21b3577b4a82849045e9ff3f
author Noufal Ibrahim <noufal@..> 1322165467 +0530
committer Noufal Ibrahim <noufal@..> 1322165467 +0530
Added a .md extension to README
でオブジェクト自体を確認することもできます.git/objects/73/47addd901afc7d237a3e9c9512c9b0d05c6cf7
。
このような他のオブジェクトを調べることができます。各コミットは、その時点でのファイルシステムを表すツリーを指し、1つ(マージコミットの場合は複数)の親を持ちます。
オブジェクトは、ディレクトリに単一のファイルとして保存されますobjects
。これらはルーズオブジェクトと呼ばれます。を実行するgit gc
と、到達できなくなったオブジェクトがプルーニングされ、残りは1つのファイルにまとめられてデルタ圧縮されます。これにより、スペース効率が向上し、リポジトリがコンパクトになります。gcを実行した後、.git/objects/pack/
ディレクトリを調べてgitpackfilesを確認できます。それらを解凍するには、plumbingコマンドコマンドを使用できますgit unpack-objects
。この.git/objects/info/packs
ファイルには、現在存在するパックファイルのリストが含まれています。
参考文献
次に知っておく必要があるのは、参照とは何かです。これらは、特定のコミットまたはオブジェクトへのポインターです。あなたのブランチや他のそのようなものは参照として実装されます。「実際の」(ファイルシステムのハードリンクのような)と「シンボリック」(実際の参照へのポインタである-シンボリックリンクのような)の2種類があります。
これらは.git/refs
ディレクトリにあります。たとえば、上記のリポジトリでは、私はmaster
ブランチにいます。私の最新のコミットは
noufal@sanitarium% git log -1
commit 7347addd901afc7d237a3e9c9512c9b0d05c6cf7
Author: Noufal Ibrahim <noufal@...>
Date: Fri Nov 25 01:41:07 2011 +0530
Added a .md extension to README
私のmaster
参照.git/refs/heads/master
がこのコミットを指していることがわかります。
noufal@sanitarium% more .git/refs/heads/master
7347addd901afc7d237a3e9c9512c9b0d05c6cf7
現在のブランチは、にあるシンボリック参照に格納されHEAD
ます.git/HEAD
。ここにあります
noufal@sanitarium% more .git/HEAD
ref: refs/heads/master
ブランチを切り替えると変更されます。
同様に、タグもこのような参照です(ただし、ブランチとは異なり、タグは移動できません)。
リポジトリ全体は、コミットのDAG(それぞれが特定の時点のファイルを表すツリーを指している)と、DAG上のさまざまなコミットを指している参照を使用して管理されているため、それらを操作できます。
参考文献