git-submodule
Название
git-submodule — инициализация, обновление и проверка подмодулей
Краткое описание
git submodule [--quiet] [--cached] git submodule [--quiet] add [<options>] [--] <repository> [<path>] git submodule [--quiet] status [--cached] [--recursive] [--] [<path>…] git submodule [--quiet] init [--] [<path>…] git submodule [--quiet] deinit [-f|--force] (--all|[--] <path>...) git submodule [--quiet] update [<options>] [--] [<path>…] git submodule [--quiet] set-branch [<options>] [--] <path> git submodule [--quiet] set-url [--] <path> <newurl> git submodule [--quiet] summary [<options>] [--] [<path>…] git submodule [--quiet] foreach [--recursive] <command> git submodule [--quiet] sync [--recursive] [--] [<path>…] git submodule [--quiet] absorbgitdirs [--] [<path>…]
Описание
Проверяет, обновляет и управляет подмодулями.
Дополнительные сведения о подмодулях см. в gitsubmodules[7].
Команды
Без аргументов показывает состояние существующих подмодулей. Для выполнения операций с подмодулями доступны несколько подкоманд.
-
add[-b<branch>] [-f|--force] [--name<name>] [--reference<repository>] [--ref-format<format>] [--depth<depth>] [--] <repository> [<path>] -
Добавляет указанный репозиторий в качестве подмодуля по указанному пути в набор изменений, который будет зафиксирован вместе с текущим проектом: текущий проект называется «суперпроектом».
<repository>— это URL репозиторияoriginнового подмодуля. Это может быть абсолютный URL или (если он начинается с./или../) путь относительно репозитория по умолчанию суперпроекта (Обратите внимание: чтобы указать репозиторийfoo.git, расположенный непосредственно рядом с суперпроектомbar.git, необходимо использовать../foo.gitвместо./foo.git— хотя при следовании правилам относительных URL можно было бы ожидать обратного, — поскольку Git обрабатывает относительные URL так же, как относительные каталоги).Удалённым репозиторием по умолчанию является удалённый репозиторий ветки текущей ветки, отслеживающей удалённую ветку. Если такой ветки, отслеживающей удалённую ветку, нет или
HEADотделена, удалённым репозиторием по умолчанию считаетсяorigin. Если для суперпроекта не настроен удалённый репозиторий по умолчанию, сам суперпроект считается его авторитетным вышестоящим репозиторием, а вместо него используется текущий рабочий каталог.Необязательный аргумент
<path>задаёт относительное расположение клонированного подмодуля в суперпроекте. Если<path>не указан, используется каноническая часть исходного репозитория (repoдля/path/to/repo.gitиfooдляhost.xz:foo/.git). Если<path>существует и уже является допустимым репозиторием Git, он добавляется в индекс для фиксации без клонирования.<path>также используется в качестве логического имени подмодуля в его конфигурационных записях, если только для задания логического имени не используется--name<name>.Указанный URL записывается в
.gitmodulesдля использования последующими пользователями, клонирующими суперпроект. Если URL задан относительно репозитория суперпроекта, предполагается, что репозитории суперпроекта и подмодуля будут храниться вместе в одном и том же относительном расположении, поэтому достаточно указать URL суперпроекта. git-submodule правильно найдёт подмодуль, используя относительный URL из.gitmodules.Если указан параметр
--ref-format<format>, формат хранения ссылок для вновь клонированных подмодулей будет установлен соответствующим образом. -
status[--cached] [--recursive] [--] [<path>...] -
Показывает состояние подмодулей. Для каждого подмодуля выводится SHA-1 текущего извлечённого коммита, путь к подмодулю и результат выполнения git-describe[1] для этого SHA-1. Перед каждым SHA-1 может стоять символ
-, если подмодуль не инициализирован,+, если текущий извлечённый коммит подмодуля не совпадает с SHA-1 в индексе содержащего его репозитория, иU, если в подмодуле имеются конфликты слияния.Если указан
--cached, команда вместо этого выводит SHA-1, записанный в суперпроекте для каждого подмодуля.Если указан
--recursive, команда рекурсивно обходит вложенные подмодули и также показывает их состояние.Если вас интересуют только изменения в текущих инициализированных подмодулях относительно коммита, записанного в индексе или
HEAD, эту информацию также предоставят команды git-status[1] и git-diff[1] (они могут также сообщить об изменениях в рабочем дереве подмодуля). -
init[--] [<path>...] -
Инициализирует подмодули, записанные в индексе (добавленные и зафиксированные в другом месте), устанавливая
submodule.$name.urlв.git/configи используя в качестве шаблона то же значение из.gitmodules. Если URL относительный, он будет разрешён с использованием удалённого репозитория по умолчанию. Если удалённый репозиторий по умолчанию отсутствует, вышестоящим считается текущий репозиторий.Необязательные аргументы
<path>ограничивают список инициализируемых подмодулей. Если путь не указан и настроен submodule.active, будут инициализированы подмодули, указанные как активные; в противном случае инициализируются все подмодули.Команда также скопирует значение
submodule.$name.update, если оно присутствует в файле.gitmodules, в.git/config, однако (1) эта команда не изменяет уже имеющиеся сведения в.git/config, и (2) по соображениям безопасности значениеsubmodule.$name.update, заданное пользовательской командой, не копируется.После этого можно настроить URL клонирования подмодулей в
.git/configдля своей локальной конфигурации и выполнитьgitsubmoduleupdate; если вы не собираетесь настраивать расположение подмодулей, можно просто использоватьgitsubmoduleupdate--init, не выполняя явно шагinit.Определение удалённого репозитория по умолчанию см. в описании подкоманды add.
-
deinit[-f|--force] (--all|[--] <path>...) -
Отменяет регистрацию указанных подмодулей, то есть удаляет весь раздел
submodule.$nameиз .git/config вместе с их рабочими деревьями. Последующие вызовыgitsubmoduleupdate,gitsubmoduleforeachиgitsubmodulesyncбудут пропускать незарегистрированные подмодули, пока они не будут инициализированы снова. Поэтому используйте эту команду, если больше не хотите иметь локальную копию подмодуля в рабочем дереве.Если команда запущена без спецификации пути, она выдаёт ошибку, а не отменяет регистрацию всех подмодулей, чтобы предотвратить ошибки.
Если указан
--force, рабочее дерево подмодуля будет удалено, даже если оно содержит локальные изменения.Если вы действительно хотите удалить подмодуль из репозитория и зафиксировать это изменение, используйте вместо этого git-rm[1]. Варианты удаления см. в gitsubmodules[7].
-
update[--init] [--remote] [-N|--no-fetch] [--[no-]recommend-shallow] [-f|--force] [--checkout|--rebase|--merge] [--reference=<repository>] [--ref-format=<format>] [--depth=<depth>] [--recursive] [--jobs<n>] [--[no-]single-branch] [--filter=<filter-spec>] [--] [<path>...] -
Обновляет зарегистрированные подмодули в соответствии с ожиданиями суперпроекта: клонирует отсутствующие подмодули, получает отсутствующие коммиты подмодулей и обновляет их рабочие деревья. Способ «обновления» зависит от параметров командной строки и значения переменной конфигурации
submodule.<name>.update. Параметр командной строки имеет приоритет над переменной конфигурации. Если не задано ни то, ни другое, выполняетсяcheckout. (Примечание: содержимое файла.gitmodulesздесь не имеет значения; о том, как используется.gitmodules, см. выше в описанииgitsubmoduleinit.) Следующие процедурыupdateподдерживаются как в командной строке, так и в конфигурацииsubmodule.<name>.update:-
checkout -
в подмодуле будет извлечён коммит, записанный в суперпроекте, в отделённом состоянии
HEAD.Если указан
--force, подмодуль будет извлечён (с использованиемgitcheckout--force), даже если коммит, указанный в индексе содержащего его репозитория, уже совпадает с извлечённым коммитом подмодуля. -
rebase -
текущая ветка подмодуля будет перебазирована на коммит, записанный в суперпроекте.
-
merge -
коммит, записанный в суперпроекте, будет влит в текущую ветку подмодуля.
Для следующих процедур обновления действуют дополнительные ограничения:
-
!<custom-command> -
механизм запуска произвольных команд с идентификатором коммита в качестве аргумента. В частности, если переменной конфигурации
submodule.<name>.updateприсвоено значение!<custom-command>, имя объекта коммита, записанного в суперпроекте для подмодуля, добавляется в конец строки<custom-command>и выполняется. Обратите внимание, что этот механизм не поддерживается в файле.gitmodulesили в командной строке. -
none -
подмодуль не обновляется. Эта процедура обновления недопустима в командной строке.
Если подмодуль ещё не инициализирован и вы хотите просто использовать настройки, сохранённые в
.gitmodules, его можно автоматически инициализировать с помощью параметра--init.Если указан
--recursive, команда рекурсивно обойдёт зарегистрированные подмодули и обновит все вложенные подмодули.Если указан параметр
--ref-format<format>, формат хранения ссылок для вновь клонированных подмодулей будет установлен соответствующим образом.Если указан параметр
--filter<filter-spec>, к подмодулю будет применен указанный фильтр частичного клонирования. Подробные сведения о спецификациях фильтров см. в git-rev-list[1]. -
-
set-branch(-b|--branch) <branch> [--] <path> -
set-branch(-d|--default) [--] <path> -
Задаёт ветку удалённого репозитория, отслеживаемую по умолчанию для подмодуля. Параметр
--branchпозволяет указать удалённую ветку. Параметр--defaultудаляет ключ конфигурацииsubmodule.<name>.branch, в результате чего отслеживаемой по умолчанию становится удалённая веткаHEAD. -
set-url[--] <path> <newurl> -
Задаёт URL указанного подмодуля равным
<newurl>. После этого конфигурация нового URL удалённого репозитория подмодуля будет автоматически синхронизирована. -
summary[--cached|--files] [(-n|--summary-limit) <n>] [commit] [--] [<path>...] -
Показывает сводку коммитов между указанным коммитом (по умолчанию
HEAD) и рабочим деревом/индексом. Для рассматриваемого подмодуля показывается последовательность коммитов в нём между указанным коммитом суперпроекта и индексом или рабочим деревом (выбор задаётся параметром--cached). Если указан параметр--files, показывается последовательность коммитов в подмодуле между индексом суперпроекта и рабочим деревом подмодуля (с этим параметром нельзя использовать параметр--cachedили указывать явный коммит).Эту информацию также можно получить, используя параметр
--submodule=logкоманды git-diff[1]. -
foreach[--recursive] <command> -
Выполняет произвольную команду оболочки
<command>в каждом извлечённом подмодуле. Команде доступны переменные$name,$sm_path,$displaypath,$sha1и$toplevel:-
$name -
имя соответствующего раздела подмодуля в
.gitmodules -
$sm_path -
путь к подмодулю, записанный в непосредственном суперпроекте
-
$displaypath -
относительный путь от текущего рабочего каталога до корневого каталога подмодулей
-
$sha1 -
коммит, записанный в непосредственном суперпроекте
-
$toplevel -
абсолютный путь к корневому каталогу непосредственного суперпроекта.
Обратите внимание: чтобы избежать конфликтов с
$PATHв Windows, переменная$pathтеперь является устаревшим синонимом переменной$sm_path. Эта команда игнорирует все подмодули, определённые в суперпроекте, но не извлечённые. Если не указан параметр--quiet, foreach выводит имя каждого подмодуля перед выполнением команды. Если указан параметр--recursive, подмодули обходятся рекурсивно (то есть указанная команда оболочки также выполняется во вложенных подмодулях). Ненулевой код возврата команды в любом подмодуле приводит к прекращению обработки. Это поведение можно переопределить, добавив ||:в конец команды.Например, приведённая ниже команда покажет путь и текущий извлечённый коммит для каждого подмодуля:
git submodule foreach 'echo $sm_path `git rev-parse HEAD`'
-
-
sync[--recursive] [--] [<path>...] -
Синхронизирует настройку URL удалённого репозитория подмодулей со значением, указанным в
.gitmodules. Команда затрагивает только те подмодули, для которых уже имеется запись URL в.git/config(так происходит после их инициализации или добавления). Это полезно, когда URL подмодулей меняются в вышестоящем репозитории и требуется соответствующим образом обновить локальные репозитории.gitsubmodulesyncсинхронизирует все подмодули, аgitsubmodulesync--Aсинхронизирует только подмодульA.Если указан
--recursive, команда рекурсивно обойдёт зарегистрированные подмодули и синхронизирует все вложенные подмодули. -
absorbgitdirs -
Если каталог Git подмодуля находится внутри самого подмодуля, перемещает этот каталог Git в путь
$GIT_DIR/modulesсуперпроекта, а затем связывает каталог Git с рабочим каталогом, устанавливаяcore.worktreeи добавляя файл.git, указывающий на каталог Git, размещённый внутри каталога Git суперпроекта.У клонированного независимо, а затем добавленного в качестве подмодуля репозитория, а также в старых конфигурациях каталог Git подмодуля находится внутри самого подмодуля, а не встроен в каталог Git суперпроекта.
По умолчанию эта команда выполняется рекурсивно.
Параметры
-
-q -
--quiet -
Выводить только сообщения об ошибках.
-
--progress -
По умолчанию сообщать о ходе выполнения в стандартный поток ошибок, если он подключён к терминалу, кроме случаев, когда указан параметр
-q. Этот флаг принудительно включает отображение хода выполнения, даже если стандартный поток ошибок не направлен в терминал. Допустимо использовать только с командамиaddиupdate. -
--all -
Отменить регистрацию всех подмодулей в рабочем дереве. Этот параметр допустимо использовать только с командой
deinit. -
-b<branch> -
--branch=<branch> -
Ветка репозитория, добавляемого в качестве подмодуля. Имя ветки записывается как
submodule.<name>.branchв.gitmodulesдляupdate--remote. Специальное значение.указывает, что имя ветки в подмодуле должно совпадать с именем текущей ветки в текущем репозитории. Если параметр не указан, используется удалённая веткаHEAD. -
-f -
--force -
Принудительно выполнить команду, даже если в противном случае она завершилась бы с ошибкой. Этот параметр допустимо использовать только с командами
add,deinitиupdate.-
add -
разрешить добавление пути подмодуля, который в противном случае был бы проигнорирован. Этот параметр также используется для обхода проверки, что имя подмодуля ещё не занято. По умолчанию команда
gitsubmoduleaddзавершится с ошибкой, если предложенное имя (которое определяется по пути) уже зарегистрировано для другого подмодуля в репозитории. Параметр--forceпозволяет продолжить выполнение команды: к конфликтующему имени автоматически добавляется номер, чтобы получить уникальное имя (например, если существует подмодуль с именемchild, будет предпринята попытка использоватьchild1и так далее). -
deinit -
рабочие деревья подмодулей будут удалены, даже если в них есть локальные изменения.
-
update -
(действует только при использовании процедуры checkout) отбрасывать локальные изменения в подмодулях при переключении на другой коммит; всегда выполнять checkout в подмодуле, даже если коммит, указанный в индексе содержащего его репозитория, совпадает с коммитом, на который переключён подмодуль.
-
-
--cached -
Для определения коммита использовать индекс, а не
HEAD. Этот параметр допустимо использовать только с командамиstatusиsummary. -
--files -
Заставляет команду
summaryсравнивать коммит в индексе с коммитом вHEADподмодуля. -
-n<n> -
--summary-limit=<n> -
Ограничить размер сводки
summary(общее количество отображаемых коммитов) значением<n>. Значение 0 отключает сводку; отрицательное число означает отсутствие ограничений (по умолчанию). Это ограничение применяется только к изменённым подмодулям. Для добавленных, удалённых и сменивших тип подмодулей размер всегда ограничен значением 1. -
--remote -
Вместо SHA-1, записанного суперпроектом, для обновления подмодуля использовать состояние его ветки отслеживания удалённого репозитория. Этот параметр допустимо использовать только с командой
update. Используется удалённый репозиторий ветки (branch.<name>.remote); по умолчанию —origin. По умолчанию используется удалённая веткаHEAD, но её имя можно переопределить, задав параметрsubmodule.<name>.branchв.gitmodulesили.git/config(приоритет имеет.git/config).Этот параметр работает с любой из поддерживаемых процедур обновления (
--checkout,--rebaseи т. д.). Меняется только источник целевого SHA-1. Например,submoduleupdate--remote--mergeобъединит изменения подмодулей из вышестоящего репозитория с подмодулями, аsubmoduleupdate--mergeобъединит изменения gitlink суперпроекта с подмодулями.Чтобы использовать актуальное состояние отслеживаемой ветки, команда
update--remoteперед вычислением SHA-1 получает данные из удалённого репозитория подмодуля. Если получать данные не нужно, используйтеsubmoduleupdate--remote--no-fetch.Используйте этот параметр, чтобы интегрировать изменения вышестоящего подпроекта в текущую
HEADподмодуля. Также можно выполнить командуgitpullиз подмодуля; она эквивалентна, за исключением имени удалённой ветки:update--remoteиспользует репозиторий по умолчанию, из которого получены изменения, иsubmodule.<name>.branch, аgitpull—branch.<name>.mergeподмодуля. Предпочтительнее использоватьsubmodule.<name>.branch, если нужно распространять ветку вышестоящего репозитория по умолчанию вместе с суперпроектом, иbranch.<name>.merge, если вы хотите работать непосредственно в подмодуле в более привычном режиме. -
-N -
--no-fetch -
Не получать новые объекты с удалённого сайта. Этот параметр допустимо использовать только с командой
update. -
--checkout -
Переключиться на коммит, записанный в суперпроекте, в подмодуле с отделённым указателем
HEAD. Этот параметр допустимо использовать только с командойupdate. Это поведение используется по умолчанию; параметр нужен главным образом для переопределенияsubmodule.<name>.update, если ему задано значение, отличное отcheckout. Если ключsubmodule.<name>.updateявно не задан или имеет значениеcheckout, этот параметр применяется неявно. -
--merge -
Объединить коммит, записанный в суперпроекте, с текущей веткой подмодуля. Этот параметр допустимо использовать только с командой
update. При его указанииHEADподмодуля не будет отделён. Если из-за ошибки слияния продолжить процесс не удастся, разрешите возникшие конфликты в подмодуле с помощью обычных средств разрешения конфликтов. Если для ключаsubmodule.<name>.updateзадано значениеmerge, этот параметр применяется неявно. -
--rebase -
Перебазировать текущую ветку на коммит, записанный в суперпроекте. Этот параметр допустимо использовать только с командой
update.HEADподмодуля не будет отделён. Если из-за ошибки слияния продолжить процесс не удастся, разрешите возникшие проблемы с помощью git-rebase[1]. Если для ключаsubmodule.<name>.updateзадано значениеrebase, этот параметр применяется неявно. -
--init -
Перед обновлением инициализировать все подмодули, для которых ещё не вызывалась команда
gitsubmoduleinit. Этот параметр допустимо использовать только с командойupdate. -
--name=<name> -
Задать подмодулю указанное имя вместо имени, определяемого по умолчанию на основе его пути.
<name>должно быть допустимым именем каталога и не должно оканчиваться на/. -
--reference=<repository> -
Передать локальный репозиторий
<repository>в качестве источника ссылок при клонировании подмодуля. Этот параметр допустимо использовать только с командамиaddиupdate. Иногда этим командам требуется клонировать удалённый репозиторий. В таком случае данный параметр будет передан команде git-clone[1].ПримечаниеНе используйте этот параметр, не прочитав внимательно примечание к параметрам --reference,--sharedи--dissociateкоманды git-clone[1]. -
--dissociate -
После клонирования из ссылочного репозитория больше не использовать его. Этот параметр допустимо использовать только с командами
addиupdate. Иногда этим командам требуется клонировать удалённый репозиторий. В таком случае данный параметр будет передан команде git-clone[1].ПримечаниеСм. примечание выше к параметру --reference. -
--recursive -
Рекурсивно обходить подмодули. Этот параметр допустимо использовать только с командами
foreach,update,statusиsync. Операция выполняется не только в подмодулях текущего репозитория, но и во всех вложенных подмодулях внутри них (и так далее). -
--depth=<depth> -
Создать неглубокий клон
shallowс историей, ограниченной<depth>ревизиями. Этот параметр допустимо использовать с командамиaddиupdate. См. git-clone[1] -
--recommend-shallow -
--no-recommend-shallow -
Рекомендовать или не рекомендовать неглубокое клонирование подмодулей. Этот параметр допустимо использовать только с командой
update. При первоначальном клонировании подмодуля по умолчанию используется рекомендуемое значениеsubmodule.<name>.shallow, указанное в файле.gitmodules. Чтобы игнорировать рекомендации, используйте--no-recommend-shallow. -
-j<n> -
--jobs=<n> -
Клонировать новые подмодули параллельно, используя
<n>заданий. Этот параметр допустимо использовать только с командойupdate. По умолчанию используется значение параметраsubmodule.fetchJobs. -
--single-branch -
--no-single-branch -
При обновлении клонировать только одну ветку:
HEADили ветку, указанную параметром--branch. Этот параметр допустимо использовать только с командойupdate. - <path>...
-
Пути к подмодулям. Если они указаны, команда будет работать только с подмодулями, расположенными по указанным путям. (Этот аргумент обязателен для
add).
Файлы
При инициализации подмодулей для определения URL каждого из них используется файл .gitmodules в каталоге верхнего уровня содержащего репозитория. Формат этого файла должен совпадать с форматом $GIT_DIR/config. Ключ URL каждого подмодуля — submodule.<name>.url. Подробности см. в gitmodules[5].
См. также
submodule
© 2005–2026 Linus Torvalds and others
Licensed under the GNU General Public License version 2.
https://git-scm.com/docs/git-submodule