2013-01-09 20 views
9

gitサブモジュールを使いたいです。私は私のプロジェクトに私の変更をプッシュするために必要なgitサブモジュールコミット/プッシュ/プル

手順は

  1. サブモジュールのディレクトリからコミット/追加/プッシュ
  2. 親ディレクトリからのコミット/追加/プッシュ
です

手順プロジェクトの変更を取り入れるために必要な手順親ディレクトリ 親ディレクトリから

  • gitのサブモジュールの更新
  • 階段から

    1. gitのプル元のレポ

      1. gitのプルからのサブモジュールを更新しますサブモジュールディレクトリ
      2. 私を心配何

      は、問題は、それが変更を失うのは簡単ですので、あなたは一般的に、デタッチHEAD 環境で動作するようにしたくないということですhttp://git-scm.com/book/en/Git-Tools-Submodules

      から次の抜粋です。最初に サブモジュールの更新を行う場合は、 ブランチを作成せずにそのサブモジュールディレクトリにコミットしてから、 スーパープロジェクトからもう一度gitサブモジュールの更新を実行してください(?update/commit/update will変更を失うのですか?)Gitはあなたにあなたの変更をあなたに知らせることなく、あなたの変更を上書きします 。技術的には、仕事を失うことはありません、 しかし、あなたはそれを指す枝を持っていないので、幾分 検索するのは難しいでしょう。

      この問題を回避するには、サブモジュール ディレクトリでgit checkout -b workまたは同等のものを使用して作業するときにブランチを作成します。 サブモジュールの更新をもう一度行うと、作業はまだ復帰しますが、少なくとも に戻ります。

      私はサブモジュールを変更しようとしたい台無しにしないよ、上で簡単にドキュメントは、変更を失う可能性に言及し、私は損失を引き起こす可能性があるかを理解していません。

      上記以外のどのような手順を繰り返しても、私は の損失を防ぐことができますか? 特に、いくつかのチームメンバーがサブモジュールを変更しますが、混乱しないようにするためには何が必要ですか?

    +0

    もちろん、コミット/プッシュなしでサブモジュールを変更した場合、サブモジュールの更新を行うと、元のサブモジュールのヘッドがチェックアウトされるので、変更を残してこの状況にならないようにする必要があります。サブモジュール&コミット、サブモジュールの更新を行うと、ブランチを元のサブモジュールの頭に残します。心配しないで、サブモジュールのブランチをマージするか、ちょうどチェックアウトしてそれを持つことができます。 –

    +0

    あなたはもっと具体的になることができますか? 2人のプログラマがチームプロジェクトのサブモジュールを修正しているとします。彼らは何をしなければならないのですか?それぞれはサブモジュールフォルダに同じ名前/変更/コミット/プッシュでブランチを作成します。そしてサブモジュールの更新は、? – eugene

    +0

    私は似たようなことに取り組んでいるので、私はあなたにもっと深い答えを準備しようとしています。その間、あなたはhttp://blog.endpoint.com/2010/04/git-submodule-workflow.htmlとhttp://stackoverflow.com/questions/5814319/git-submodule-pushを読んでいますか?最初のリンクでは、サブモジュールとのブランチの作成についても説明しています(「サブモジュールの問題」をhttp://git-scm.com/book/en/Git-Tools-Submodulesで読む理由を理解したい場合)。 –

    答えて

    19

    同様の問題を解決しようとしているVisual Studioソリューションで外部プロジェクトを扱う人として私の経験を共有したいと思います。私はgitには比較的新しいので、誰かが建設的な批判を持っているなら、私はそれを感謝します。

    Visual Studioを使用している場合は、Git Source Control Providerの拡張機能は無料(http://visualstudiogallery.msdn.microsoft.com/63a7e40d-4d71-4fbb-a23b-d262124b8f4c)で、テストしたときにサブモジュールを再帰的にコミットするようです。

    私は開発のために自宅でVS Web Developer Expressを使用していますので、私は拡張機能に頼りたくありません(私はまた、何が起こっているのかを知っていると良いと思います)。したがって、私はコマンドを理解することを余儀なくされており、以下にいくつかの注釈を追加しました。

    NOTES

    あなたはまだ行っていない場合は、http://git-scm.com/book/en/Git-Tools-Submodulesを通じて徹底した読み取りを持っています。かなりの注意点がありますが、このページに戻って説明します。これを読まずにサブモジュールを使って作業しようとすると、頭痛が非常に早くなります。

    私のアプローチは、いくつかの追加のエキストラと、このチュートリアルは、次のとおりです。http://blog.endpoint.com/2010/04/git-submodule-workflow.html

    を、あなたの親プロジェクト初期化(例えばgit init & & git remote add origin ...)をしたら、そのようなあなたのサブモジュールの追加を開始:

    git submodule add git://github.com/you/extension1.git extension 
    git submodule init 
    git submodule update 
    

    チェックあなたの.gitmodulesファイルには、この追加情報が反映されています。

    [submodule "extension1"] 
         path = extension 
         url = git://github.com/you/extension1.git 
    

    サブモジュールディレクトリ(cd extension)に切り替えます。実行します。

    git fetch #I use fetch here - maybe you can use pull? 
    git checkout -b somebranchname #See the Git-Tools-Submodules link above for an explanation of why you need to branch 
    

    私はreadme.txtをここで変更したので、私はそれをコミットすることができ(また、私は、私は、このコミットでは何をやっていたの記録を持っているでしょう)、そして(ブランチを適用するためにモジュールをコミットまだサブモジュールディレクトリ内):

    git add . 
    git commit -a -m "Branching for extension submodule" 
    

    は今親プロジェクト(すなわちcd ..)に入ります。 (あなたは私が述べたgitのサブモジュールのページを見れば、これが必要な理由、それは説明する)また、ここでコミットする必要があります。

    git status #will show you that your submodule has been modified 
    git commit -a -m "Commiting submodule changes from superproject" 
    

    は、今、私たちはrecusivelyそうのような私たちのプロジェクトをプッシュすることができ、必要な場合:

    git push --recurse-submodules=on-demand 
    

    すべてのサブモジュールに対して上記の手順を1回実行する必要があります。

    すべてのあなたのサブモジュールのためにこれをやって、あなたがコミットしてプッシュするために必要な変更は、使用できる作り始めたら:

    git submodule foreach 'git add .' #recursively add files in submodules 
    

    Unfortunaly私は再帰的のようなものを使用せずにコミットする方法を発見していないがgit-slave(誰ですか?)ので、各サブモジュールのディレクトリに移動して、追加したばかりのファイルの定期的なコミットを実行する必要があります。親プロジェクトで:サブモジュールがコミットされたら

    git status #tells you that `extension` submodule has been modified 
    cd extension 
    git commit -a -m "Commiting extension changes in superproject edit session" 
    

    、あなたもそう、(再び)親プロジェクトをコミットする必要があります:あなたが犯してしまうので

    cd .. 
    git add . 
    git commit -a -m "Altered extension submodule" 
    git status #should now show 'working directory clean', otherwise commit other submodules in the same manner 
    

    これは(少し迷惑得ることができます2回)、それを知ってから実際にそれほど悪くはありません(各プロジェクトでコミットしていることを確認する必要があります)。私の意見では、あなたのスーパープロジェクトの機能のいくつかをサブモジュールに分離していれば、それは他のプロジェクトとは独立して機能するはずです(別々の時間にコミットしながら、迷惑は世界の終わりではありません)。あなたは、あなたのサブモジュールに下ると試してみて、もう一度押すと

    今、私たちは、あなたが最新のを既にされているコミットとして、それは何もしません見つける、...もう一度

    git push --recurse-submodules=on-demand 
    

    をプッシュすることができますプッシュ。

    スーパープロジェクトのクローニング(またはリモートソースの使用)は、git submodule initの後にgit submodule updateを2回実行する必要性など、かなり混乱する可能性があります。 http://git-scm.com/book/en/Git-Tools-Submodulesの「サブモジュールを含むプロジェクトのクローニング」セクションを読んでください。

    私のスーパープロジェクトをクローンすると、サブモジュールの最新の変更が取得されていたときに、何か私を捕まえたことがありました。参照してくださいEasy way pull latest of all submodules

    本のマイバリアントが(しかし、あなたが欲しいものは何でもそれを呼び出すことができます)、チェックアウトのサブモジュールのための「開発」の枝を使用して、親プロジェクトでこれを使用することです

    :私は設定

    git submodule foreach git pull origin development 
    

    これまで私も、私はそうのようなチェックアウトサブモジュール上に自分の変更をプッシュしたいブランチにスワップ:

    cd extension 
    git checkout -b development #This will tell you this is a new branch, but I believe this means a new branch of the local git repository - this will get pushed to the 'development' branch 
    #Make your changes, commit etc. 
    

    私は上記の手順に従うとき、私はあることを確認することができ、クローン/リモートでのサブモジュールへの変更起源のプロジェクト(押されたとき)が他のクローンに現れた同じプロジェクトのes/remoteの起源(最後のsubmodule pullコマンドを忘れないでください)。

    私はあなたに多少役に立ったと思います。

    +0

    詳細な回答をいただきありがとうございます。私はこのサブモジュールの事を一瞬止めるべきだと決めました。 – eugene

    +0

    私は理解しています。私は少しのUbuntuジャンキーだから、Git用のWindowsインストーラに付属しているout-of-the-boxのBASHシェルを使っていると思います。ある種のIDEプロジェクト設定(例えば、Visual Studioの説明のように)で使用する予定の場合は、選択したIDEの適切なプラグインを検討する価値があります。 –

    +1

    [一度にすべてのサブモジュールをコミットする](http://stackoverflow.com/questions/19728933/continue-looping-over-submodules-with-the-git-submodule-foreach-command-after)を使用すると、 'git submodule foreach 'git commit -a -m"サブモジュールを変更しました "|| : '' – Cel