ホームページ  >  記事  >  ウェブフロントエンド  >  Mini-git、ファイルが Git オブジェクトにどのように保存されるかを理解する

Mini-git、ファイルが Git オブジェクトにどのように保存されるかを理解する

WBOY
WBOYオリジナル
2024-08-22 18:45:03264ブラウズ

Mini-git, Understanding How Files Are Stored in Git Objects

昨日、私は Git の中核機能の 1 つ、具体的にはファイルの保存方法、Git オブジェクトとは何か、ハッシュと圧縮のプロセスを自分で実装することにしました。開発には 4 時間かかりました。この記事では、私の思考プロセスとアプローチについて説明します。

ファイルをコミットするとどうなりますか?

Git でファイルをコミットすると、内部でいくつかの重要な手順が実行されます。

ファイル圧縮:

ファイルのコンテンツは、サイズを減らすために zlib アルゴリズムを使用して圧縮されます。この圧縮されたコンテンツは、Git オブジェクト データベースに保存されます。

ハッシュ計算:

圧縮ファイルの内容から一意の SHA-1 ハッシュが生成されます。このハッシュは、Git オブジェクト データベース内のファイルの識別子として機能します。

オブジェクトの保存:

オブジェクト ファイルは、ハッシュの最初の 2 文字で編成されて .mygit/objects ディレクトリに保存されます。この構造により、オブジェクトの管理と効率的な取得が容易になります。
コミット情報を更新しています:

ファイルが git にどのように保存されるかを説明します。
1つのファイルを考慮してコミット機能を実装しました

  1. すべてのファイルについて、ハッシュを計算しました
  2. オブジェクトフォルダー内に、ハッシュの最初の 2 文字に等しい名前で新しいフォルダーが作成されます。
  3. そして、残りのハッシュを名前としてそのフォルダー内にファイルが作成されます。(このファイルにはコミットされたファイルの圧縮形式が保存されます)
  4. 新しく計算されたファイルのハッシュと最後に計算されたファイルのハッシュを比較することで変更を検出しました

変化の検出

このアルゴリズムは独自のアプローチに基づいて実装しましたが、Git はこれらの操作により効率的なアルゴリズムを使用します。

  1. oldContent と newContent から抽出された行の配列
  2. 行をキーとして、インデックスを値として保存するマップを作成しました
  3. oldContent と newContent に共通行のインデックスを格納する 2 つの新しい配列を作成しました 4.例: OldCommonarray = [0 , 3] の場合、削除された行は [1,2]
  4. になります。

GitHub リポジトリ
リンクトイン

お時間をいただきまして誠にありがとうございます。

以上がMini-git、ファイルが Git オブジェクトにどのように保存されるかを理解するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。