2017-08-04 3 views
0

私はPro Gitの3.1節で次のように説明しました:コミットする前にブロブがリポジトリに表示されるのはなぜですか?

"3つのファイルを含むディレクトリがあり、すべてをステージングしてコミットしたとしましょう。ファイルをステージングすると、それぞれのチェックサムが計算されます「Getting Started」で言及したSHA-1ハッシュ)、そのファイルのバージョンをGitリポジトリに格納し(Gitはそれらをblobとして参照します)、そのチェックサムをステージング領域に追加します。私はそれらのファイルをコミットする前に "Gitリポジトリにファイルのバージョンを保存"していますか?

+1

これは、インデックス/ステージング領域の仕組みです。コミットのすべての部分を作成し、commitコマンドを発行すると、それらのオブジェクトを履歴に結び付けます。 – siride

+0

あなたはhttps://matthew-brett.github.io/curious-git/curious_journey.html – mkrieger1

+0

を読むことに興味があるかもしれません。サイレントを明確にするために、gitはブロブをコミットするときにどこでもファイルを実際に "移動"しません。木を介してあなたのブロブを参照するコミットオブジェクトを導入することによって、それらをあなたの履歴に追加できます。そうであれば、インデックスとリポジトリは別々に表示されますが、実際は同じファイルに依存しています。 – Jack

答えて

2

Why questions are always tricky.

(私はsiride mentioned in a commentを参照してください)非常に機械的な答えがあります:のみブロブハッシュIDのGitリポジトリの指数、Gitはコミット構築するために使用する神秘的なオブジェクト、店の内部構造は、 。したがって、ファイルのコピーをの索引に入れ(次のコミットになるように)、そのファイルはBLOBオブジェクトとしてリポジトリーになければなりません。

パフォーマンスの答えがあります:インデックスにハッシュIDを格納することで、Gitは新しいコミットを非常に迅速に行います。

データ回復の回答があります(これは弱いです)。あらかじめリポジトリにブロブを保存することで、誤って何か悪いことがあった場合は、しばらくの間、git fsck --lost-found経由で戻すことができます。 (ここでの弱点は、ブロブがリポジトリ内の既存のBLOBと一致する場合、ブロブが見つからない検索に表示されず、ファイルのの名前がで失われていることです)

デザインに美しい答えがあります。おそらく、Linusはgit add fileファイルをリポジトリに早期にコピーすることをgit commitより早く行うと考えました。

これらの回答のいずれかを選択するか、自分で設定することができます。

関連する問題