@@ -121,7 +121,7 @@ Insert 18333fig0901.png
121
121
122
122
独自のツリーを作ることも可能です。Git は通常、ステージングエリアもしくはインデックスの状態を取得することによってツリーを作成し、
123
123
そこからツリーオブジェクトを書き込みます。そのため、ツリーオブジェクトを作るには、まず幾つかのファイルをステージングしてインデックスをセットアップしなければなりません。
124
- text .txt ファイルの最初のバージョンである単一エントリーのインデックスを作るには、` update-index ` という配管コマンドを使います。
124
+ test .txt ファイルの最初のバージョンである単一エントリーのインデックスを作るには、` update-index ` という配管コマンドを使います。
125
125
前バージョンの test.txt ファイルを新しいステージングエリアに人為的に追加するにはこのコマンドを使います。
126
126
ファイルはまだステージングエリアには存在しない(未だステージングエリアをセットアップさえしていない)ので、` --add ` オプションを付けなければなりません。
127
127
また、追加しようとしているファイルはディレクトリには無くデータベースにあるので、` --cacheinfo ` オプションを付ける必要があります。
@@ -377,7 +377,7 @@ HEADの値を設定することもできます。
377
377
378
378
これが軽量版のタグのすべてです。つまり決して変動しないブランチなのです。一方、注釈付き版のタグはもっと複雑です。注釈付き版のタグを作ろうとすると、Git はタグオブジェクトを作り、そして、コミットに対する直接的な参照ではなく、そのタグをポイントする参照を書き込みます。注釈付き版のタグを作ることで、これを見ることができます。(注釈付き版のタグを作るには ` -a ` オプションを指定して実行します)
379
379
380
- $ git tag -a v1.1 1a410efbd13591db07496601ebc7a059dd55cfe9 – m 'test tag'
380
+ $ git tag -a v1.1 1a410efbd13591db07496601ebc7a059dd55cfe9 - m 'test tag'
381
381
382
382
これで、作られたオブジェクトの SHA-1ハッシュ値を見ることができます。
383
383
@@ -439,7 +439,7 @@ Git レポジトリ test のオブジェクトデータベースに戻りまし
439
439
440
440
Git は zlib を使用してこれらのファイルのコンテンツを圧縮するため、多くを格納していません。これらすべてのファイルを集めても 925バイトにしかならないのです。Git の興味深い機能を実際に見るために、幾つか大きなコンテンツをレポジトリに追加してみましょう。前に作業したGritライブラリから ` repo.rb ` ファイルを追加します。これは約 12Kバイトのソースコードファイルです。
441
441
442
- $ curl http ://github.com/mojombo/grit/raw /master/lib/grit/repo.rb > repo.rb
442
+ $ curl https ://raw. github.com/mojombo/grit/master/lib/grit/repo.rb > repo.rb
443
443
$ git add repo.rb
444
444
$ git commit -m 'added repo.rb'
445
445
[master 484a592] added repo.rb
@@ -455,10 +455,10 @@ Git は zlib を使用してこれらのファイルのコンテンツを圧縮
455
455
100644 blob 9bc1dc421dcd51b4ac296e3e5b6e2a99cf44391e repo.rb
456
456
100644 blob e3f094f522629ae358806b17daf78246c27c007b test.txt
457
457
458
- それから ` git cat-file ` を使って、そのオブジェクトがどれくらいの大きさか知ることができます。
458
+ それから、そのオブジェクトのディスク上のサイズがどのくらいか調べることもできます。
459
459
460
- $ git cat-file -s 9bc1dc421dcd51b4ac296e3e5b6e2a99cf44391e
461
- 12898
460
+ $ du -b .git/objects/9b/c1dc421dcd51b4ac296e3e5b6e2a99cf44391e
461
+ 4102 .git/objects/9b/c1dc421dcd51b4ac296e3e5b6e2a99cf44391e
462
462
463
463
ここで、ファイルに少し変更を加えたらどうなるのか見てみましょう。
464
464
@@ -476,10 +476,10 @@ Git は zlib を使用してこれらのファイルのコンテンツを圧縮
476
476
477
477
そのブロブは今では当初とは異なるブロブです。つまり、400行あるファイルの最後に1行だけ追加しただけなのに、Git はその新しいコンテンツを完全に新しいオブジェクトとして格納するのです。
478
478
479
- $ git cat-file -s 05408d195263d853f09dca71d55116663690c27c
480
- 12908
479
+ $ du -b .git/objects/05/408d195263d853f09dca71d55116663690c27c
480
+ 4109 .git/objects/05/408d195263d853f09dca71d55116663690c27c
481
481
482
- これだとディスク上にほとんど同一の 12Kバイトのオブジェクトを二つ持つことになります 。もし Git がそれらのひとつは完全に格納するが二つ目のオブジェクトはもうひとつとの差分(delta)のみを格納するのだとしたら、どんなに素晴らしいことかと思いませんか?
482
+ これだとディスク上にほとんど同一の 4Kバイトのオブジェクトを二つ持つことになります 。もし Git がそれらのひとつは完全に格納するが二つ目のオブジェクトはもうひとつとの差分(delta)のみを格納するのだとしたら、どんなに素晴らしいことかと思いませんか?
483
483
484
484
それが可能になったのです。Git がディスク上にオブジェクトを格納する初期のフォーマットは、緩いオブジェクトフォーマット(loose object format)と呼ばれます。しかし Git はこれらのオブジェクトの中の幾つかをひとつのバイナリファイルに詰め込む(pack up)ことがあります。そのバイナリファイルは、空きスペースを保存してより効率的にするための、パックファイル(packfile)と呼ばれます。あまりにたくさんの緩いオブジェクトがそこら中にあるときや、` git gc ` コマンドを手動で実行したとき、または、リモートサーバにプッシュしたときに、Git はこれを実行します。何が起こるのかを知るには、` git gc ` コマンドを呼ぶことで、Git にオブジェクトを詰め込むように手動で問い合わせることができます。
485
485
@@ -501,7 +501,7 @@ Git は zlib を使用してこれらのファイルのコンテンツを圧縮
501
501
502
502
残りのオブジェクトは、どのコミットにもポイントされていないブロブです。このケースでは、以前に作成した "what is up, doc?" の例と "test content" のブロブの例がそれにあたります。それらに対していかなるコミットも加えられてないので、それらは遊離(dangling)しているみなされ新しいパックファイルに詰め込まれないのです。
503
503
504
- 他のファイルは新しいパックファイルとインデックスです。パックファイルは、ファイルシステムから取り除かれたすべてのオブジェクトのコンテンツを含んでいる単一のファイルです。インデックスは、特定のオブジェクトを速く探し出せるようにパックファイルの中にあるオフセットを含むファイルです。素晴らしいことに、` gc ` を実行する前のディスク上のオブジェクトを集めると約 12Kバイトのサイズであったのに対して 、新しいパックファイルは 6Kバイトになっています 。オブジェクトをパックすることで、ディスクの使用量が半分になったのです。
504
+ 他のファイルは新しいパックファイルとインデックスです。パックファイルは、ファイルシステムから取り除かれたすべてのオブジェクトのコンテンツを含んでいる単一のファイルです。インデックスは、特定のオブジェクトを速く探し出せるようにパックファイルの中にあるオフセットを含むファイルです。素晴らしいことに、` gc ` を実行する前のディスク上のオブジェクトを集めると約 8Kバイトのサイズであったのに対して 、新しいパックファイルは 4Kバイトになっています 。オブジェクトをパックすることで、ディスクの使用量が半分になったのです。
505
505
506
506
Git はどうやってこれを行うのでしょうか? Git はオブジェクトをパックするとき、似たような名前とサイズのファイルを探し出し、ファイルのあるバージョンから次のバージョンまでの増分のみを格納します。パックファイルの中を見ることで、スペースを確保するために Git が何を行ったのかを知ることができます。` git verify-pack ` という配管コマンドを使用して、何が詰め込まれたのかを知ることができます。
507
507
@@ -528,7 +528,7 @@ Git はどうやってこれを行うのでしょうか? Git はオブジェ
528
528
chain length = 1: 1 object
529
529
pack-7a16e4488ae40c7d2bc56ea2bd43e25212a66c45.pack: ok
530
530
531
- ここで、` 9bc1d ` というブロブを覚えてますでしょうか、これは ` repo.rb ` ファイルの最初のバージョンですが、このブロブは二つ目のバージョンである ` 05408 ` というブロブを参照しています。出力にある三つ目のカラムはパック内のオブジェクトのサイズを示しているため 、` 05408 ` は 12Kバイトを要しているが、` 9bc1d ` はたったの 7バイトしか要していないことがわかります。さらに興味深いのは、最初のバージョンは増分として格納されているのに対して、二つ目のバージョンのファイルは完全な状態で格納されているということです。これは直近のバージョンのファイルにより速くアクセスする必要があるであろうことに因ります。
531
+ ここで、` 9bc1d ` というブロブを覚えてますでしょうか、これは ` repo.rb ` ファイルの最初のバージョンですが、このブロブは二つ目のバージョンである ` 05408 ` というブロブを参照しています。出力にある三つ目のカラムはオブジェクトの実体のサイズを示しており 、` 05408 ` の実体は 12Kバイトを要しているが、` 9bc1d ` の実体はたったの 7バイトしか要していないことがわかります。さらに興味深いのは、最初のバージョンは増分として格納されているのに対して、二つ目のバージョンのファイルは完全な状態で格納されているということです。これは直近のバージョンのファイルにより速くアクセスする必要があるであろうことに因ります。
532
532
533
533
これに関する本当に素晴らしいことは、いつでも再パックが可能なことです。Git は時折データベースを自動的に再パックして、常により多くのスペースを確保しようと努めます。また、あなたはいつでも ` git gc ` を実行することによって手動で再パックをすることができるのです。
534
534
@@ -864,7 +864,7 @@ Git を使っていく過程のある時点で、誤ってコミットを失っ
864
864
865
865
素晴らしい。` master ` ブランチがかつて存在した場所に、最初の二つのコミットを再び到達可能にして、あなたはいま ` recover-branch ` という名前のブランチを持っています。次に、損失の原因は reflog の中にはないある理由によるものだったと想定しましょう。` recover-branch ` を取り除いて reflog を削除することによって、それをシミュレートすることができます。最初の二つのコミットは今いかなるものからも到達不能な状態です。
866
866
867
- $ git branch – D recover-branch
867
+ $ git branch - D recover-branch
868
868
$ rm -Rf .git/logs/
869
869
870
870
なぜなら reflog データは ` .git/logs/ ` ディレクトリに残っているため、あなたは効率的に reflog を持たない状態です。この時点でそのコミットをどうやって復元できるのでしょうか? ひとつの方法は ` git fsck ` ユティリティーを使用することです。それはあなたのデータベースの完全性(integrity)をチェックします。もし ` --full ` オプションを付けて実行すると、別のオブジェクトによってポイントされていないすべてのオブジェクトを表示します。
0 commit comments