13

Gitがファイルをリポジトリに保存する方法に関するドキュメントはありますか?インターネットで検索しようとしていますが、使用できる結果がありません。間違ったクエリを使用しているのかもしれませんし、これは大きな秘密かもしれません— Gitリポジトリの内部形式ですか?

このロケット科学情報が必要な理由を説明しましょう。C#を使用してファイル履歴フォームリポジトリを取得しています。しかし、libgit2sharpライブラリでは現在実装されていません。ですから(責任者として;)私はこの機能を自分で実装し、コミュニティに貢献する必要があります。

しかし、カーネルソースをgithubに移動した後、どこから検索を開始するのかさえわかりません。

よろしくお願いします!

4

1 に答える 1

42

リポジトリの内部形式は非常に単純です。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上のさまざまなコミットを指している参照を使用して管理されているため、それらを操作できます。

参考文献

于 2011-11-25T09:34:56.903 に答える