В чем смысл "git submodule init"?

фон

чтобы заполнить подмодули репозитория, one как правило, вызывает:

git submodule init
git submodule update

в этом случае git submodule init Кажется, делает только одно: заполнить .git/config С информацией, которая уже находится в .gitmodules.

какой в этом смысл?

не мог git submodule update просто используйте информацию из .gitmodules? Это позволило бы избежать обоих:

  • ненужную команду (git submodule init); и
  • ненужное дублирование данных (.gitmodules содержание в .git/config).

вопрос

либо:

  • есть варианты использования для git submodule init этого я не знаю (в таком случае, пожалуйста, просветите меня!); иначе
  • git submodule init - это cruft, который может быть устаревшим в Git без какого-либо вреда.

что из этого правда?

2 ответов


представьте, что в репозитории есть 10 подмодулей, и вас интересуют только 2 из них. В таком случае вы можете время от времени получать обновления только из этих 2 подмодулей из удаленного репозитория. git init хорошо работает для этого, потому что после выполнения команды git init для этих 2 подмодулей,git submodule update --remote относится только к ним.

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


добавлена демонстрация двух рабочих процессов.

Workflow1: подмодули-это библиотеки, которые используют несколько проектов.

я думаю, что это один из распространенных случаев использования.

вы только что клонировали "мой проект".

git clone https://example.com/demo/my-project  

и поверхность своей структуры подобна ниже.
enter image description here

содержание .gitmodules

[submodule "lib1"]
    path = lib1
    url = https://example.com/demo/lib1
[submodule "lib2"]
    path = lib2
    url = https://example.com/demo/lib2
[submodule "lib3"]
    path = lib3
    url = https://example.com/demo/lib3
[submodule "lib4"]
    path = lib4
    url = https://example.com/demo/lib4

вы хотите рефакторинг кода code1.js который ссылается на lib1 и lib2, что означает, что вам не нужно клонировать и проверять lib3 и lib4. Поэтому вы просто запустите команду ниже.

git submodule init lib1 lib2

теперь давайте посмотрим на содержание .git/config

...
[submodule "lib1"]
    active = true
    url = https://example.com/demo/lib1
[submodule "lib2"]
    active = true
    url = https://example.com/demo/lib2

это означает что-то вроде "готов обновить lib1 и lib2 от example.com/demo".
На данный момент каталоги lib1 и lib2 пусты.
Вы можете клонировать и проверять lib1 и lib2 с помощью одной команды.

git submodule update

теперь вы можете рефакторинг code1.js без ошибок импорта.
Подмодули - это просто ссылки на определенные коммиты. Поэтому, когда вы хотите обновить библиотеки до новых версий, вам нужно обновить ссылки. Вы можете сделать это с помощью команды ниже.

git submodule update --remote

теперь вы можете видеть, насколько полезно инициализировать только необходимые подмодули.

Workflow 2: Каждый подмодуль является проектом, и один большой верхний проект включает их.

я поклонник этого.

вы клонируете "main-project".

git clone https://example.com/demo/main-project  

и поверхность своей структуры подобна ниже.
enter image description here

вы можете увидеть каталог с именем "shared". В этом рабочем процессе есть правило: если вы хотите использовать общие коды main-project в своем проекте, вы должны создать проект как подмодуль main-project.
Мне нравится помещать классы сущностей в общий каталог, как показано ниже.

enter image description here

вернуться к рабочему процессу подмодуля, содержимое .gitmodules, как показано ниже.

[submodule "sub-project1"]
    path = sub-project1
    url = https://example.com/demo/sub-project1
[submodule "sub-project2"]
    path = sub-project2
    url = https://example.com/demo/sub-project2
[submodule "sub-project3"]
    path = sub-project3
    url = https://example.com/demo/sub-project3
[submodule "sub-project4"]
    path = sub-project4
    url = https://example.com/demo/sub-project4

на этот раз вы хотите, чтобы отрефакторить код в общий справочник главного-проекта и вы знаете, что только суб-project1 и суб-проект2 ссылка общий код, который означает, что вам не нужно клонировать и проверка суб-project3 и суб-project4. Поэтому вы просто запустите команду ниже.

git submodule init sub-project1 sub-project2

и как я упомянутый в workflow1, вам нужно запустить приведенную ниже команду для клонирования и проверки их.

git submodule update

и git submodule update --remote в этом случае? Или даже мне нужно инициализировать и обновлять подмодули для рефакторинга кода в общем каталоге? Да, потому что вам нужно запускать тесты в подмодулях после рефакторинга общего кода, и если какие-либо обновления подмодулей фиксируются и передаются в удаленный репозиторий во время рефакторинга, вам нужно получить их git submodule update --remote.

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


чтение git submodule документация, есть is прецедент, который якобы оправдывает существование git submodule init как отдельная команда.

если пользователь, клонировавший репозиторий, хочет использовать для подмодуля другой URL-адрес, чем указан в вышестоящем репозитории, то этот пользователь может:

git submodule init
vim .git/config # Alter submodule URL as desired, without changing .gitmodules
                # or polluting history.
git submodule update