Как управлять конфликтами с подмодулями 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)
но после вытягивания он добавляет дополнительные подмодули, когда я запускаю 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 что будет игнорировать мои подмодули?
7 ответов:
Я не видел эту точную ошибку раньше. Но у меня есть предположение о проблемах, с которыми вы сталкиваетесь. Похоже, потому что
masterиone.oneотделенияsuperyсодержат различные ссылки дляsubbyподмодуль, когда вы объединяете изменения изmastergit не знает, какой ref -v1.0илиv1.1- должны храниться и отслеживатьсяone.oneфилиалаsupery.если это так, то вам нужно выбрать ссылку, которую вы хотите, и зафиксировать это изменение разрешить конфликт. Это именно то, что вы делаете с сброс.
это сложный аспект отслеживания различных версий подмодуля в разных ветвях вашего проекта. Но подмодуль ref так же, как и любой другой компонент вашего проекта. Если две разные ветви продолжают отслеживать один и тот же соответствующий подмодуль refs после последовательных слияний, то git должен быть в состоянии разработать шаблон без возникновения конфликтов слияния в будущем поглощает. С другой стороны, если вы часто переключаете ссылки на подмодули, вам, возможно, придется мириться с большим количеством разрешения конфликтов.
Ну, это не технически управление конфликтами с подмодулями (т. е.: держите это, но не то), но я нашел способ продолжить работу...и все, что мне нужно было обратить внимание на мой
git statusвывод и сброс подмодулей:git reset HEAD subby git commitэто приведет к сбросу подмодуля к предварительной фиксации. Что в данном случае именно то, что я хотел. И в других случаях, когда мне нужны изменения, применяемые к подмодулю, я буду обрабатывать их со стандартными рабочими процессами подмодуля (checkout master, опустите нужный тег, и т. д.).
Я немного боролся с ответами на этот вопрос и не очень повезло с ответами в похожий так пост либо. Так что это то, что сработало для меня-имея в виду, что в моем случае подмодуль поддерживался другой командой, поэтому конфликт произошел из разных версий подмодуля в master и моей локальной ветви проекта, над которым я работал:
- выполнить
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 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
Comments