いくつかのサブモジュールを参照するgitスーパープロジェクトがあり、残りのプロジェクトメンバーが作業できるようにワークフローをロックダウンしようとしています。
この質問では、私のスーパープロジェクトはsupery
と呼ばれ、サブモジュールはsubby
と呼ばれます。 (それから私がやろうとしていることの単純化です...私は実際にバージョンにブランチを使用していませんが、質問としてレイアウトするのが最も簡単だと思いました。)
supery
のマスターブランチには、サブプロジェクトとして参照されるgitプロジェクトsubby
のタグv1.0
があります。 supery
のブランチはone.one
を呼び出し、サブモジュールの参照を変更して、subby
のタグv1.1
を指すようにしました。
支障なくこれらの各ブランチ内で作業できますが、master
ブランチからの変更でone.one
ブランチを更新しようとすると、いくつかの競合が発生し、それらを解決する方法はありません。
基本的に、subby
ブランチでgit pull . master
を実行した後、追加のサブモジュールが作成されるようです。
プル/マージの前に、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
で使用できるパラメーターはありますか?
私はその正確なエラーを見たことがありません。しかし、私はあなたが直面しているトラブルについて推測しています。 master
の変更をマージすると、supery
のsubby
およびone.one
ブランチにmaster
サブモジュールの異なる参照が含まれているため、 v1.0
またはv1.1
のどのrefを保持し、supery
のone.one
ブランチで追跡する必要があるかはわかりません。
その場合は、必要なrefを選択し、その変更をコミットして競合を解決する必要があります。 resetコマンドを使用して、まさにこれを実行しています。
これは、プロジェクトのさまざまなブランチにあるサブモジュールのさまざまなバージョンを追跡する際の注意が必要です。ただし、サブモジュールrefは、プロジェクトの他のコンポーネントとまったく同じです。 2つの異なるブランチが連続したマージ後に同じそれぞれのサブモジュールrefを追跡し続ける場合、gitは将来のマージでマージの競合を引き起こすことなくパターンを解決できるはずです。一方、サブモジュールrefを頻繁に切り替える場合は、多くの競合解決に耐えなければならない場合があります。
さて、サブモジュールとの競合を技術的に管理していません(つまり、これを維持しますが、そうではありません)が、私は作業を続ける方法を見つけました...そして、私がしなければならなかったことは私のgit status
サブモジュールを出力してリセットします。
git reset HEAD subby
git commit
これは、サブモジュールをプリプルコミットにリセットします。この場合、まさに私が望んでいたものです。また、サブモジュールに変更を適用する必要がある他のケースでは、標準のサブモジュールワークフロー(チェックアウトマスター、目的のタグのプルダウンなど)でそれらを処理します。
私はこの質問の答えに少し苦労し、 同様のSO post のいずれかの答えにもあまり運がありませんでした。 -私の場合、サブモジュールは別のチームによって維持されていたため、マスターとプロジェクトの私のローカルブランチの異なるサブモジュールバージョンから競合が発生したことに注意してください。
git status
-競合するサブモジュールフォルダーを書き留めますサブモジュールを現在のブランチで最後にコミットされたバージョンにリセットします。
git reset HEAD path/to/submodule
この時点で、サブモジュールの競合のないバージョンがあり、サブモジュールのリポジトリで最新バージョンに更新できます。
cd path/to/submodule git submodule foreach git pull Origin SUBMODULE-BRANCH-NAME
そして今、あなたはそれをcommit
して仕事に戻ることができます。
最初に、参照するサブモジュールに必要なハッシュを見つけます。その後、実行します
~/supery/subby $ git co hashpointerhere
~/supery/subby $ cd ../
~/supery $ git add subby
~/supery $ git commit -m 'updated subby reference'
それは私のサブモジュールを正しいハッシュ参照に導き、それ以上競合することなく私の仕事を続けるために私のために働いた。
ブランチへのgit rebase -i Origin/master
でこの問題が発生しました。私はマスターのバージョンのサブモジュールrefを取得したかったので、次のようにしました。
git reset master path/to/submodule
その後
git rebase --continue
これで問題は解決しました。
この議論から助けを得ました。私の場合
git reset HEAD subby
git commit
私のために働いた:)
私の親ディレクトリには次のように表示されます:
$ 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