Кто-нибудь, пожалуйста, помогите мне понять подмодули в 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, и я не понимаю, как вам может понадобиться другой подмодуль, кроме того, с которым была создана исходная фиксация.
git checkout
, чтобы он также выполнял соответствующие действия подмодуля, я бы не хотел, чтобы он был включен по умолчанию ... - person twalberg   schedule 11.03.2014git submodule init foo
, вероятно, должен быть аналогиченgit clone foo
, если foo не является URL-адресом. И если пользователь хочет сделать что-то более сложное, чем клонирование или оформление заказа, он может простоcd foo
и вызвать git в обычном режиме. Это, вероятно, сделало бы все эти непонятные команды интуитивно понятными и простыми в использовании. - person VinGarcia   schedule 11.02.2017