私はgitについて学んでいますが、用語にかなり混乱しています。
「ツリーオブジェクト」が実際には「フォルダオブジェクト」のようなものであることを正しく理解していますか?内部にあるもの(ブロブ)や他のツリー(サブフォルダー)の情報を保持します。それは私たちが取り組んでいるプロジェクトの「実際のデータ」に関する情報を保持します。
同時に、コミット/バージョンの構造にはツリーのような構造があり(実際には、マージを伴う有向非巡回グラフですが、これは単なる詳細です)、このツリーのリーフへのパスはブランチと呼ばれる可能性があります。ただし、gitの「ブランチ」は、実際にはコミットへのポインタにすぎません。
私はこの権利を理解していますか?「バージョンツリー構造」の既存のツリー構造を考えると、それは私だけですか、それとも「ツリーオブジェクト」はかなり誤解を招く名前ですか?ツリーという単語を使用したい場合でも、「ツリーノードオブジェクト」などと呼ぶ方が理にかなっています。gitのツリーオブジェクトにはツリー全体が含まれていないようで、一部のBLOBと他のBLOBへのポインタだけが含まれているようです。木。同様の理由で、名前のブランチも誤解を招くようです。
単語の使用に関するユーザー向けドキュメントの主張を除きツリーっぽいの(つまり場合でも、ある単語)、用語のツリーが、彼らはそれを呼び出すかは重要ではないはずですので、Gitの内部にあり:木、またはmarplot、またはgripsack、またはあなたが好きなものは何でも。
とはいえ、Git内のツリーオブジェクトは、4つのオブジェクトタイプの1つにすぎません。含まれているのは一連のエントリで、各エントリには3つのアイテムが含まれています。
x
通常のファイルのビットを提供します。'\0'
C、b'\0'
Python)で終了するバイトシーケンス。そしてツリーオブジェクトの名前は、実際には単なる名前コンポーネントです。モードエントリがの40000
場合、ハッシュIDは別のツリーオブジェクトのハッシュIDである必要があります。モードがある場合120000
、100644
または100755
、ハッシュIDはブロブオブジェクトのことでなければなりません。モードがの160000
場合、ハッシュIDは、他のGitリポジトリ(gitlinkなど)に格納されているコミットオブジェクトであることが期待されます。他のモードは通常許可されていませんが、このモードは既存の(非常に古い)リポジトリに表示されるためgit fsck
許可さ100664
れます。
ブロブまたは(モード120000
)シンボリックリンクのファイル名は、ブロブにつながったツリーオブジェクトの名前コンポーネントをスラッシュでつなぎ合わせ、最後のコンポーネントを最後のツリーオブジェクトに追加することで作成されます。つまり、あるコミットの最上位ツリーオブジェクトがT 0であり、blobまたはシンボリックリンクがT 0に直接表示される場合、エントリはblobまたはシンボリックリンクを保持するファイルの名前を示します。
Tなら0がエントリー持っfoo
モードと40000
し、ハッシュT 1を、GitはTツリーオブジェクトを読み取るために行きます1。場合それはエントリーがあるbar
モードでの100xxx
か120000
、Blobオブジェクトは、その名前のファイルやシンボリックリンクになりますfoo/bar
。したがって、ファイルのパス名は、リーフに到達するまでツリーオブジェクトをトラバースすることによって生成されます。
gitlink(モードのツリーエンティティ160000
)の場合、構築されたパス名は、サブモジュールの.gitmodules
クローンを作成する必要がある場合に、Gitがチェックインするサブモジュールパスを示します。ハッシュIDは、git checkout
他のGitでデタッチされたHEADとして実行するコミットです。リポジトリ。他のすべてのエンティティの場合、ハッシュIDはこのGitリポジトリ内のオブジェクトのハッシュIDである必要があります。そうでない場合、ツリーオブジェクトが正しくないか、リポジトリに一貫性がありません(またはその両方)。
Gitを使用している人は、これについて気にする必要はありませんgit write-tree
。通常どおりファイルをインデックスに入れて、すべてを書き込むために使用します。使用git read-tree
インデックス埋めるために、コミット中にハッシュIDでツリーをつかむために2をそのツリーから。使用git show
またはgit cat-file
(ハッシュID(ブロブハッシュ)またはパス名のいずれか使用して、単一のファイルの内容を取得するために、翻訳することができ、そして今、長い時間のために、同様に扱うことができますが)。commit-hash:path
git rev-parse
git cat-file
1これは一種の間違いです。Gitが将来より長いハッシュIDを使用するようになると、ツリーオブジェクトに切り捨てられたハッシュを格納する必要があるか、新しいフレーバーのツリーオブジェクトが必要になる可能性があるためです。Mercurialの内部ツリーデータ構造には、より多くの余地が残されていることに注意してください。Gitは、おそらく別のNULで終了するASCII化された16進ダイジェストを使用する必要がありました。しかし、ここには他にも厄介な問題が十分にあるため、これはマイナーな問題です。
2あなたが設定されている場合はGIT_INDEX_FILE
、git read-tree
そのパス名を指定した別のインデックスにツリーを読み込みます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加