Защо `git checkout` не прави автоматично `git submodule update --recursive`?

Моля, някой да ми помогне да разбера подмодулите в git. Знам, че получават много удари в интернет, но тъй като предполагам, че разработчиците на git са умни хора, трябва да има причина за текущото поведение - и може би начин да заобиколя проблема си.

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

  • MyApp_version2
  • MyApp_version3
  • MyApp_version4
  • MyApp_litversion
  • 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 и не виждам как бихте могли да искате друг подмодул освен този, с който е създаден оригиналният комит.


person Markus    schedule 11.03.2014    source източник
comment
Може би само проверявате различни ангажименти, за да прегледате как изглеждат определени неща в различни моменти - наистина ли искате да чакате всички подмодули да се актуализират всеки път? Въпреки че бих се съгласил, че може да е хубаво да има опция за git checkout, която да го накара да прави и подходящите неща на подмодула, не бих искал да е активиран по подразбиране...   -  person twalberg    schedule 11.03.2014
comment
Можете да създадете псевдоним за Git, който автоматично ще актуализира подмодулите. Вижте stackoverflow.com/a/4611550/994153   -  person Colin D Bennett    schedule 10.10.2014
comment
Имах проблем да открия как да направя плащане с включен подмодул. Заглавието на този въпрос реши проблема ми. Чудя се защо това е толкова неясно.   -  person Brent Bradburn    schedule 25.02.2015
comment
Вярвам, че всички команди на подмодула * трябва да бъдат заменени с други съществуващи команди, напр.: git submodule init foo вероятно трябва да е аналогично на git clone foo, ако foo не е url. И ако потребителят иска да направи нещо по-сложно от клониране или плащане, той може просто да cd foo и да извика git нормално. Това вероятно ще направи всички тези неясни команди интуитивни и лесни за използване.   -  person VinGarcia    schedule 11.02.2017


Отговори (3)


Изглежда, че това, което искате да направите, може да бъде постигнато от git v2.13 нататък с новата опция --recurse-submodules на git checkout. От страницата с ръководство за git-checkout:

--[no-]recurse-submodules

Използването на --recurse-submodules ще актуализира съдържанието на всички инициализирани подмодули според ангажимента, записан в суперпроекта. Ако локалните модификации в подмодул бъдат презаписани, проверката ще бъде неуспешна, освен ако не се използва -f. Ако не се използва нищо (или --no-recurse-submodules), работните дървета на подмодулите няма да бъдат актуализирани.

Вижте също това съответно съобщение от git пощенския списък за тази нова опция.

person Cyril Cressent    schedule 13.06.2017
comment
Можете да зададете това да бъде поведението по подразбиране от 2.14.0 с git config --global submodule.recurse true - person codehearts; 20.03.2018

Опростете своя пряк път/псевдоними, като използвате:

alias checkitout='git checkout $1; git submodule update --recursive'
person thomas bogard    schedule 21.02.2019

По принцип искате git да извършва всички операции рекурсивно и автоматично за всички подмодули. Което вероятно е тривиално в централизиран клиент-сървър модел като svn.

Но git се разпространява. Вашият подмодул може да идва от напълно различен URL, с напълно различен протокол. Най-вероятно нямате push достъп до origin репото на подмодула, докато имате за основното репо.

Така че не може да има рекурсивно натискане.

Следователно дизайнерите вероятно са решили да избегнат автоматичната рекурсия за подмодули навсякъде. Което е последователно, но с огромно количество болка.

Толкова много, че в определен проект ние напълно ги изоставихме и вместо това използвахме сливания на поддърво.

person SzG    schedule 11.03.2014
comment
Въобще не! Добавих пример. Това няма нищо общо с натискането към отдалечено хранилище. Проблемът е: Да кажем, че разработвам Firefox. В firefox версия 3 използвам libSSL версия 1 (като подмодул). По-късно във firefox 24 използвам libSSL версия 4. Ако проверя отново версия 3 на Firefox, защо libSSL остава във версия 4, когато git знае, че трябва да е версия 1. FIrefox версия 3 не знае нищо за libSSL версия 4, тъй като беше издаден години след създаването на оригиналния комит - person Markus; 11.03.2014
comment
Отново. Няма автоматична рекурсия в подмодули. някога. За последователност. Вероятно. Може би. Кой знае. - person SzG; 11.03.2014
comment
въпросът е за плащането, няма причина да не можете да направите recursvive плащане. Разбира се, натискането би било невъзможно. Въпросът е защо трябва да направите git checkout someoldrev && git submodule update, защото почти никога няма причина да напуснете предишния подмодул. - person Karl P; 16.07.2016