Как мне управлять конфликтами с подмодулями git?

У меня есть суперпроект git, который ссылается на несколько подмодулей, и я пытаюсь заблокировать рабочий процесс, чтобы остальные члены моего проекта работали внутри.

Для этого вопроса, скажем, мой суперпроект называется supery, а подмодуль называется subby. (Тогда это упрощение того, что я пытаюсь сделать... Я фактически не использую ветки для версий, но я думал, что было бы проще всего выложить как вопрос.)

Моя главная ветвь supery имеет тег v1.0 проекта git subby, на который ссылается как подмодуль. Ветвь supery называется one.one и изменила ссылку подмодуля на то, чтобы указать тег v1.1 subby.

Я могу работать в каждой из этих ветвей без сучка и задоринки, но если я попытаюсь обновить ветвь 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)

Но после pull, он добавляет дополнительные подмодули, когда я запускаю 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, который будет игнорировать мои подмодули?

Ответ 1

Я раньше этого не видел. Но я догадываюсь о том, с чем вы столкнулись. Похоже, что ветки master и one.one supery содержат разные ссылки для подмодуля subby, когда вы объединяете изменения из master git, не знаете, какой ref - v1.0 или v1.1 - следует сохранять и отслеживать ветвью one.one supery.

Если это так, то вам нужно выбрать нужный референт и зафиксировать это изменение, чтобы разрешить конфликт. Это именно то, что вы делаете с командой reset.

Это сложный аспект отслеживания различных версий подмодуля в разных ветвях вашего проекта. Но подмодуль ref похож на любой другой компонент вашего проекта. Если два разных ветки продолжают отслеживать одни и те же соответствующие подмодули ref после последовательных слияний, то git должен иметь возможность выработать шаблон без привлечения конфликтов слияния в будущих слияниях. С другой стороны, если вы часто переключаете подмодуль, часто вам приходится мириться с большим разрешением конфликта.

Ответ 2

Ну, это не технически управляет конфликтами с подмодулями (то есть: сохраняйте это, но не тем), но я нашел способ продолжить работу... и все, что мне нужно было сделать, это обратить внимание на мой вывод git status и reset подмодули:

git reset HEAD subby
git commit

Это означало бы reset подмодуль для фиксации pre-pull. Который в этом случае именно то, что я хотел. И в других случаях, когда мне нужны изменения, применяемые к подмодулю, я буду обрабатывать те, у которых стандартные рабочие процессы подмодулей (мастер проверки, вытащить нужный тег и т.д.).

Ответ 3

Я немного потрудился с ответами на этот вопрос и не очень повезло с ответами в аналогичном SO post. Так что это сработало для меня - имея в виду, что в моем случае подмодуль поддерживался другой командой, поэтому конфликт произошел из разных версий подмодулей в мастер-классе и моей локальной ветки проекта, над которым я работал:

  • Запустить git status - записать папку подменю с конфликтами
  • Reset подмодуль к версии, которая была последней передана в текущей ветке:

    git reset HEAD path/to/submodule

  • В этот момент у вас есть свободная от конфликта версия вашего подмодуля, которую вы теперь можете обновить до последней версии в репозитории подмодулей:

    cd path/to/submodule
    git submodule foreach git pull origin SUBMODULE-BRANCH-NAME
  • И теперь вы можете commit и вернуться к работе.

Ответ 4

Сначала найдите хэш, который вы хотите, чтобы ваш подмодуль ссылался. затем запустите

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

который работал у меня, чтобы получить мой подмодуль в правильную хеш-ссылку и продолжить работу без каких-либо дальнейших конфликтов.

Ответ 5

У меня была проблема с git rebase -i origin/master веткой. Я хотел взять главную версию подмодуля ref, поэтому я просто сделал:

git reset master path/to/submodule

а затем

git rebase --continue

Это решило проблему для меня.

Ответ 6

Получите помощь от этого обсуждения. В моем случае

git reset HEAD subby
git commit

работал у меня:)