Подтвердить что ты не робот

Почему `` w20> checkout` автоматически выполняет `git обновление подмодуля --recursive`?

Кто-нибудь, пожалуйста, помогите мне понять подмодули в git. Я знаю, что они много беспокоятся о сети, но, поскольку я предполагаю, что разработчики git умные люди должны иметь причины для текущего поведения - и, возможно, способ обойти мою проблему.

Итак, у меня есть проект и некоторые подмодули. Проект имеет разные ветки, например:

  • MyApp_version2
  • MyApp_version3
  • MyApp_version4
  • MyApp_liteversion
  • MyApp_development

Мои подмодули не часто обновляются (может быть, раз в неделю), поэтому я не уверен, что они не будут автоматически прикреплены к заголовку репозитория подмодуля.

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

Зачем мне это нужно?

Я ожидал бы, что git будет работать как svn. Когда я выполняю свою работу в своем основном репо, я бы ожидал, что git что-то подумает об этом: "Хорошо, он хочет выполнить свою работу сейчас. Я вижу, что подмодули в настоящее время находятся в редакции abc, поэтому, когда он в какой-то момент будущее вернется к этому соглашению, он, вероятно, снова захочет подмодули в том же пересмотре."

Я не вижу ни одного случая, когда вы хотите, чтобы подмодули оставались в текущей версии, когда вы возвращаетесь на 3 года в свой основной репозиторий. Однако, должна быть причина для этой реализации, правильно?

Мне бы очень хотелось услышать, знает ли кто-нибудь из вас мысли по этому поводу, но в любом случае мне бы очень понравилось решение. Есть ли способ сказать git: "Я хочу выполнить эту работу с этими подмодулями. Если я в какой-то момент вернусь в это состояние, я хочу, чтобы подмодули также были проверены в правильной версии".

Пример для пояснения

Мой основной репозиторий - это приложение, которое должно использовать SSL, и я нахожу библиотеку SSL (libSSL), которую я добавляю в качестве подмодуля.

31 октября 2010 года я создаю фиксацию в моем основном репозитории (2fd4e1), а подмодуль указывает на libSSL версии 3 (c67a2d).

Время проходит, libSSl обновляется до версии 34, я адаптирую свой код, жизнь это хорошо.

14 мая 2013 года я создаю новый код фиксации (28fced) и подмодуля к самой последней версии libSSL (849ee1).

Однако, если я проверю 2fd4e1, мой подмодуль останется на уровне 849ee1, хотя исходное коммитирование было создано c67a2d. git знает, что я сделал оригинальную фиксацию с c67a2d, и я не вижу, как вам может понадобиться другой подмодуль, чем тот, с которым была создана оригинальная коммита.

4b9b3361

Ответ 1

Похоже, что то, что вы хотите сделать, может быть достигнуто с помощью git v2.13 с новой опцией --recurse-submodules git checkout. На странице руководства git-checkout:

- [нет-] RECURSE-подмодули

Использование -recurse-subodules обновит содержимое всех инициализированных подмодулей в соответствии с фиксацией, записанной в суперпроекте. Если локальные модификации в подмодуле будут перезаписаны, проверка будет сбой, если используется значение -f. Если ничего (или --no-recurse-subodules) не используется, рабочие деревья подмодулей не будут обновляться.

См. также соответствующее git сообщение списка рассылки об этой новой опции.

Ответ 2

В основном вы хотите, чтобы git выполнял все операции рекурсивно и автоматически для всех подмодулей. Что, вероятно, тривиально в централизованной модели клиент-сервер, например svn.

Но git распространяется. Ваш подмодуль может исходить из совершенно другого URL-адреса с совершенно другим протоколом. Скорее всего, у вас нет события, у которого есть push доступ к подмодулю origin repo, в то время как вы делаете для основного репо.

Таким образом, не может быть рекурсивного нажатия.

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

Таким образом, в определенном проекте мы полностью отказались от них и вместо этого использовали слияния поддерева.

UPDATE из моего последнего комментария, потому что это важно:

Можно заметить из моего ответа, что я не знаю, почему нет рекурсивной проверки. Я не разработчик git. Я просто намекнул, что есть операции, например. push, который не может быть рекурсивным. Таким образом, разработчики, возможно, решили избежать рекурсии в подмодулях вообще для согласованности. Но кто знает? Это на самом деле загадка. Кто знает, что в голове разработчиков git? Теперь я понимаю, что мой ответ основан на МНЕНИИ! Я идиот!!! Помощь!!!!!!!!!!!