Я использую подмодули Git. После получения изменений с сервера моя голова субмодуля много раз отсоединялась от основной ветки.
Почему это происходит?
Я всегда должен делать:
git branch
git checkout master
Как я могу убедиться, что мой подмодуль всегда указывает на главную ветку?
git
git-submodules
om471987
источник
источник
Ответы:
РЕДАКТИРОВАТЬ:
См @Simba Ответ для правильного решения
СТАРЫЙ ОТВЕТ:
Лично я ненавижу здесь ответы, которые ссылаются на внешние ссылки, которые могут перестать работать со временем, и проверяю мой ответ здесь (если вопрос не повторяется) - я обращаюсь к вопросу, который охватывает тему между строк другой темы, но в целом равен: «Я не отвечая, прочитайте документацию. "
Итак, вернемся к вопросу: почему это происходит?
Ситуация, которую вы описали
Это распространенный случай, когда кто-то не использует подмодули слишком часто или только начинает работу с подмодулями . Я полагаю, что я правильно заявляю, что мы все были там в какой-то момент, когда отсоединяется ГОЛОВА нашего подмодуля .
Решение: убедитесь, что ваш подмодуль отслеживает правильную ветку
Решение: Сделайте так, чтобы ваш подмодуль отслеживал его удаленную ветвь, добавляя новые подмодули с помощью следующих двух команд.
<branch>
.В общих случаях вы уже исправили свою DETACHED HEAD, так как она была связана с одной из проблем конфигурации выше.
фиксация DETACHED HEAD, когда
.update = checkout
Но если вам удалось внести некоторые изменения локально уже для субмодуля и зафиксировать, перенести их в удаленный режим, а затем, когда вы выполнили «git checkout», Git уведомит вас:
Рекомендуемая опция для создания временной ветки может быть хорошей, и тогда вы можете просто объединить эти ветви и т. Д. Однако я лично использовал бы только
git cherry-pick <hash>
в этом случае.Хотя есть еще несколько случаев, когда вы можете перевести свои подмодули в состояние DETACHED HEAD, я надеюсь, что теперь вы немного больше понимаете, как отлаживать ваш конкретный случай.
источник
git submodule update --remote
. Пожалуйста, посмотрите на ответ Симбы, я думаю, что это должен быть правильный ответ.Добавление
branch
опции в.gitmodule
это не имеет отношение к обособленному поведению подмодулей на всех. Старый ответ от @mkungla неверен или устарел.От
git submodule --help
, HEAD отсоединен - это поведение по умолчаниюgit submodule update --remote
.Во-первых, нет необходимости указывать отслеживаемую ветвь .
origin/master
является веткой по умолчанию для отслеживания.Зачем
Так почему же HEAD отсоединяется после
update
? Это вызвано поведением обновления модуля по умолчанию:checkout
.Чтобы объяснить это странное поведение обновления, нам нужно понять, как работают подмодули?
Цитата из раздела «Подмодули» в книге Pro Git
Главный репо отслеживает субмодуль с его состоянием в определенной точке , идентификатором коммита . Поэтому, когда вы обновляете модули, вы обновляете идентификатор фиксации на новый.
Как
Если вы хотите автоматически объединить подмодуль с удаленной веткой, используйте
--merge
или--rebase
.Все, что вам нужно сделать, это,
Рекомендуемый псевдоним:
Там также возможность сделать
--merge
или--rebase
как поведение по умолчаниюgit submodule update
, установивsubmodule.$name.update
вmerge
илиrebase
.Вот пример того, как настроить стандартное поведение обновления субмодуля в
.gitmodule
.Или настройте его в командной строке,
Ссылки
git submodule --help
источник
git submodule update --remote --merge
, и он сносит подмодуль в отдельном состоянии. Также пытался--rebase
с тем же результатом.cd
в субмодуль, извлеките субмодуль в определенную ветку с помощьюgit checkout master
.git submodule foreach --recursive git checkout master
.git submodule foreach --recursive git checkout master
. Но как я могу предотвратить то, что git всегда отсоединяет их? Настройка параметров конфигурации для каждого подмодуля не является вариантом!git submodule update --remote --merge
не оставил подмодуль в отсоединенном состоянии HEAD, но запустилсяgit submodule update
после редактирования моего.gitmodule
файла, как вы указали, DID оставил подмодуль в отсоединенном состоянии HEAD.Я устал от того, что он всегда отключается, поэтому я просто использую сценарий оболочки, чтобы создать его для всех своих модулей. Я предполагаю, что все подмодули на master: вот скрипт:
выполнить его из вашего родительского модуля
источник
Проверьте мой ответ здесь: Подмодули Git: Укажите ветку / тег
Если вы хотите, вы можете добавить строку "branch = master" в ваш файл .gitmodules вручную. Прочитайте ссылку, чтобы увидеть, что я имею в виду.
РЕДАКТИРОВАТЬ: Чтобы отслеживать существующий проект субмодуля в филиале, следуйте инструкциям VonC здесь:
Подмодули Git: укажите ветку / тег
источник
branch = master" line into your .gitmodule
фактически является полным ответом, решил эту проблему для меня.Другой способ заставить ваш подмодуль проверить ветку - это зайти в
.gitmodules
файл в корневой папке и добавить полеbranch
в конфигурации модуля следующим образом:branch = <branch-name-you-want-module-to-checkout>
источник
branch = my_wanted_branch
. Но приgit submodule update --remote
его запуске все равно проверяется как оторванная голова.Как уже говорили другие люди, причина этого состоит в том, что родительское репо содержит только ссылку на (SHA1 of) определенный коммит в подмодуле - он ничего не знает о ветвях. Вот как это должно работать: ветвь, которая была в этом коммите, могла продвинуться (или назад), и если родительское репо ссылалось на ветку, то это может легко сломаться, когда это произойдет.
Однако, особенно если вы активно развиваетесь как в родительском репо, так и в субмодуле,
detached HEAD
состояние может быть запутанным и потенциально опасным. Если вы делаете коммиты в подмодуле, пока он находится вdetached HEAD
состоянии, они становятся висящими, и вы можете легко потерять свою работу. (Висячие коммиты обычно могут быть спасены с помощьюgit reflog
, но в первую очередь их лучше избегать.)Если вы похожи на меня, то большую часть времени, если в подмодуле есть ветвь, которая указывает на извлекаемый коммит, вы бы скорее проверили эту ветвь, чем находились бы в отключенном состоянии HEAD при том же коммите. Вы можете сделать это, добавив следующий псевдоним в ваш
gitconfig
файл:Теперь, после выполнения,
git submodule update
вам просто нужно позвонитьgit submodule-checkout-branch
, и любой подмодуль, извлеченный при фиксации, на который указывает ветка, будет проверять эту ветку. Если у вас не часто есть несколько локальных веток, все указывающие на один и тот же коммит, то это обычно будет делать то, что вы хотите; если нет, то, по крайней мере, он гарантирует, что любые сделанные вами коммиты перейдут на реальную ветку, а не останутся висящими.Кроме того, если вы настроили git для автоматического обновления подмодулей при оформлении заказа (используя
git config --global submodule.recurse true
, см. Этот ответ ), вы можете сделать хук после проверки, который автоматически вызывает этот псевдоним:Тогда вам не нужно вызывать либо
git submodule update
илиgit submodule-checkout-branch
просто делатьgit checkout
обновят все подмодули в соответствующие фиксации и проверить соответствующие ветви (если они существуют).источник
Самое простое решение:
Затем перейдите в каталог репо и:
Дополнительное чтение: лучшие практики Git submodules .
источник