2011-10-28 7 views
6

gitのサブモジュール機能を使用するのは本当に不満です。私はまだそれを正しくしないか、または私がこれを期待しているようにちょうど動作しません。プロジェクトの状況が与えられ、次のとおりです。このシナリオではgit submodule mess:gitに精通していない開発者と一緒にgitサブモジュールを使用するには?

Project 
    | .git 
    | projsrc 
    | source (submodule) 
    | proj.sln 

ソースは、すべて私たちのプロジェクトに共通のソースデータを含む別のリポジトリを指しています。 ソースの下でも多くの開発が行われており、projsrcもあります。残念ながらプロジェクトはソースサブモジュールのコミットを指し、実際のHEADは指していません。これは私が知っている限り、通常のgitの動作です。

私はすでに

git submodule update 

だけで、メインプロジェクトと一緒にコミットされたサブモジュールのバージョンを取得することが分かりました。しかし、私は実際にサブモジュールの開発に関して常に最新のものにしたいと思っていますが、これをどうやって行うのか本当の手がかりはありません。したがって、私の質問は:

が、これは、プロジェクトのコンパイルを壊したりしません場合は、サブモジュールのHEADに実際の reagardlessをプロジェクトを取り付けることが可能です。 私はちょうどサブモジュール ディレクトリに移動し、gitプルを行っていません。私はサブディレクトリのディレクトリにある の変更を緩和できると思っています。これは に添付されている単純なものなので、実際にはブランチにはなりません。

制約以下の点を考慮してください。私たちのグループで

  • 開発者は、周りのすべてのVCSとその慣れていません。私たちは以前には本当に巨大なsvnリポジトリを使用していましたが、外部repo機能はまったく使用されていませんでした。
  • 私たちは、プロジェクトメンバーのほとんどは、コマンドラインインターフェイスを使用することによってかなり怖がっているので、:)
+1

http://stackoverflow.com/questions/1979167/git-submodule-update/1979194#1979194およびhttp://stackoverflow.com/questions/3131912/も参照してください。なぜならgit-submodules-svn-externalsとの互換性がない/ 3132221#3132221 – VonC

+0

"私はサブモジュールディレクトリで行った変更を失う可能性があります。コミットして実際には何の支店にもない "それは本当ではない!常に枝があります。あなたは頭が孤立しているときにあなたがコミットするまであなたの変更を失うことはありません。 – Vanuan

答えて

7

なぜサブモジュールのポイント理由click'n'forgetソリューションは、最高のだろうWindowsの

  • に取り組んでいます特定のリビジョンへの変更は重要です。 HEADをポイントすると、は再現不可能になります。私。もしあなたが昨日のプロジェクトのバージョンをチェックアウトすれば、昨日のソース@ HEADの正確なバージョンは分かりません。

    これは、常に特定のリビジョンshaを保存する理由です。あなたは、私はGitのサブモジュールが得意ではないですEasy way pull latest of all submodules

  • +0

    私は彼らが壊れることに完全に同意するが、私はその状況で大丈夫です。サブプロジェクト**ソース**が期待通りに機能しないという**プロジェクト**のコラボレーションに携わっている、使い慣れていない開発者以外のすべての開発者を説明するのに気をつけます。彼らはいつもそこでの変更に基づいてソースをコミット/プッシュしています。さらに重要なのは、Projectでサブモジュールupdate_を実行するだけであれば、その特定のリビジョンで上書きされるため、_source_に加えられたすべての変更が緩和されることです。 – cgart

    +0

    'submodule update'は変更を削除しません。わかっているように、参照されたリビジョンをチェックアウトするだけです。作成された変更は依然としてrepoであり、それらをチェックアウトして、** Project **を更新してリビジョンを参照し、サブモジュールリビジョン参照をメインプロジェクトにコミットすることができます。 – kan

    +0

    あなたがコミットしておらず、まだプッシュしていない(親にも変更をプッシュしていない)場合は、変更を削除してください。ソース/は分離されたHEAD(デフォルトの動作)を持つサブモジュールであるため、gitサブモジュールの更新は常にソース/ディレクトリを親リポジトリが指し示す状態にします。私のローカル変更が上書きされることを私に通知することさえないので、これは私の目では非常に悪いgitの動作です(git 1.7.7) – cgart

    2

    を使用することができ、すべてのサブモジュールを引っ張って

    。しかし、私はいくつかの簡単なルールは非常に役に立つと思う。

    1. サブディレクトリからコミットしてプッシュします。
    2. プロジェクトのルートに戻って、コミットして再度押す必要がある場合は、状況を確認します。

    プルアップ時。スクリプトを使用して、 "プル/サブモジュール更新"をバンドルすることができます。そして、あなたのプロジェクトのルートでそれを行うだけです。

    2

    はこのことを考えてみます(あなたが望むように)

    1. ソースがHEADを指しています。
    2. あなたが内部のソースへの変更プロジェクト(あなたがコミットするが、それらをプッシュしていない)
    3. 今は2頭持って行います。プロジェクトのソース内の1つの、あなたの共通のソースで別のものを。

    サブモジュールを更新するときに、あなたがプロジェクトに存在させたいものはどれですか?

    あなたの場合のgitの問題点(および主な機能)は、コミットとアトミック操作としてのプッシュを考えることです。そうではありません。 Gitは分散されています。共通のHEADはありません。異なるHEADを持つ複数のリポジトリがあるかもしれません。

    はこのことを考えてみましょう:

    1. あなたはgitのプロジェクトと3人の開発者(A、BおよびC)を持っています。
    2. 彼らはすべてプロジェクトのHEADをプルします。
    3. 各開発者がプロ​​ジェクトに変更を加えました
    4. それぞれに3つのHEADS:A HEAD、B HEADおよびC HEADがあります。

    「本当の」HEADとみなすHEADはどれですか?

    質問に答える:共通ソースサブモジュールを常に中央リポジトリと同期させたい場合、gitはあなたの選択ではありません。おそらくVCSのどれもそれを手伝ってくれるものではありません。

    1. は(「サードパーティのライブラリをダウンロードしてください」)
    2. が更新サブモジュールを使用してプロジェクトをコミットし、あなたのサブモジュールを引き出します(」:あなたはこの2つのステップで手動で更新する必要があるサードパーティのライブラリとしてGitのサブモジュールを扱うべき

      :あなたは逆の順序で同じことを行う必要があるサブモジュールを変更する場合は、あなたのプロジェクト ")

    にサードパーティのライブラリの新しいバージョンを配置

    1. は「(更新サブモジュールを使用してプロジェクトをコミットし、新規を配置(「サードパーティのライブラリのメンテナへの変更を送信」)
    2. があなたのサブモジュールを押してください(「サードパーティのライブラリに変更を加える」)あなたのサブモジュールをコミット第三者図書館のバージョンをプロジェクトに追加する」)
    +0

    感謝Vanuan。はい、私はgitのアイデアを知っています。あなたは正しいかもしれませんが、正しい選択ではないかもしれません。問題は、これまでgitが以前に使用されていたsvnと比べて実際に何をしているのかを理解するのは非常に長い時間がかかりました。私はすでにこれを私の共同開発者に説明することを本当に恐れています...しかし、私はgitを使ってワークフローをすでに見つけたと思います。 – cgart

    +0

    説明するのを恐れてはいけません。 Gitは、分散バージョン管理が可能なほど簡単です。あなたの共同開発者が理解しなければならないことの1つは、git repoの各コピーが自己完結型のローカル "svn-server"であることです。 "サーバ"間の同期化の必要性は、gitでいくつかのことができない理由です。 – Vanuan

    関連する問題