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.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 [--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-адреса вихідного репозиторію нового підмодуля. Це може бути або абсолютна 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] [--] [<path>…]
-
Показати стан підмодулів. Це виведе SHA-1 поточного витягнутого коміту для кожного підмодуля, разом зі шляхом до підмодуля та виводом git describe для 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
для вашої локальної конфігурації та перейти доgit
submodule
update
; ви також можете просто використовуватиgit
submodule
update
--init
без явного кроку init, якщо ви не збираєтеся налаштовувати жодні розташування підмодулів.Дивіться підкоманду add для визначення віддаленого сервера за замовчуванням.
- deinit [-f|--force] (--all|[--] <path>…)
-
Скасуйте реєстрацію вказаних підмодулів, тобто видаліть весь розділ
submodule.$name
з .git/config разом з їхнім робочим деревом. Подальші викликиgit
submodule
update
,git
submodule
foreach
таgit
submodule
sync
пропускатимуть будь-які незареєстровані підмодулі, доки вони не будуть знову ініціалізовані, тому використовуйте цю команду, якщо ви більше не хочете мати локальне отримання підмодуля у вашому робочому дереві.Коли команда виконується без pathspec, вона видає помилку, замість того, щоб деініціалізувати все, щоб запобігти помилкам.
Якщо вказано
--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
. Параметр командного рядка має пріоритет над змінною конфігурації. Якщо жоден з них не вказано, виконується «перевірка». (примітка: вміст файлу.gitmodules
на даний момент не має значення; див.git
submodule
init
вище, щоб дізнатися, як використовується.gitmodules
). Процедури «оновлення», що підтримуються як з командного рядка, так і через конфігураціюsubmodule.
<name>.update
:- оформлення замовлення
-
Коміт, записаний у суперпроекті, буде витягнуто в підмодулі на відокремленому HEAD.
Якщо вказано
--force
, підмодуль буде витягнуто (за допомогоюgit
checkout
--force
), навіть якщо коміт, вказаний в індексі репозиторію, що містить його, вже відповідає коміту, витягнутому в підмодулі. - лисиця
-
Поточна гілка підмодуля буде перебазована на основі коміту, записаного в суперпроекті.
- merge
-
Коміт, записаний у суперпроекті, буде об’єднано з поточною гілкою в підмодулі.
Наведені нижче процедури оновлення мають додаткові обмеження:
- користувацька команда
-
механізм для виконання довільних команд з ідентифікатором коміта як аргументом. Зокрема, якщо змінна конфігурації
submodule.
<name>.update
встановлена на!custom
command
, ім’я об’єкта коміта, записане в суперпроекті для підмодуля, додається до рядкаcustom
command
та виконується. Зверніть увагу, що цей механізм не підтримується у файлі.gitmodules
або в командному рядку. - none
-
Підмодуль не оновлюється. Ця процедура оновлення не дозволена в командному рядку.
Якщо підмодуль ще не ініціалізовано, і ви просто хочете використовувати налаштування, що зберігаються в
.gitmodules
, ви можете автоматично ініціалізувати підмодуль за допомогою опції--init
.Якщо вказано
--recursive
, ця команда рекурсивно звернеться до зареєстрованих підмодулів та оновить будь-які вкладені підмодулі всередині них.Якщо вказано
--ref-format
<формат>, формат зберігання посилань щойно клонованих підмодулів буде встановлено відповідно.Якщо вказано
--filter
<специфікація-фільтра>, до підмодуля буде застосовано вказаний фільтр часткового клонування. Див. 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>
-
Обчислює довільну команду оболонки в кожному витягнутому підмодулі. Команда має доступ до змінних $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-адреси підмодулів змінюються в основній програмі, і вам потрібно відповідно оновити ваші локальні репозиторії.git
submodule
sync
синхронізує всі підмодулі, тоді якgit
submodule
sync
--
A
синхронізує лише підмодуль "A".Якщо вказано
--recursive
, ця команда рекурсивно звернеться до зареєстрованих підмодулів та синхронізує будь-які вкладені підмодулі всередині них. - абсорбувати_гірники
-
Якщо каталог git підмодуля знаходиться всередині підмодуля, перемістіть каталог git підмодуля до шляху
$GIT_DIR/modules
його суперпроекту, а потім з’єднайте каталог git та його робочий каталог, встановившиcore.worktree
та додавши файл .git, що вказує на каталог git, вбудований у каталог git суперпроектів.Репозиторій, який був клонований незалежно та пізніше доданий як підмодуль, або старі налаштування мають каталог submodules git всередині підмодуля, а не вбудований у каталог superprojects git.
Ця команда є рекурсивною за замовчуванням.
ОПЦІЇ
- -q
- --quiet
-
Друкувати лише повідомлення про помилки.
- --progress
-
Цей параметр дійсний лише для команд додавання та оновлення. За замовчуванням статус виконання повідомляється у стандартному потоці помилок, коли він підключений до терміналу, якщо не вказано -q. Цей прапорець примусово встановлює статус виконання, навіть якщо стандартний потік помилок не спрямовано до терміналу.
- --all
-
Ця опція дійсна лише для команди deinit. Скасувати реєстрацію всіх підмодулів у робочому дереві.
- -b <branch>
- --branch <branch>
-
Гілка репозиторію, яку потрібно додати як підмодуль. Назва гілки записується як
submodule.
<назва>.branch
у.gitmodules
дляupdate
--remote
. Спеціальне значення.
використовується для позначення того, що назва гілки в підмодулі має збігатися з назвою поточної гілки в поточному репозиторії. Якщо опцію не вказано, за замовчуванням використовується віддалена HEAD. - -f
- --force
-
Ця опція дійсна лише для команд add, deinit та update. Під час запуску add дозволяється додавання шляху до підмодуля, який в іншому випадку ігнорується. Під час запуску deinit робочі дерева підмодулів будуть видалені, навіть якщо вони містять локальні зміни. Під час запуску update (діє лише з процедурою checkout) відкидається локальні зміни в підмодулях під час перемикання на інший коміт; та завжди запускається операція checkout у підмодулі, навіть якщо коміт, зазначений в індексі репозиторію, що містить його, збігається з комітом, взятим у підмодулі.
- --cached
-
Ця опція дійсна лише для команд status та summary. Ці команди зазвичай використовують коміт, що знаходиться в підмодулі HEAD, але з цією опцією використовується коміт, що зберігається в індексі.
- --files
-
Ця опція дійсна лише для команди summary. Ця команда порівнює коміт в індексі з комітом у підмодулі HEAD, коли використовується ця опція.
- -n
- --summary-limit
-
Цей параметр дійсний лише для команди summary. Обмежте розмір зведення (загальна кількість комітів, що відображаються). Значення 0 вимкне зведення; від’ємне число означає необмежений розмір (за замовчуванням). Це обмеження застосовується лише до змінених підмодулів. Розмір завжди обмежений 1 для доданих/видалених/змінених типів підмодулів.
- --remote
-
Цей параметр дійсний лише для команди оновлення. Замість використання записаного SHA-1 суперпроекту для оновлення підмодуля, використовуйте статус гілки віддаленого відстеження підмодуля. Використовуваною віддаленою гілкою є віддалена гілка гілки (
branch.
<name>.remote
), за замовчуваннямorigin
. Використовувана віддалена гілка за замовчуванням має віддаленуHEAD
, але назву гілки можна перевизначити, встановивши параметрsubmodule.
<name>.branch
у.gitmodules
або.git/config
(при цьому.git/config
має пріоритет).Це працює для будь-якої з підтримуваних процедур оновлення (
--checkout
,--rebase
тощо). Єдина зміна — це джерело цільового SHA-1. Наприклад,submodule
update
--remote
--merge
об’єднає зміни підмодуля основного проекту з підмодулями, тоді якsubmodule
update
--merge
об’єднає зміни gitlink суперпроекту з підмодулями.Щоб забезпечити поточний стан гілки відстеження,
update
--remote
отримує дані з віддаленого репозиторію підмодуля перед обчисленням SHA-1. Якщо ви не хочете отримувати дані, слід використовуватиsubmodule
update
--remote
--no-fetch
.Використовуйте цю опцію для інтеграції змін з підпроекту основного проекту з поточним HEAD вашого підмодуля. Крім того, ви можете запустити
git
pull
з підмодуля, що еквівалентно, за винятком назви віддаленої гілки:update
--remote
використовує репозиторій основного проекту за замовчуванням таsubmodule.
<name>.branch
, тоді якgit
pull
використовуєbranch.
<name>.merge
підмодуля. Віддавайте перевагуsubmodule.
<name>.branch
, якщо ви хочете розповсюдити гілку основного проекту за замовчуванням разом із суперпроектом, таbranch.
<name>.merge
, якщо ви хочете більш нативного відчуття під час роботи в самому підмодулі. - -N
- --no-fetch
-
Цей параметр дійсний лише для команди оновлення. Не завантажувати нові об’єкти з віддаленого сайту.
- --checkout
-
Ця опція дійсна лише для команди оновлення. Перевірити коміт, записаний у суперпроекті, на окремому HEAD у підмодулі. Це поведінка за замовчуванням, основне використання цієї опції полягає в перевизначенні
submodule.$name.update
, коли воно встановлено на значення, відмінне відcheckout
. Якщо ключsubmodule.$name.update
або не встановлено явно, або встановлено наcheckout
, ця опція є неявною. - --merge
-
Ця опція дійсна лише для команди оновлення. Об’єднати коміт, записаний у суперпроекті, з поточною гілкою підмодуля. Якщо ця опція вказана, HEAD підмодуля не буде від’єднано. Якщо помилка злиття перешкоджає цьому процесу, вам доведеться вирішити конфлікти, що виникли, всередині підмодуля за допомогою звичайних інструментів вирішення конфліктів. Якщо ключ
submodule.$name.update
встановлено наmerge
, ця опція є неявно встановлена. - --rebase
-
Ця опція дійсна лише для команди update. Перебазувати поточну гілку на коміт, записаний у суперпроекті. Якщо ця опція вказана, HEAD підмодуля не буде від’єднано. Якщо помилка злиття перешкоджає цьому процесу, вам доведеться вирішити ці помилки за допомогою git-rebase[1]. Якщо ключ
submodule.$name.update
встановлено наrebase
, ця опція є неявно встановлена. - --init
-
Ця опція дійсна лише для команди оновлення. Ініціалізуйте всі підмодулі, для яких ще не було викликано "git submodule init", перед оновленням.
- --name
-
Ця опція дійсна лише для команди add. Вона встановлює назву підмодуля як заданий рядок, а не шлях за замовчуванням. Назва має бути коректною як назва каталогу та не може закінчуватися символом /.
- --reference <repository>
-
Цей параметр дійсний лише для команд додавання та оновлення. Цим командам іноді потрібно клонувати віддалений репозиторій. У цьому випадку цей параметр буде передано команді git-clone[1].
ПРИМІТКА: Не використовуйте цю опцію, якщо ви уважно не прочитали примітку до опцій
--reference
,--shared
та--dissociate
у git-clone[1]. - --dissociate
-
Цей параметр дійсний лише для команд додавання та оновлення. Цим командам іноді потрібно клонувати віддалений репозиторій. У цьому випадку цей параметр буде передано команді git-clone[1].
ПРИМІТКА: див. ПРИМІТКУ щодо опції
--reference
. - --recursive
-
Ця опція дійсна лише для команд foreach, update, status та sync. Рекурсивний перехід між підмодулями. Операція виконується не лише в підмодулях поточного репозиторію, але й у будь-яких вкладених підмодулях всередині цих підмодулів (і так далі).
- --depth
-
Ця опція дійсна для команд додавання та оновлення. Створіть «неглибокий» клон з історією, скороченою до вказаної кількості редакцій. Див. git-clone[1]
- --[no-]recommend-shallow
-
Цей параметр дійсний лише для команди оновлення. Початковий клон підмодуля використовуватиме рекомендований
submodule.
<name>.shallow
, як зазначено у файлі.gitmodules
за замовчуванням. Щоб ігнорувати пропозиції, використовуйте--no-recommend-shallow
. - -j <n>
- --jobs <n>
-
Цей параметр дійсний лише для команди оновлення. Клонувати нові підмодулі паралельно з якомога більшою кількістю завдань. За замовчуванням використовується параметр
submodule.fetchJobs
. - --[no-]single-branch
-
Цей параметр дійсний лише для команди оновлення. Клонувати лише одну гілку під час оновлення: HEAD або ту, що визначена параметром --branch.
- <path>…
-
Шляхи до підмодуля(ів). Якщо вказано, це обмежить роботу команди лише з підмодулями, знайденими за вказаними шляхами. (Цей аргумент обов’язковий для додавання).
ФАЙЛИ
Під час ініціалізації підмодулів використовується файл .gitmodules
у каталозі верхнього рівня репозиторію, що містить підмодулі, для пошуку URL-адреси кожного підмодуля. Цей файл має бути відформатований так само, як $GIT_DIR/config
. Ключ до URL-адреси кожного підмодуля — "submodule.$name.url". Докладніше див. у gitmodules[5].
GIT
Частина набору git[1]