2009-04-23 13 views
1

私はGitの動作を理解しようとしています。GlobはどのようにBLOBに入るのかをどのように決定しますか?

いくつかの任意のファイルとコミットの任意の数が与えられた場合、gitはそれらのファイルをBLOBに分割する方法を決定しますが、SHA-1ハッシュで一意に識別されますか?

私はperl/C/javaコードとテキストを新しいgit repoに約10回コミットしましたが、何とかgitでファイルを小さなセグメントに分割しました。

答えて

7

Gitは、同じ内容が既に存在する場合(blobを再利用する場合を除く)、各ファイルの内容のblobを作成します。しかし、もっとたくさんのことがあります - gitはすべてのディレクトリ、コミット、署名付きのタグに対してもオブジェクトを作成します。リポジトリが(自動的にまたはgit gcを実行することによって)再パックされるまで、すべてのオブジェクトは.git/objectsに格納されます。その場合、いくつかのオブジェクトがまとめられ、パックファイル(.git/objects/pack)にデリゲートされます。

考えているように、1つのファイルの内容を複数のブロブまたは小さなセグメントに分割しません。

+0

OK、最初の部分のおかげで、最後の点で、私は混乱していると思う、GiTKファイルビューアで特定のファイルをブラウズすることですね。新たに組み合わされたファイルの部分が出てきたのは、それが "セグメント"を得た場所、Gitが決定を下し、そのセグメントがどこから来たのか、そして例えば "make"のような繰り返しのある行が、セグメントの繰り返しではなく、それ自身の権利ですか? –

+0

あなたは何を意味するのか分かりません。最後のリビジョンとの違いを示す場合、それは「差分」と呼ばれ、2つのファイルを比較してオンザフライで計算されます。 git guiでの非難的な表示を意味するなら、それはいくつかの賢明な非難アルゴリズムによって行われます。コマンドラインで 'git blame'を参照してください。これはdiffとほぼ同じように動作しますが、リビジョンごとに実行され、他のファイルから削除された行も考慮に入れられます。 – Pieter

+0

OK、ありがとう、私は今、私は他の下位SCMs(SVN/CVS/perforce)から来て混乱して、通常は自動的に異なるディレクトリに異なる名前のファイルに存在していた明示的に行われましたが、私はこの場合Gitで行っていませんでした。 私は今、これらが2つの別個の問題であること、「賢い」diff/blame algoがどのように動作し、どのようにコードがブロブに格納されるのかを理解しています。 私は答えとしてあなたの印をつけています。私たちのために何か他のことが気になるならば、詳細を追加してもよろしいですか?ありがとう –

1

すべてのファイルはブロブに入れられますが、必ずしもGitがblobごとにファイルを保存するというわけではありません(Gitは非常に効率的な圧縮されたフォーマットであり、一緒にまとめることができます)。 Gitのパッキングフォーマットについての内部について興味があれば、リストを尋ねたり、建築文書を読んだ方が良いでしょう。

+0

OK、私はドキュメントを読んでいましたが、私とその次の人の学習プロセスをスピードアップしようとしています。これまでのドキュメントを読むことでこの質問に答えることはできませんでした。リストに尋ねることについての良いアドバイス、何もここに来なければ私はそれをします。 –

+0

これは私が見つけた最高のhttp://eagain.net/articles/git-for-computer-scientists/ですが、それは本当に質問に答えるものではありません。 –

+0

メーリングリストは実際には、この特定の質問に使うべき唯一のリソースです。 (または、あなたはソースコードを読むことができます) – Arafangion

3

基本的な(低レベルの)参照のいくつかをチェックアウトすることをお勧めします。具体的な質問については、Git Community BookのGit Object Modelに関するセクションを参照してください。

その後、Git from the Bottom Up (PDF)またはGitの低レベルのアンダーピン(「コンテンツアドレス可能なファイルシステム」と有向非循環グラフ関係)を理解するために、Git Internals (PDF, US$9)を読むことに興味があるかもしれません。

関連する問題