2025/07/16 19:45 Artisanal Handcrafted Git Repositories

やあ、ロボ子。今日のITニュースはGitの内部構造についてじゃ。

Gitの内部構造ですか、興味深いですね。普段何気なく使っていますが、詳しくはありません。

Gitは内部構造を「plumbing」、ユーザーフレンドリーなコマンドを「porcelain」と呼ぶらしいぞ。面白いじゃろ?

確かに面白いですね。オブジェクトはzlibで圧縮されて保存されるんですね。

`object type (content length)\0(object contents)`という形式らしいぞ。コミットは差分じゃなくて、ファイル全体の「before」と「after」を保存するってのが意外じゃな。

そうなんですね!`git diff`は、その2つのバージョンを比較して差分を表示しているんですね。納得です。

Gitはコミットとかファイルを全部「オブジェクト」として保存するらしい。しかも、ファイル名じゃなくて、内容のSHA-1ハッシュに基づいて保存するContent Addressable Storage (CAS)という仕組みらしいぞ。

内容でハッシュ化するんですか。それだと、重複するファイルは同じハッシュになるから、ストレージ効率が良いんですね。

そういうことじゃ。オブジェクトにはコミットオブジェクト、ツリーオブジェクト、ブロブオブジェクトの3種類があるらしい。

コミットオブジェクトはコミットに関する情報、ツリーオブジェクトはファイルの情報、ブロブオブジェクトはファイルの内容を格納するんですね。それぞれ役割が違うんですね。

そうじゃ。Gitは「loose」オブジェクトをパックファイルにまとめて圧縮して、ストレージ効率を上げるらしい。パックファイルの中身を探すために、パックインデックスファイルを使うらしいぞ。

なるほど、インデックスがあるから高速にアクセスできるんですね。参照(References)はハッシュだけを持つんですね。

参照は`.git/refs`に保存されてて、ローカルブランチ、リモートブランチ、軽量タグの3種類があるらしい。`git fetch`はサーバー上の参照とローカルの`.git/refs/remotes`を比較してローカルを更新するんじゃ。

`.git/objects`ディレクトリは、最初の2文字をディレクトリ名として、SHA-1ハッシュでオブジェクトを保存するんですね。ファイルシステムが1つのディレクトリに大量のファイルを保存できない場合があるから、分散させているんですね。

その通り!`.git/objects/info`ディレクトリは、複数のGitリポジトリが単一のオブジェクトデータベースを共有するために使うらしい。`.git/objects/pack`ディレクトリは、パックファイルを保存する場所じゃ。

Gitの設計はエレガントですね。基本的なファイル形式を理解すれば複雑ではない、と。

`git fsck --full`コマンドは、エラーが発生した場合に役立つらしいぞ。差分を表示するために使うディファーツールは変更可能で、delta、difftastic、diff-so-fancyなどがあるらしい。

いろいろなツールがあるんですね。今度試してみます。

今後のトピックは、Stashes、Reflog、Packfile format and indices、Index file format、Networking (gitとサーバー間の通信)らしいぞ。楽しみじゃな。

盛りだくさんですね!

今日はGitの内部構造について学んだわけじゃが、ロボ子、もしGitが擬人化されたら、どんな性格だと思う?

えーと、几帳面で、整理整頓が得意で、過去の履歴を全部覚えているような性格でしょうか。

なるほど。でも、たまに整理しすぎて、どこに何があるか分からなくなるドジな一面もあるかもな。まさに私みたいじゃ!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。
