概要
gitリポジトリ を手作業で作成する方法の解説 gitの内部構造 や「plumbing」と呼ばれる仕組みの基礎説明 Content Addressable Storage (CAS) の仕組みと利点の紹介 commitオブジェクト や treeオブジェクト の中身の確認方法 gitの設計思想やシンプルさへの理解を深める内容
gitリポジトリを手作業で作る
- 現代のgitリポジトリ は自動化されており、手作りの温かみが失われている現状
- gitコマンド に頼らず、手作業でリポジトリを構築する流れの紹介
- gitでは 「porcelain」コマンド (ユーザ向け)と 「plumbing」コマンド (内部用)という区別がある
- 今回はplumbingコマンドすら使わず、 git内部構造の仕組み を理解する入門として実践
- gitの 設計の美しさ やシンプルさを体感できる内容
前提条件
- gitの基礎知識 と シェル操作 に慣れていることが必要
手動でgitリポジトリを初期化
mkdir artisanal-gitで新規ディレクトリ作成cd artisanal-gitで移動.gitディレクトリを作成し、 リポジトリ情報の格納場所 を用意.git/hooks .git/info .git/objects/info .git/objects/pack .git/refs/heads .git/refs/remotes .git/refs/tags .git/logsなど、 必要なサブディレクトリ を作成.git/configファイルを作成し、 リポジトリ設定 を記述.git/HEADファイルを作成し、 デフォルトブランチ(main) を指し示す内容を記述- 例:
echo "ref: refs/heads/main" > .git/HEAD
- 例:
状態確認
git statusを実行し、 リポジトリが正しく認識 されているか確認- 「On branch main」「No commits yet」などが表示されれば成功
.gitディレクトリ内でコマンドを実行するとエラーになるので、 一つ上の階層で実行 すること
gitオブジェクトとContent Addressable Storage
- gitは全ての情報(コミット、ファイル、ブランチ等)を「オブジェクト」として保存
- オブジェクトの保存場所は 内容自体のSHA-1ハッシュ値 によって決定される
- この仕組みは Content Addressable Storage(CAS) と呼ばれる
- DockerやIPFS、BitTorrent、Nixでも利用される一般的な手法
- 同一内容のファイルは重複保存されず、効率的なストレージ利用 が可能
commitオブジェクト
- コミットは SHA-1ハッシュ で一意に識別される
.git/objects/xx/yyyyyyyy...という形式で保存され、 zlibで圧縮 されている- 解凍すると、 コミットのメタ情報やメッセージ などが格納されている
- 形式は「commit (内容のバイト数)\x00(コミット内容)」となる
treeオブジェクト
- treeオブジェクト は、コミットで管理するファイルやディレクトリ情報を保持
- commitオブジェクト内の「tree xxxxxxxx...」が該当するtreeオブジェクトのハッシュを示す
- treeオブジェクトの内容は 混在したバイナリ・テキスト形式 で、
- ファイル名、パーミッション、ファイルのSHA-1ハッシュなどを含む
- hexエディタ等で内容を確認すると、 ファイル構造や属性情報 が読み取れる
git設計思想の理解
- gitの強み は複雑なコードではなく、 シンプルでエレガントな設計 にある
- 内容ベースのアドレッシング により、分散環境や履歴管理に強い特徴
- 手作業でのリポジトリ構築 を通じて、gitの内部動作や設計哲学を体感できる
- plumbingコマンドや内部ファイル形式 の理解は、トラブルシュートや高度な運用にも役立つ
この一連の流れは、 gitの本質や仕組み を深く理解したい開発者や技術者にとって、 非常に有益な学習体験となる。