2017-05-30 4 views
0

私の組織では、Googleのrepoツールを使用して、約200のgitリポジトリに広がるコードベースを維持しています。コンパイルとテストは非常に遅いので、私は通常、自分のLinuxマシンでそのソースツリーをチェックアウトしています(現在コンパイル中のものと、次のコミットを準備するもの)。Googleの「repo」ツールを使用して複数のチェックアウトを行うための共有オブジェクトストアですか?

これらのチェックアウトソースツリーは、(通常、各リポジトリの.gitフォルダに、しかしrepoは、ソース・ツリーのルートで.repoフォルダにこれをリダイレクト)5.5ギガバイトは、Gitのオブジェクトストアされた状態で、約7.5ギガバイト各消費実際の作業コピーでは2GBしかありません。だから私の質問です:どのように(簡単に)これらの異なるチェックアウトをオブジェクトストアを共有することができますので、オブジェクトストア内の各gitオブジェクトはハードディスクに1回だけ保存されますか?

これは個別のgitリポジトリの複数のチェックアウトで可能ですが、リポジトリのオブジェクトストアのリダイレクトがこれらのアプローチにどのように影響するかはわかりません。 gitはほとんどのオブジェクトを共有パックファイルに格納しているので、ハードリンクで重複したファイルを置き換えるだけでは機能しません。また、内部のオブジェクトが同じであっても異なるチェックアウト間で同じではありません。私がやっている何

答えて

1

はこれです:

  1. 実行repo init新しいレポを初期化します。

  2. .repoインサイド

    と既存.repoで同じ名前のディレクトリに、その時点で2つのproject-objectsと呼ばれるシンボリックリンクとprojectsを作成します。

  3. 次に、1レベル上になり、repo syncとなります。

repoこれまでこれが好きです。問題が発生した場合は、この回答を更新します。

ほとんど同じように、これらの操作が同じgit reposで並行操作を実行する可能性があるため、この方法でオブジェクトを共有するレポツリーで並行してrepo操作を実行しないようにしたいと考えています。

場合は、次のステップは、グローバルオブジェクトストアを特別な場所にある.repoディレクトリの外に置き、そこにシンボリックリンクを介してすべての場所をポイントすることです。

repo--mirror--referenceパラメータは似たような達成すべきであるように見えますが、私は彼らが正確に何を説明するためにそれらの任意のドキュメントを見つけることができないとrepo help initは細部に乏しいです。 --mirrorは、クライアントのレポジトリではなく、クライアントのリポジトリをチェックアウトするときに--referenceというパラメータで参照される(クライアントチェックアウトではなく)レポのローカルミラーをプルダウンするように見えます。

シンボリックリンクの利点は、文書化されていないPythonソースを読まなくても、彼らが何をしているのか理解できることです。

+0

基本的な設定では音が良いが、データの整合性はどうですか?通常のユーザ操作(例えば 'git pull')はgitのガベージコレクションメカニズムをトリガすることがあり、オブジェクトストアから*その作業コピー*に到達できないオブジェクトを排除します。gitに共有について通知せずにオブジェクトストアを共有すると、ガベージコレクションは1つの作業コピーでは到達不可能なオブジェクトを削除することはできませんが、他のものにとって不可欠なものです(例えば、コピーしたがまだプッシュしていない)? – Dreamer

関連する問題