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

Как обновить только определенные подмодули git?

Итак, обновление всех моих подмодулей выполняется путем запуска

git submodule foreach 'git pull origin master'

Как обновить определенный подмодуль, расположенный в строке bundle/syntastic, без обновления каких-либо других подмодулей?

4b9b3361

Ответ 1

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

Итак, в надежде помочь некоторым другим, подобным мне, ответ на вопрос:

git submodule update <specific path to submodule>

который поместит этот подмодуль в состояние ref, записанное в супер-репо.

Ответ 2

Собственно, правильный синтаксис:

$ git clone <remote.git>
$ cd <remote>
$ git submodule update --init -- <specific relative path to submodule>

Ответ 3

Если вы только что клонировали репо с подмодулями, вы можете клонировать определенный подмодуль с помощью:

git submodule update --init submoduleName

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

Ответ 4

Из документации подмодуля git

--remote Эта опция действительна только для команды обновления. Вместо того, чтобы использовать суперпроекты, записанные SHA-1, для обновления субмодуля, используйте статус ветки удаленного отслеживания субмодулей. Используется удаленный филиал (branch..remote), по умолчанию используется источник.

Для обновления конкретного подмодуля вы можете использовать:

git submodule update --remote <path to the submodule>

В вашем случае это должно быть:

git submodule update --remote bundle/syntastic

Ответ 5

Как мне обновить конкретный подмодуль, расположенный, скажем, в bundle/syntastic, без обновления каких-либо других подмодулей?

С помощью Git 2.13 (и с помощью submodule.<name>.update config):

git clone --recurse-submodules="bundle/syntastic"
git config submodule.syntastic.update "git pull origin master"

Вторая строка (должна выполняться только один раз) необходима, потому что команда clone --recurse-submodules[=<pathspec] эквивалентна выполнению git submodule update --init --recursive <pathspec> сразу после завершения клона.
И это только оформило бы подмодуль в его записанном SHA1 gitlink, а не в самом последнем SHA1 удаленного origin/master.
Добавляя submodule.<name>.update конфигурации submodule.<name>.update, вы гарантируете, что за выборочным клоном подмодуля последует обновление, только для этого подмодуля.


В рамках функции активного субмодуля Git 2.13 (Q2 2017) (см. " Игнорировать новые коммиты для git submodule ") у вас есть этот коммит bb62e0a от Брэндона Уильямса (bmwill):

clone: научить --recurse-submodules опционально использовать спецификацию пути

Научите --recurse-submodules опционально принимать аргумент pathspec, который описывает, какие подмодули должны быть рекурсивно инициализированы и клонированы.
Если путь не указан, --recurse-submodules будут рекурсивно инициализировать и клонировать все подмодули, используя путь по умолчанию " . ".
Для построения более сложных спецификаций пути --recurse-submodules могут быть заданы несколько раз.

Это также настраивает " submodule.active опцию" конфигурации быть дано pathspec, таким образом, что любое будущее вызов git submodule update будет идти в ногу с pathspec.

Кроме того, переключатель " --recurse " удален из документации, а также помечен как скрытый в массиве опций, чтобы упростить опции для подмодулей. Простое " --recurse " не передает то, что повторяется, например, оно может означать каталоги или деревья (см. ls-tree).
Во многих других командах у нас уже есть " --recurse-submodules ", что означает повторение в подмодули, поэтому рекламируйте это написание здесь как подлинную опцию.

Итак, страница руководства git clone --recursive теперь гласит:

--recurse-submodules[=<pathspec]:

После того, как клон создан, инициализируйте и клонируйте подмодули в пределах на основе предоставленной спецификации пути.

Если путь не указан, все подмодули инициализируются и клонируются.

Подмодули инициализируются и клонируются с использованием настроек по умолчанию.
Полученный клон имеет submodule.active набор к предоставленной pathspec, или " " (то есть все подмодули), если нет pathspec не предусмотрено. .
Это эквивалентно запуску git submodule update --init --recursive сразу после завершения клона. Эта опция игнорируется, если клонированное хранилище не имеет рабочего дерева/извлечения (т.е. Если задано какое-либо из --no-checkout/-n, --bare или --mirror)

Пример из теста t/t7400-submodule-basic.sh:

git clone --recurse-submodules="." \
          --recurse-submodules=":(exclude)sub0" \
          --recurse-submodules=":(exclude)sub2" \
          multisuper multisuper_clone

Это было бы клонировать и обновлять каждые подмодулях, кроме sub0 и sub2.


Бонус с Git 2.22 (Q2 2019) " git clone --recurs " работает лучше.

См. Коммит 5c38742 (29 апреля 2019 г.) Нгуен Тай pclouds Дуй (pclouds).
(Объединено Junio C Hamano - gitster - в коммите 2cfab60, 19 мая 2019 г.)

parse-options: не выдавать "неоднозначную опцию" для псевдонимов

Измените механизм разбора параметров, чтобы, например, " clone --recurs... " не clone --recurs... ошибку, потому что " clone " понимает и " --recursive ", и " --recurse-submodules ", чтобы означать одно и то же.

Первоначально "клон" просто понимал --recursive до тех пор, пока --recurses-submodules был добавлен в ccdd3da (" clone: добавить --recurse-submodules качестве псевдонима для --recursive ", 2010-11-04, Git v1.7.4-RC0).
Поскольку bb62e0a (" clone: обучить --recurse-submodules при необходимости указывать путь", 2017-03-17, Git v2.13.0-rc0), более длинная форма была переведена в стандартную.

Но из-за того, как работает механизм разбора опций, это привело к довольно абсурдной ситуации:

$ git clone --recurs [...]
error: ambiguous option: recurs (could be --recursive or --recurse-submodules)

Добавьте OPT_ALIAS() чтобы выразить эту связь между двумя или более опциями и использовать ее в git-clone.