Чому оновлення підмодуля git не відбувається автоматично при оплаті git?


78

При переключенні гілок за допомогою git checkout я б припустив, що більшу частину часу ви хотіли б оновити свої підмодулі.

  • У якій ситуації ви не хочете оновлювати підмодулі після перемикання?
  • Що би зламалося, якби це було зроблено автоматично за допомогою перевірки git?

Оновлено з прикладом:

  • Відділення A має підмодуль S на 3852f1
  • Гілка B має підмодуль S на fd72d7

На гілці A перевірка git B призведе до робочої копії гілки B з підмодулем S за номером 3852f1 (із модифікованим S). оновлення підмодуля git перевірить S на fd72d7.



2
я згоден з тобою. Я працюю з проектом з підмодулями, і після кожного витягування я повинен виконувати оновлення підмодуля git, але це в більшості випадків непотрібне. Єдина причина для цього - це не пропустити, коли один із підмодулів насправді був оновлений.
Євген Бодунов

Відповіді:


26

Я вважаю, що підмодулі, які не оновлюються автоматично, відповідають цілям розвитку Git. Git призначений для роботи в розподіленому режимі і не припускає, що ви навіть можете підключитися до нелокального сховища, якщо вам це прямо не сказано. Якщо не думати про автоматичне оновлення підмодуля, це буде очікуваною поведінкою, якщо думати про це.

З урахуванням цього, якщо ви знаєте, що ви завжди хочете, щоб ці підмодулі були втягнуті, і ви знаєте, що ніколи не відгалужували б ці підмодулі до іншого локального сховища, то це не повинно нічого зламати, якщо ви автоматично оновили їх після замовлення.


49
Я думаю, що git checkout повинен просто скаржитися, якщо коміт для підмодуля був недоступний, замість того, щоб залишати робочий каталог у невідповідному стані за замовчуванням. Тоді ви можете зробити оновлення підмодуля git, щоб отримати згаданий коміт. Знову ж таки, як правило, коміт буде доступний, і оформлення замовлення можна здійснити без будь-якого доступу до мережі. Приймаючи вашу відповідь, оскільки це звучить розумно (але мені це не подобається;)
серба

2
Я відстоюю думку, що git повинен спробувати зробити підмодуль init та оновити початкову перевірку, скаржитися та показувати статус, якщо існує підмодуль, який не був витягнутий локально вперше. Після того, як ви це отримаєте, поняття необхідності явного оновлення має сенс, оскільки репозиторії є різними, а підмодуль посилається на конкретний коміт. Але навіть у розподіленому світі, де він міг бути недоступним, ви, швидше за все, захочете його в якийсь момент, і git повинен повідомити, що його ніколи не витягували.
cclark

6
git fetchмає опцію автоматичного отримання підмодулів, тому я також думаю, що checkout повинен мати подібну опцію для автоматичного оновлення / перевірки підмодулів.
void.pointer

3
"Якщо Git не автоматично оновлює підмодуль, це буде очікуваною поведінкою, якщо думати про це". - Не розумію чому. Дійсно, я не бачу, як будь-який з пунктів у вашому першому абзаці має якесь відношення до того, чи повинен Git автоматично намагатися оновити підмодулі під час витягування.
Mark Amery

2
Git не припускає, що у вас є доступ до сховища, з якого ви реєструвались, коли ви хочете виконувати роботу над сховищем. Натомість, після клонування ваш репозиторій може діяти повністю самостійно. Якщо початковим припущенням є те, що ви підключаєтесь до іноземних сховищ лише тоді, коли вам це пропонують, то виявляється, що Git не повинен автоматично оновлювати підмодуль, що я намагався передати.
Аарон,

34

git checkout --recurse-submodules було додано до git 2.13

Про це згадується в примітках до випуску за адресою: https://github.com/git/git/commit/e1104a5ee539408b81566066aaa6963cb87d5cd6#diff-c24776ff22455a30fbb78e378b7df0b0R139

submodule.recurse опція була додана до git 2.14

Встановити як:

git config --global submodule.recurse true

man git-config каже:

Вказує, чи команди повторюються у підмодулі за замовчуванням. Це стосується всіх команд, які мають --recurse-submodulesопцію. За замовчуванням значення false.

Я вважаю, що не оновлювати модулі за замовчуванням є поганою поведінкою Git за замовчуванням, що суперечить очікуванням більшості користувачів і обмежує прийняття підмодулів, я справді бажаю, щоб розробники це змінили.


2
submodule.recurseздається, це працює, починаючи з git 2.14.
Кейн

2
Я submodule.recurseприступив true, але я виявляю, що ще є випадки (перескакуючи туди-сюди через додавання підмодуля, я думаю?), Коли я повинен робити git submodule update --init --recursiveпісля мого git checkout. Чи є спосіб зробити це автоматично?
Бен,

2

З Git 2.27 (Q2 2020) --recurse-submodulesваріант " " краще документований.

Див. Коміт acbfae3 , коміт 4da9e99 , коміт d09bc51 , коміт b3cec57 , коміт dd0cb7d (06 квітня 2020 р.) Демієном Робертом ( damiens-robert) .
(Об’єднано Junio ​​C Hamano - gitster- у коміті cc908db , 28 квітня 2020 р.)

doc: --recurse-submodulesздебільшого стосується активних підмодулів

Підписав: Демієн Роберт
Допоміг: Філіпп Блейн

Документація посилається на "ініціалізовані" або "заповнені" підмодулі, щоб пояснити, на які підмодулі впливає ' --recurse-submodules', але справжньою термінологією тут є activeпідмодулі ' '. Відповідно оновіть документацію.

Деякі терміни:

  • Актив визначається у gitsubmodules (7) , він включає лише змінні конфігурації 'submodule.active', 'submodule.<name>.active' та 'submodule.<name>.url'.
    Функціяsubmodule.c::is_submodule_activeперевіряє, чи активний підмодуль.
  • Заселених означає , що робота дерево підмодуля в присутній (і gitfile правильно вказує на сховище субмодуля), тобто або суперпроект був клонований з --recurse-submodulesабо СРД користувачем git submodule update --init, або git submodule init [<path>]і по git submodule update [<path>]окремо , які населяли робоче дерево подмодуль.
    Це не включає 3 змінні конфігурації вище.
  • Ініціалізований (принаймні в контексті сторінок довідок, задіяних у цьому патчі) означає як "заповнені", так і "активні", як визначено вище, тобто те, що робить [оновлення підмодуля git --init ](https://git-scm.com/docs/git-submodule).

--recurse-submodulesВаріант головним чином впливає на активні підмодулі.

Виняток становить git fetchваріант, коли параметр впливає на заповнені підмодулі.
Як наслідок, git pull --recurse-submodulesвибірка впливає на заповнені підмодулі, але отримане оновлення робочого дерева впливає лише на активні підмодулі.

У документації git-pull, давайте розрізняти частину завантаження, яка впливає на заповнені підмодулі, та оновлення робочих дерев, яке впливає лише на активні підмодулі.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.