2009-05-05 21 views
72

私はいくつかのサブモジュールを参照するgitスーパープロジェクトを持っており、残りのプロジェクトメンバーが内部で作業するためのワークフローをロックダウンしようとしています。gitサブモジュールとの競合をどのように管理できますか?

この質問の場合、私のスーパープロジェクトはsuperyと呼ばれ、サブモジュールはsubbyと呼ばれます。 (その後、私がやろうとしていることの簡略化です...実際にはバージョンのブランチを使用していませんが、質問としてレイアウトするのが最も簡単だと思いました)

superyはサブプロジェクトとしてsubbyというgitプロジェクトのタグv1.0を持っています。 superyの支店はone.oneと呼ばれ、v1.1subbyというタグを指すようにサブモジュールの参照を変更しました。

私はこれらの各ブランチ内で問題なく作業できますが、one.oneブランチをmasterブランチからの変更で更新しようとすると、いくつかの競合が発生し、解決方法がありません。

基本的にgit pull . masterを実行した後に、subbyブランチにある場合、追加のサブモジュールを作成するように見えます。

はプル/マージする前に、私はone.oneブランチからgit submoduleから所望の応答を得る:

$ git checkout master 
$ git submodule 
qw3rty...321e subby (v1.0) 
$ git checkout one.one 
$ git submodule 
asdfgh...456d subby (v1.1) 

しかし、私が実行したときにプルした後、それは追加のサブモジュールを追加し

git submodule

$ git pull . master 
Auto-merged schema 
CONFLICT (submodule): Merge conflict in subby - needs qu3rty...321e 
Automatic merge failed; fix conflicts and then commit the results. 

$ git submodule 
qw3rty...321e subby (v1.0) 
asdfgh...456d subby (v1.1) 
zxcvbn...7890 subby (v1.1~1) 

不要なサブモジュールの参照を削除/無視し、競合や変更をコミットするにはどうすればよいですか?または、元のgit pullで使用できるパラメータがあり、サブモジュールを無視しますか?

答えて

11

私は前にその正確なエラーを見たことがありません。しかし、私はあなたが遭遇している問題について推測しています。 v1.0またはv1.1が - - 保ち、superyone.one枝によって追跡されなければならないそれはあなたがどのrefを知らないmasterのgitから変更をマージするときsuperymasterone.one枝は、subbyサブモジュールごとに異なるレフリーが含まれているためのように見えます。

この場合、競合を解決するために必要なrefを選択し、その変更をコミットする必要があります。 リセットコマンドを使用しているのとまったく同じです。

これは、プロジェクトのさまざまなブランチで異なるサブバージョンのサブモジュールを追跡するという面倒な側面です。しかし、サブモジュールrefはプロジェクトの他のコンポーネントと同じです。2つの異なるブランチが連続するマージの後で同じサブモジュールのリファレンスを追跡し続けている場合、gitは将来のマージでマージの競合を起こさずにパターンを実行できるはずです。一方、スイッチのサブモジュールが頻繁に参照する場合は、多くの矛盾を解決する必要があります。

+1

質問にいくつかの光をあててくれてありがとう。 これは今や私には分かりやすくなり、リセットコマンドは上記の私の状況では完全に機能します。 しかし、マスターブランチからサブモジュールrefを受け取り、現在のブランチのサブモジュールにrefを渡すコマンドは何でしょうか? 私は通常の競合を処理する方法を知っていますが、Webを3日間精算した後、rm -r以外のコード例は1つも見つかりません。私はそこに存在しない例がある理由を考え始めています。サブモジュールはこれまでスーパープロジェクトから抽象化されており、すべての移行を管理する必要があります。やっと! – Tyler

+19

!答え!私は 'git status'では' ../ Mono.Cecil'を追加しましたが、 'git add'と' git rm'は 'Mono.Cecil:merge、pathspec 'Mono.Cecil /'と一致しませんでしたこれは単に空のフォルダであり、gitは実際にファイルを処理するだけなので、「files」と表示されます。 'git checkout'は私に' Mono.Cecil:エラーをマージする必要があります。エラー:あなたは現在のインデックスを最初に解決する必要があります.'、 'git submodule update'は' Skipped unmerged submodule Mono.Cecil'と 'git checkout master Mono.Cecil' FINALLYそれを固定した。基本的な問題: 'git status'の提案が間違っているので、ブランチを選び、' checkout'を使ってフォルダのコピーを取ってください! – IBBoard

+2

@BBoardのコマンドはこの状況を助けました。私は 'git checkout --ours SUBMOD'と' git add SUBMOD'などを試しましたが、最後に 'git checkout master SUBMOD'を実行すると競合が修正されました。 このコメントは答えではなく、コメントでなければなりません。:) –

55

これは、技術的にサブモジュールとの競合を管理していない(つまり、これを維持するが、それを維持しない)が、作業を続ける方法を見つけた...そして、私はgit status出力に注意し、サブモジュール:

git reset HEAD subby 
git commit 

これは、サブモジュールをプリプルコミットにリセットします。この場合、私が望んだのは正確です。サブモジュールに適用される変更が必要な場合は、標準のサブモジュールワークフロー(チェックアウトマスター、目的のタグのプルダウンなど)でそれらを処理します。

+0

をしました競合するモジュールのステータスを「変更された」から「削除された」に変更するようにしか見えません。 –

+2

git reset subby –

+1

は、答えに記載されているように私のために働く.. git reset HEAD path/to/submodule/dir – estoy

12

まず、サブモジュールに参照させたいハッシュを見つけます。

~/supery/subby $ git co hashpointerhere 
~/supery/subby $ cd ../ 
~/supery $ git add subby 
~/supery $ git commit -m 'updated subby reference' 

私のサブモジュールを正しいハッシュリファレンスにして、それ以上の競合を起こさずに作業を続けてくれました。

+0

これ以上のupvotesが必要です。 – J0hnG4lt

+1

またはちょうどgitのチェックアウトを行うことができます - theirs(または--ours)サブビー – Bachi

+0

@Bachi:git checkout - theirsと--oursはサブモジュールには影響しません。 –

18

私はこの質問の回答で少し苦労し、a similar SO postの回答ではあまり運がありませんでした。私の場合、サブモジュールは別のチームによって維持されていたので、私が取り組んでいたプロジェクトのマスターと地元支部の異なるサブモジュールのバージョンから衝突が起こったのです。

  1. ランgit status - 競合にサブモジュールフォルダをメモします
  2. 現在のブランチにコミットされた最後のバージョンにサブモジュールをリセットします。このPOIで

    git reset HEAD path/to/submodule

  3. cd path/to/submodule 
    git submodule foreach git pull origin SUBMODULE-BRANCH-NAME
  4. そして今、あなたはそれをcommitことができ、仕事に戻る:NT、あなたは今、サブモジュールのリポジトリ内の最新バージョンにアップデートすることができ、あなたのサブモジュールの競合のないバージョンがあります。

+1

唯一の明確で実用的な解決策 upvote –

+0

これは私のためにも機能しました。より多くのupvotesに値するそれは私のために働いた –

6

私はブランチにgit rebase -i origin/masterでこの問題を抱えていました。私は、サブモジュールrefのマスタのバージョンを撮りたかったので、私は単純でした:

git reset master path/to/submodule

と私のための問題を解決し、その後

git rebase --continue

を。

+3

。私はまだ彼らがサブモジュールを傷つけるために何をしたのかを考えている –

0

このディスカッションの助けを借りてください。 は、私の場合

git reset HEAD subby 
git commit 

は私のために働いた:)

0

をさて、私が見る私の親ディレクトリでは:

$ git status 
On branch master 
Your branch is up-to-date with 'origin/master'. 
Unmerged paths: 
(use "git reset HEAD <file>..." to unstage) 
(use "git add <file>..." to mark resolution) 

をだから私はちょうど私このために、この

git reset HEAD linux 
関連する問題