1. ホーム
  2. ギット

[解決済み】gitはどのようにファイルを保存するのですか?

2022-04-19 23:04:39

質問

私はgitの勉強を始めたばかりで、そのために以下の本を読み始めた。 Git コミュニティブック この本では、SVNとCVSはファイルの差分を保存し、gitは全ファイルのスナップショットを保存すると言っています。

でも、スナップショットの意味がよくわからなかったんです。なぜなら、彼らの説明で理解できたのは、gitは本当に各コミットですべてのファイルのコピーを作成するのか、ということだったからです。

PS: gitを学ぶのにもっと良いソースがあれば、感謝します。

どのように解決するのですか?

ただし、Git リポジトリにすでに存在するコンテンツについては、スナップショットは複製するのではなく、単にそのコンテンツを指すようにします。

それは、同じ内容の複数のファイルが一度だけ保存されることも意味します。

つまり、スナップショットとは基本的にコミットであり、その際に参照されるのが 内容 ディレクトリ構造の

良い参考文献をいくつか紹介します。

<ブロッククオート

git commitコマンドでプロジェクトのスナップショットを保存したいことをGitに伝えると、基本的にその時点でプロジェクト内のすべてのファイルがどのような状態になっているのかをマニフェストとして記録してくれます。

ラボ12 以前のスナップショットを取得する方法を説明します


プロギットブック には、スナップショットについてのより包括的な説明があります。

<ブロッククオート

Gitと他のVCS(Subversionやその仲間も含む)との大きな違いは、Gitがそのデータをどう考えるかということです。

概念的には、他のほとんどのシステムは、情報をファイルベースの変更点のリストとして保存します。これらのシステム (CVS, Subversion, Perforce, Bazaar など) は、保持している情報をファイルの集合と、各ファイルに対して行われた時間の経過に伴う変更として考えています。

Gitはこのようにデータを考えたり保存したりしません。その代わりに、Gitはそのデータを、ミニ・ファイルシステムのスナップショットの集合のように考えています。

コミットするたび、あるいはGitでプロジェクトの状態を保存するたび、基本的にはその時点のすべてのファイルがどのようなものであるかを撮影し、そのスナップショットへの参照を保存するのです。

効率的にするために、ファイルが変更されていない場合、Gitはファイルを再度保存せず、すでに保存した以前の同一のファイルへのリンクだけを保存します。

Gitは、データを次のように考えています。

これは、Gitと他のほとんど全てのVCSとの間の重要な違いです。これは、他のほとんどのシステムが前世代からコピーしてきたバージョン管理のほとんど全ての側面を、Gitに再考させるものです。これによってGitは、単なるVCSというよりも、その上に信じられないほど強力なツールを構築したミニ・ファイルシステムのようなものとなっています。

こちらもご覧ください。


ヤン・フーデック はこれを追加します。 重要コメント :

概念的には正しいし重要なことですが、ストレージレベルでは正しくありません。

Gitはストレージにデルタを使用します .

それだけでなく、他のどのシステムよりも効率的にそれを行うことができます。なぜなら、ファイルごとの履歴を残さないからです。 デルタ圧縮を行いたい場合 各blobを受け取り、類似していると思われるblobをいくつか選択し(前バージョンの最も近い近似値やその他のヒューリスティックを使用)、差分を生成しようと試み、最も小さいものを選びます。この方法では、(ヒューリスティックによりますが、多くの場合)他の類似ファイルや、前バージョンよりも類似している旧バージョンを利用することができます。pack window"パラメータは、デルタ圧縮の品質と性能を交換することができます。デフォルト(10)は一般的に適切な結果をもたらしますが、スペースが限られている場合やネットワーク転送を高速化する場合などには有効です。 git gc --aggressive は値250を使用しているため、動作は非常に遅くなりますが、ヒストリーデータの圧縮を強化することができます。