Как мне управлять конфликтами с подмодулями 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
работал у меня:)