Setup and Config
Getting and Creating Projects
Basic Snapshotting
Branching and Merging
Sharing and Updating Projects
Inspection and Comparison
Patching
Debugging
External Systems
Server Admin
Guides
- gitattributes
- Command-line interface conventions
- Everyday Git
- Frequently Asked Questions (FAQ)
- Glossary
- Hooks
- gitignore
- gitmodules
- Revisions
- Submodules
- Tutorial
- Workflows
- All guides...
Administration
Plumbing Commands
-
2.54.0
2026-04-20
- 2.53.0 no changes
-
2.52.0
2025-11-17
- 2.51.1 → 2.51.2 no changes
-
2.51.0
2025-08-18
- 2.47.1 → 2.50.1 no changes
-
2.47.0
2024-10-06
- 2.44.1 → 2.46.4 no changes
-
2.44.0
2024-02-23
- 2.42.1 → 2.43.7 no changes
-
2.42.0
2023-08-21
- 2.36.1 → 2.41.3 no changes
-
2.36.0
2022-04-18
- 2.28.1 → 2.35.8 no changes
-
2.28.0
2020-07-27
- 2.26.1 → 2.27.1 no changes
-
2.26.0
2020-03-22
- 2.25.2 → 2.25.5 no changes
-
2.25.1
2020-02-17
-
2.25.0
2020-01-13
- 2.24.1 → 2.24.4 no changes
-
2.24.0
2019-11-04
- 2.22.1 → 2.23.4 no changes
-
2.22.0
2019-06-07
- 2.19.1 → 2.21.4 no changes
-
2.19.0
2018-09-10
- 2.18.1 → 2.18.5 no changes
-
2.18.0
2018-06-21
- 2.17.0 → 2.17.6 no changes
-
2.16.6
2019-12-06
- 2.15.4 no changes
-
2.14.6
2019-12-06
-
2.13.7
2018-05-22
-
2.12.5
2017-09-22
- 2.11.4 no changes
-
2.10.5
2017-09-22
-
2.9.5
2017-07-30
-
2.8.6
2017-07-30
- 2.7.6 no changes
-
2.6.7
2017-05-05
- 2.5.6 no changes
-
2.4.12
2017-05-05
-
2.3.10
2015-09-28
- 2.1.4 → 2.2.3 no changes
-
2.0.5
2014-12-17
НАЗВАНИЕ
git-submodule - Инициализация, обновление или проверка подмодулей
ОБЗОР
gitsubmodule[--quiet] [--cached]gitsubmodule[--quiet]add[<параметры>] [--] <репозиторий> [<путь>]gitsubmodule[--quiet]status[--cached] [--recursive] [--] [<путь>…​]gitsubmodule[--quiet]init[--] [<путь>…​]gitsubmodule[--quiet]deinit[-f|--force] (--all|[--] <путь>...)gitsubmodule[--quiet]update[<параметры>] [--] [<путь>…​]gitsubmodule[--quiet]set-branch[<параметры>] [--] <путь>gitsubmodule[--quiet]set-url[--] <путь> <новый-url>gitsubmodule[--quiet]summary[<параметры>] [--] [<путь>…​]gitsubmodule[--quiet]foreach[--recursive] <команда>gitsubmodule[--quiet]sync[--recursive] [--] [<путь>…​]gitsubmodule[--quiet]absorbgitdirs[--] [<путь>…​]
ОПИСАНИЕ
Проверяет, обновляет и управляет подмодулями.
Дополнительную информацию о подмодулях см. в gitsubmodules[7].
КОМАНДЫ
Без аргументов показывает состояние существующих подмодулей. Доступно несколько подкоманд для выполнения операций с подмодулями.
-
add[-b<ветка>] [-f|--force] [--name<имя>] [--reference<репозиторий>] [--ref-format<формат>] [--depth<глубина>] [--] <репозиторий> [<путь>] -
Добавляет указанный репозиторий как подмодуль по указанному пути в набор изменений, который будет зафиксирован рядом с текущим проектом: текущий проект называется "суперпроектом".
<репозиторий> — это URL репозитория
originнового подмодуля. Это может быть либо абсолютный URL, либо (если он начинается с./или../) расположение относительно внешнего репозитория суперпроекта по умолчанию (Обратите внимание, что для указания репозиторияfoo.git, который находится прямо рядом с суперпроектомbar.git, вам придётся использовать../foo.gitвместо./foo.git— как можно было бы ожидать, следуя правилам для относительных URL-адресов — потому что вычисление относительных URL-адресов в Git идентично вычислению относительных каталогов).Внешний репозиторий по умолчанию — это внешний репозиторий отслеживаемой внешней ветки текущей ветки. Если такой отслеживаемой внешней ветки не существует или
HEADотсоединён, предполагается, что внешним репозиторием по умолчанию являетсяorigin. Если у суперпроекта не настроен внешний репозиторий по умолчанию, суперпроект сам является своим авторитетным вышестоящим, и вместо этого используется текущий рабочий каталог.Необязательный аргумент <путь> — это относительное расположение клонированного подмодуля в суперпроекте. Если <путь> не указан, используется каноническая часть исходного репозитория (
repoдля /путь/к/repo.git иfooдляhost.xz:foo/.git). Если <путь> существует и уже является допустимым репозиторием Git, то он индексируется для фиксации без клонирования. <путь> также используется как логическое имя подмодуля в его записях конфигурации, если только--name<имя> не используется для указания логического имени.Указанный URL записывается в
.gitmodulesдля использования последующими пользователями, клонирующими суперпроект. Если URL указан относительно репозитория суперпроекта, предполагается, что репозитории суперпроекта и подмодуля будут храниться вместе в том же относительном расположении, и нужно будет предоставить только URL суперпроекта. git-submodule правильно найдёт подмодуль, используя относительный URL в.gitmodules.Если задан параметр
--ref-format<формат>, формат хранения ссылок для подмодулей, которую будут клонированы впервые, будет установлен в соответствующее значение. -
status[--cached] [--recursive] [--] [<путь>...] -
Показывает состояние подмодулей. Выводит SHA-1 текущего переключённого коммита для каждого подмодуля, а также путь подмодуля и вывод git-describe[1] для SHA-1. Каждый SHA-1 может иметь префикс
-, если подмодуль не инициализирован,+, если текущий переключённый коммит подмодуля не совпадает с SHA-1, найденным в индексе содержащего репозитория, иU, если подмодуль имеет конфликты слияния.Если указан
--cached, эта команда вместо этого выведет SHA-1, записанный в суперпроекте для каждого подмодуля.Если указан
--recursive, эта команда рекурсивно обработает вложенные подмодули и также покажет их состояние.Если вас интересуют только изменения текущих инициализированных подмодулей относительно коммита, записанного в индексе или
HEAD, git-status[1] и git-diff[1] также предоставят эту информацию (и могут также сообщать об изменениях в рабочем каталоге подмодуля). -
init[--] [<путь>...] -
Инициализирует подмодули, записанные в индексе (которые были добавлены и закоммичены в другом месте), устанавливая submodule.$имя.url в
.git/config, используя ту же настройку из.gitmodulesв качестве шаблона. Если URL относительный, он будет разрешён с использованием внешнего репозитория по умолчанию. Если внешнего репозитория по умолчанию нет, предполагается, что текущий репозиторий является вышестоящим.Необязательные аргументы <путь> ограничивают, какие подмодули будут инициализированы. Если путь не указан и
submodule.activeнастроен, будут инициализированы подмодули, настроенные как активные, в противном случае инициализируются все подмодули.Он также скопирует значение submodule.$имя.update, если оно присутствует в файле
.gitmodules, в.git/config, но (1) эта команда не изменяет существующую информацию в.git/config, и (2) submodule.$имя.update, установленное в пользовательскую команду, не копируется по соображениям безопасности.Затем вы можете настроить URL-адреса клонирования подмодулей в
.git/configдля вашей локальной настройки и перейти кgitsubmoduleupdate; вы также можете просто использоватьgitsubmoduleupdate--initбез явного шагаinit, если не собираетесь настраивать какие-либо расположения подмодулей.Определение внешнего репозитория по умолчанию см. в подкоманде add.
-
deinit[-f|--force] (--all|[--] <путь>...) -
Отменяет регистрацию указанных подмодулей, т.е. удаляет весь раздел submodule.$имя из .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=<репозиторий>] [--ref-format=<формат>] [--depth=<глубина>] [--recursive] [--jobs<число>] [--[no-]single-branch] [--filter=<спецификатор-фильтра>] [--] [<путь>...] -
Обновляет зарегистрированные подмодули в соответствии с ожиданиями суперпроекта путём клонирования отсутствующих подмодулей, получения отсутствующих коммитов в подмодулях и обновления рабочего каталога подмодулей. "Обновление" может быть выполнено несколькими способами в зависимости от параметров командной строки и значения переменной конфигурации
submodule.<имя>.update. Параметр командной строки имеет приоритет над переменной конфигурации. Если ни то, ни другое не указано, выполняетсяcheckout. (примечание: то, что находится в файле.gitmodules, на данном этапе не имеет значения; см.gitsubmoduleinitвыше о том, как используется.gitmodules). Процедурыupdate, поддерживаемые как из командной строки, так и через конфигурациюsubmodule.<имя>.update:-
checkout -
коммит, записанный в суперпроекте, будет переключён в подмодуле на отсоединённом
HEAD.Если указан
--force, подмодуль будет переключён (с использованиемgitcheckout--force), даже если коммит, указанный в индексе содержащего репозитория, уже соответствует коммиту, переключённому в подмодуле. -
rebase -
текущая ветка подмодуля будет перемещена на коммит, записанный в суперпроекте.
-
merge -
коммит, записанный в суперпроекте, будет слит с текущей веткой в подмодуле.
У следующих процедур обновления есть дополнительные ограничения:
-
!<пользовательская-команда> -
механизм для выполнения произвольных команд с идентификатором коммита в качестве аргумента. В частности, если переменная конфигурации
submodule.<имя>.updateустановлена в!<пользовательская-команда>, имя объекта коммита, записанного в суперпроекте для подмодуля, добавляется к строке <пользовательская-команда> и выполняется. Обратите внимание, что этот механизм не поддерживается в файле.gitmodulesили в командной строке. -
none -
подмодуль не обновляется. Эта процедура обновления не разрешена в командной строке.
Если подмодуль ещё не инициализирован, и вы просто хотите использовать настройку, сохранённую в
.gitmodules, вы можете автоматически инициализировать подмодуль с помощью параметра--init.Если указан
--recursive, эта команда рекурсивно обработает зарегистрированные подмодули и обновит любые вложенные подмодули внутри них.Если задан параметр
--ref-format<формат>, формат хранения ссылок для подмодулей, которую будут клонированы впервые, будет установлен в соответствующее значение.Если указан
--filter<спецификатор-фильтра>, указанный фильтр частичного клона будет применён к подмодулю. Подробности о спецификациях фильтров см. в git-rev-list[1]. -
-
set-branch(-b|--branch) <ветка> [--] <путь> -
set-branch(-d|--default) [--] <путь> -
Устанавливает ветку отслеживания внешнего репозитория по умолчанию для подмодуля. Параметр
--branchпозволяет указать внешнюю ветку. Параметр--defaultудаляет ключ конфигурацииsubmodule.<имя>.branch, что приводит к тому, что ветка отслеживания по умолчанию становится внешнимHEAD. -
set-url[--] <путь> <новый-url> -
Устанавливает URL указанного подмодуля в <новый-url>. Затем он автоматически синхронизирует новую конфигурацию URL внешнего репозитория подмодуля.
- summary [--cached | --files] [(-n|--summary-limit) <число>] [коммит] [--] [<путь>...]
-
Показывает сводку коммитов между указанным коммитом (по умолчанию
HEAD) и рабочим каталогом/индексом. Для рассматриваемого подмодуля показывается серия коммитов в подмодуле между указанным коммитом суперпроекта и индексом или рабочим каталогом (переключается с помощью--cached). Если указан параметр--files, показывается серия коммитов в подмодуле между индексом суперпроекта и рабочим каталогом подмодуля (этот параметр не позволяет использовать параметр--cachedили указывать явный коммит).Использование параметра
--submodule=logс git-diff[1] также предоставит эту информацию. -
foreach[--recursive] <команда> -
Выполняет произвольную команду оболочки <команда> в каждом переключённом подмодуле. Команда имеет доступ к переменным
$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] [--] [<путь>...] -
Синхронизирует настройку 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=<ветка> -
Ветка репозитория для добавления в качестве подмодуля. Имя ветки записывается как
submodule.<имя>.branchв.gitmodulesдляupdate--remote. Специальное значение.используется для указания того, что имя ветки в подмодуле должно совпадать с именем текущей ветки в текущем репозитории. Если параметр не указан, по умолчанию используется внешнийHEAD. -
-f -
--force -
Заставляет команду продолжить выполнение, даже если в противном случае она завершилась бы ошибкой. Этот параметр действителен только для команд
add,deinitиupdate.-
add -
разрешить добавление иначе игнорируемого пути подмодуля. Этот параметр также используется для обхода проверки того, что имя подмодуля ещё не используется. По умолчанию
gitsubmoduleaddзавершится ошибкой, если предлагаемое имя (которое получено из пути) уже зарегистрировано для другого подмодуля в репозитории. Использование--forceпозволяет команде продолжить работу, автоматически генерируя уникальное имя путём добавления номера к конфликтующему имени (например, если существует подмодуль с именем child, он попробует child1 и так далее). -
deinit -
рабочие каталоги подмодулей будут удалены, даже если они содержат локальные изменения.
-
update -
(действует только с процедурой переключения), отбрасывать локальные изменения в подмодулях при переключении на другой коммит; и всегда выполнять операцию переключения в подмодуле, даже если коммит, указанный в индексе содержащего репозитория, совпадает с коммитом, переключённым в подмодуле.
-
-
--cached -
Использовать индекс для определения коммита вместо
HEAD. Этот параметр действителен только для командstatusиsummary. -
--files -
Заставляет команду
summaryсравнивать коммит в индексе с коммитом вHEADподмодуля. -
-n<n> -
--summary-limit=<n> -
Ограничивает размер
summary(общее количество показываемых коммитов) до <число>. Значение 0 отключает сводку; отрицательное число означает неограниченно (по умолчанию). Это ограничение применяется только к изменённым подмодулям. Для добавленных/удалённых/изменивших тип подмодулей размер всегда ограничен 1. -
--remote -
Вместо использования записанного SHA-1 суперпроекта для обновления подмодуля использовать состояние отслеживаемой внешней ветки подмодуля. Этот параметр действителен только для команды
update. Используемый внешний репозиторий — это внешний репозиторий ветки (branch.<имя>.remote), по умолчаниюorigin. Используемая внешняя ветка по умолчанию — внешнийHEAD, но имя ветки может быть переопределено установкой параметраsubmodule.<имя>.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.<имя>.branch, в то время какgitpullиспользуетbranch.<имя>.mergeподмодуля. Предпочитайтеsubmodule.<имя>.branch, если вы хотите распространять вышестоящую ветку по умолчанию вместе с суперпроектом, иbranch.<имя>.merge, если вы хотите более естественное ощущение при работе в самом подмодуле. -
-N -
--no-fetch -
Не получать новые объекты из внешнего репозитория. Этот параметр действителен только для команды
update. -
--checkout -
Переключает коммит, записанный в суперпроекте, на отсоединённом
HEADв подмодуле. Этот параметр действителен только для командыupdate. Это поведение по умолчанию, основное использование этого параметра — переопределениеsubmodule.<имя>.update, когда оно установлено в значение, отличное отcheckout. Если ключsubmodule.<имя>.updateлибо явно не установлен, либо установлен вcheckout, этот параметр подразумевается. -
--merge -
Сливает коммит, записанный в суперпроекте, с текущей веткой подмодуля. Этот параметр действителен только для команды
update. Если указан этот параметр,HEADподмодуля не будет отсоединён. Если сбой слияния предотвращает этот процесс, вам придётся разрешить возникшие конфликты внутри подмодуля с помощью обычных инструментов разрешения конфликтов. Если ключsubmodule.<имя>.updateустановлен вmerge, этот параметр подразумевается. -
--rebase -
Перемещает текущую ветку на коммит, записанный в суперпроекте. Этот параметр действителен только для команды
update.HEADподмодуля не будет отсоединён. Если сбой слияния предотвращает этот процесс, вам придётся разрешить эти сбои с помощью git-rebase[1]. Если ключsubmodule.<имя>.updateустановлен вrebase, этот параметр подразумевается. -
--init -
Инициализирует все подмодули, для которых
gitsubmoduleinitещё не вызывался, перед обновлением. Этот параметр действителен только для командыupdate. -
--name=<имя> -
Устанавливает имя подмодуля в указанную строку вместо использования по умолчанию его пути. <имя> должно быть допустимым как имя каталога и не может заканчиваться на
/. -
--reference=<репозиторий> -
Передаёт локальный <репозиторий> в качестве ссылки при клонировании подмодуля. Этот параметр действителен только для команд
addиupdate. Этим командам иногда требуется клонировать внешний репозиторий. В этом случае этот параметр будет передан команде git-clone[1].NoteНе используйте этот параметр, если вы внимательно не прочитали примечание о параметрах --reference,--sharedи--dissociateкоманды git-clone[1]. -
--dissociate -
После использования репозитория-ссылки для клонирования больше не полагаться на него. Этот параметр действителен только для команд
addиupdate. Этим командам иногда требуется клонировать внешний репозиторий. В этом случае этот параметр будет передан команде git-clone[1].NoteСм. ПРИМЕЧАНИЕ выше для параметра --reference. -
--recursive -
Рекурсивно обходить подмодули. Этот параметр действителен только для команд
foreach,update,statusиsync. Операция выполняется не только в подмодулях текущего репозитория, но и в любых вложенных подмодулях внутри этих подмодулей (и так далее). -
--depth=<глубина> -
Создаёт частичный клон с историей, усечённой до <глубина> редакций. Этот параметр действителен для команд
addиupdate. См. git-clone[1] -
--recommend-shallow -
--no-recommend-shallow -
Рекомендовать или нет частичное клонирование подмодулей. Этот параметр действителен только для команды
update. Начальное клонирование подмодуля по умолчанию будет использовать рекомендуемыйsubmodule.<имя>.shallow, предоставленный файлом.gitmodules. Чтобы игнорировать предложения, используйте--no-recommend-shallow. -
-j<n> -
--jobs=<n> -
Клонировать новые подмодули параллельно с <n> заданиями. Этот параметр действителен только для команды
update. По умолчанию используется параметрsubmodule.fetchJobs. -
--single-branch -
--no-single-branch -
Клонировать только одну ветку во время обновления:
HEADили указанную с помощью--branch. Этот параметр действителен только для командыupdate. - <путь>…
-
Пути к подмодулю(ям). При указании это ограничит команду только подмодулями, найденными по указанным путям. (Этот аргумент обязателен для
add).
ФАЙЛЫ
При инициализации подмодулей файл .gitmodules в верхнем каталоге содержащего репозитория используется для поиска URL каждого подмодуля. Этот файл должен быть отформатирован так же, как $GIT_DIR/config. Ключом для каждого URL подмодуля является submodule.<имя>.url. Подробности см. в gitmodules[5].
GIT
Является частью пакета git[1]