2011-07-16 18 views
11

私はいくつかの依存関係を持つ2つの作業ツリーを持っています。私の知る限り、Gitのサブモジュールは、以下を適用します:Git submodule alternative?

  • は(マスター)
  • マスタリポジトリがスレーブ
  • からすべての情報を複製し、それを使用して、各作業ツリーのサブディレクトリに各作業ツリー(スレーブ)のコピーを持っています

私はレポが大きくなっても構いませんが、コピーを持っていることは私には受け入れられません。コピーがリンクされるように、私はすべてのプロジェクトを再編成する必要があります。さらに、間違ったファイルの編集が容易に起こり、混乱を招く可能性があります。

  • 各マスターの店、そのすべてのスレーブのリスト:

    は、私は別の考えを持っています。

  • マスターには他の情報は必要ありません。
  • 各コミットがマスターになると、スレーブ内の "snapshot-commit"が作成されます。
  • "スナップショットコミット"は作業ツリーの現在の状態のスナップショットです。インデックスの現在の状態は無視されます(コミットされていない変更をスローする前に "スナップショットコミット"を使用しています)。
  • "スナップショット - コミット"は、名前がマスタ名から派生したブランチに収集されます。コミットメッセージには、マスタコミットのハッシュが含まれています。 (IMHO、これは何千ものタグによるフラッディングよりも優れています)
  • チェックアウトは、スレーブへの再帰が必要な場合を除き、通常どおり動作します。

私が見ることができる唯一の問題は、以下の通りである:

  • 奴隷でコミットが蓄積すると、マスターはもはや存在してコミットした場合でも削除されることはありません飽きません。
  • マスターのコミットが自己完結型ではないため、マスターで参照されているコミットを削除できます。しかし、私はそれが事故によって起こる可能性はないと思うので、私はそれと一緒に暮らすことができます。
  • 他のgitコマンドがこれをどのようにサポートしているか想像できません。しかし、再び、私はそれで生きることができます。

私は誰かが既にそれを実装しているかどうかを尋ねています(または悪い考えです)。

答えて

2

親リポジトリ(あなたの「マスター」)は、サブモジュールのタイトなSHA1(親リポジトリ内でチェックアウトされたサブポジオ)への参照のみを保存するので、私はあなたに従っているかわかりません。
親リポジトリのサイズはまったく影響を受けません。

subtree merge strategybetter managed though git subtree)は親レポのサイズを大きくしますが、(サブツリーのマージ)はあなたの話ではありません。

サブモジュールのもう1つの代替方法は、git-slave (gits)です。実装したいのと少し違います。

+0

私の文章が間違っていたことを意味していますか?「マスターリポジトリは、すべての情報をスレーブから複製します」ということですか?それとも、 ?これはかなり可能ですが、私の主な関心事は、各マスターツリーに各スレーブツリーのコピーが存在することです(または、間違っていますか?)。 – maaartinus

+0

@maaartinus:(特定の差分をチェックアウトするので)物理コピーがありますが、親リポジトリのすべての保持は、チェックアウトされたコミットへの参照です。 http://jp.stackoverflow.com/questions/1979167/git-submodule-update/1979194#1979194 – VonC

+0

@maaartinus:しかし、各親リポジトリはサブモジュールをチェックアウトします前記サブモジュールのいくつかのコピーがいつでも存在する。 – VonC

11

これは奇妙なことであり、多くのことでサポートされているパスから外れてしまうので、これは悪い考えです。

最初に説明:サブモジュールを使用する場合、「マスター」(参照元)レポはかなり大きくなりません。リポジトリ参照(おそらくURL)とコミットIDのみを格納します。しかし、それはここで固執するようではないようです。

このような問題に対処するとき、あなたがダウンして行くことができる3つの基本的に3パスがある:

  1. は、単一のリポジトリにすべてをかけます。あなたは本当に物事を分ける必要があることを10回確信しましたか?あなたは1つのレポから始まり、後で物を分割することができます。また、gitマージは実際に動作するので、デベロッパーの競合はあまり問題ではないことに注意してください。

  2. いくつかの外部パッケージ管理システムを使用してください。 Gitはパッケージマネージャではない、ふりをすることはありません。あなたが使用しているプラ​​ットフォームには、より複雑な依存関係の状況をサポートするパッケージマネージャがあるということは、良いことです。 Maven、rubygems、npm、nuget ...それらの多くがあります。

  3. サブモジュールにサブマウントをマウントします。

基本的に、独自のコードを扱う際は、サブモジュールを最後に選択する必要があります。彼らはサードパーティの図書館を扱うのに最適ですが、結局あなた自身のコードの王様の痛みに終わります。

+0

清算とすべてのアドバイスをありがとう。私が現在やっているのは、それぞれ独自のgitリポジトリを持つ複数のEclipseプロジェクトを使用することです。これらの間の依存関係は十分に弱いので、残っている唯一の問題を解決することができます。参照先リポジトリに変更が必要な参照リポジトリに何らかの変更が生じることがあります。これは、そのような境界を越えて時間を遡ることになり、私が探しているものはそれを解決することができます。私はそれを頻繁に必要としないので、考えられるあらゆる問題もまれです。マウントされたサブモジュールは、私が必要とすることをすることができます... – maaartinus

+1

そこに行って、それをやって、私は本当にそれが努力する価値があるとは思わない。サブモジュールの束を持つことは、それが本当に素晴らしく優雅なアイデアのように聞こえるものの1つですが、日々の使い方は苦痛です。私はあなたに単一のレポで始めるために十分に励ますことはできません。 –

+1

私は@RussellMullに同意していません。私はすべてを1つのレポに入れないようにお勧めしたいと思います。あまりにも多くのものを1つのリポジトリにまとめることは、自分のプロジェクトであっても、私が唯一の作業であるにもかかわらず、悲惨な経験です。サブモジュールはこの種のものにはあまり適していませんが、無関係なプロジェクトを1つのgitリポジトリで一緒に混在させるよりはるかに優れています。 –

関連する問題