165

いくつかのサブモジュールを参照するgitスーパープロジェクトがあり、残りのプロジェクトメンバーがその中で作業できるようにワークフローをロックダウンしようとしています。

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

のマスターブランチには、サブモジュールとして参照されるgitプロジェクトsuperyのタグがあります。のブランチは、のタグを指すようにサブモジュールの参照を呼び出して変更しました。v1.0subbysuperyone.onev1.1subby

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

基本的にgit pull . master、ブランチでしばらく実行するsubbyと、追加のサブモジュールが作成されるように見えます。

プル/マージの前に、ブランチgit submoduleから目的の応答を取得します。one.one

$ 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または、サブモジュールを無視するオリジナルで使用できるパラメーターはありますか?

4

9 に答える 9

115

サブモジュールとの競合を技術的に管理することはできませんが (つまり、これを保持しますが、それは保持しません)、作業を続行する方法を見つけました...そして、git status出力に注意を払い、サブモジュールをリセットするだけで済みました。

git reset HEAD subby
git commit

これにより、サブモジュールが pre-pull コミットにリセットされます。この場合、まさに私が欲しかったものです。また、サブモジュールに変更を適用する必要がある場合は、標準のサブモジュール ワークフロー (マスターのチェックアウト、目的のタグのプルダウンなど) で処理します。

于 2009-05-07T15:33:52.750 に答える
76

この質問の回答に少し苦労しましたが、同様の SO 投稿の回答もうまくいきませんでした。これが私にとってうまくいったことです-私の場合、サブモジュールは別のチームによって維持されていたため、マスターと私が取り組んでいたプロジェクトのローカルブランチの異なるサブモジュールバージョンから競合が発生したことに注意してください。

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

    git reset HEAD path/to/submodule

  3. この時点で、競合のないバージョンのサブモジュールが作成され、サブモジュールのリポジトリで最新バージョンに更新できるようになりました。

    cd パス/to/サブモジュール
    git submodule foreach git pull origin SUBMODULE-BRANCH-NAME
  4. そして今、あなたはcommitそれをして仕事に戻ることができます。

于 2015-09-15T08:59:07.337 に答える
31

私は以前にその正確なエラーを見たことがありません。しかし、私はあなたが遭遇している問題について推測しています。masterとのone.oneブランチにはサブモジュールsuperyの異なる ref が含まれているため、 gitsubbyからの変更をマージすると、どの refまたは- を保持して のブランチで追跡する必要があるかmasterがわからないためです。v1.0v1.1one.onesupery

その場合は、必要な参照を選択し、その変更をコミットして競合を解決する必要があります。これは、 resetコマンドで行っていることとまったく同じです。

これは、プロジェクトのさまざまなブランチでサブモジュールのさまざまなバージョンを追跡する際の注意が必要な側面です。しかし、サブモジュール ref は、プロジェクトの他のコンポーネントと同じです。2 つの異なるブランチが、連続したマージの後も同じそれぞれのサブモジュール ref を追跡し続ける場合、git は、将来のマージでマージの競合を発生させることなく、パターンを解決できるはずです。一方、サブモジュールの参照を頻繁に切り替えると、多くの競合解決に我慢しなければならない場合があります。

于 2009-05-07T17:33:16.037 に答える
18

まず、サブモジュールが参照するハッシュを見つけます。次に実行します

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

これは、サブモジュールを正しいハッシュ参照に取得し、それ以上の競合を発生させることなく作業を続行するために機能しました。

于 2013-01-09T02:01:29.713 に答える
1

アップストリーム バージョンを使用する場合:

rm -rf <submodule dir>
git submodule init
git submodule update
于 2020-09-16T15:18:20.040 に答える