2011-09-13 5 views
0

私はgitの原則を理解しようとする初心者です。 Gitで理解しているように、すべてのファイルはGit Bookとして完全に格納され、またthis postとして格納されます。しかし、git bookはバイナリファイルを圧縮し、テキストファイルのdiffを計算するgit gcも示しています。この文は、gitが完全なファイルを格納する最初の点と矛盾しているようです。大きなプロジェクト用のgitの履歴データ

1)どちらが正しいかを説明できる人はいますか? git gcが部分差分を計算していて、それが長時間実行された場合は、すべての差分がベースバージョンからすべてのブランチに作成されることを確認しますか? git gcが定期的に実行されないと、これは多くの計算時間を意味しますか?

2)膨大な数のソースファイルとリソースファイルがあるAndroidのようなプロジェクトを考えてみると、コミットごとにgitが爆発することを示しているようです。開発者がAndroidのソースを取得すると、すべてのソースとバイナリファイルの履歴全体が取得されると、多くのスペースが必要になりますか?私はここに何かを逃していますかこれは長期的にどのように持続可能ですか?

答えて

2

Gitは内容が気になるアドレス指定可能なファイルシステムです。 概念的には、は、すべてのリビジョンにすべてのファイルの完全な内容を格納し、すべてのblob(ファイルの内容)は、それが取得できるshaを持っています。 gitは、実際には、ファイルを類似のファイル(通常は以前のバージョン)との差分として保存する機能を持っていますが、必ずしもそうである必要はありませんが、gitがファイルを格納する方法の最低レベル。 gitユーザーはそれについて考える必要はないだけでなく、ほとんどのgit ツールでもそれについて考える必要はありません。サイズの問題については

は「Gitのfilesstem」で圧縮の様々な形があり、そして、彼らはかなり効率的だから、プロジェクトの全体の歴史を含む.gitディレクトリは、通常よりも小さいので、プロジェクトが何十万ものコミットに達するまで、コードの1回のチェックアウト。

リポジトリが管理不能に大きくなると、プロジェクトの履歴を別のリポジトリ、新しい/古代の履歴、アクティブ/アーカイブされたブランチなどの行に沿って分割することが可能です(git graftのようなツールの助けを借りて)そうですね。

0

git gcは、リポジトリ内の緩いオブジェクトをクリーンアップ/圧縮するために使用されます。これは、オブジェクトをパッキングすることで行います(ファイル/ツリー/コミットの各完全状態)。 diffは以前のファイルから作成することも、完全に無関係なファイルから作成することもできますが、同様の内容のgitを持っています。

質問2に答えるために、前に述べたように、gitはオブジェクトをパックします。概念的にはすべてのファイルの完全なコピーがありますが、フードの下では、gcが実行されたときに圧縮されます。バイナリファイルの保存に関しては、version control in general is not the best first choice.

1

方法はgit gcは、ファイルの履歴に必ずしも関連するとは限りません。実際、私はどこか読んでいますが、現時点で参考文献を見つけることはできません。最近の「ベース」のリビジョンは、あなたがチェックアウトする可能性が最も高いから選択する可能性が高いです。 10,000のリビジョンがあり、最新のものをチェックアウトしている場合、リビジョン1に10,000 diffを適用して、必要なバージョンを取得することは望ましくありません。

git gcが自動的に実行される特定の操作があります。 pullはそれらの1つなので、実行するまでに非常に長い時間はかかりません。コミットした後に実行することを妨げるものはありません。基本的にこれは、他のバージョン管理システムがバックグラウンドで行うことであり、gitが非常に速い主な理由の1つです。

+1

最新版の使用は、[pro-git](http://progit.org/book/ch9-4.html)の2番目から最後の段落に記載されています。 – Andy

関連する問題