Поиск…
Добавление подмодуля
Вы можете включить другой репозиторий Git в качестве папки в вашем проекте, отслеживаемой Git:
$ git submodule add https://github.com/jquery/jquery.git
Вы должны добавить и зафиксировать новый файл .gitmodules ; это говорит Git, какие подмодули должны быть клонированы при запуске git submodule update .
Клонирование хранилища Git с подмодулями
Когда вы клонируете репозиторий, который использует подмодули, вам нужно будет инициализировать и обновить их.
$ git clone --recursive https://github.com/username/repo.git
Это будет клонировать упомянутые подмодули и помещать их в соответствующие папки (включая подмодули внутри подмодулей). Это эквивалентно запуску git submodule update --init --recursive сразу же после завершения клонирования.
Обновление подмодуля
Подмодуль ссылается на конкретную фиксацию в другом репозитории. Чтобы проверить точное состояние, на которое ссылаются все подмодули, запустите
git submodule update --recursive
Иногда вместо использования состояния, на которое вы ссылаетесь, вы хотите обновить локальную проверку до последнего состояния этого субмодуля на удаленном компьютере. Чтобы проверить все подмодули в последнем состоянии на пульте дистанционного управления с помощью одной команды, вы можете использовать
git submodule foreach git pull <remote> <branch>
или используйте аргументы git pull по умолчанию
git submodule foreach git pull
Обратите внимание, что это просто обновит вашу локальную рабочую копию. Запуск git status будет отображать каталог подмодулей как грязный, если он изменится из-за этой команды. Чтобы обновить репозиторий вместо ссылки на новое состояние, вы должны зафиксировать изменения:
git add <submodule_directory>
git commit
Могут быть некоторые изменения, которые у вас есть, которые могут иметь конфликт слияния, если вы используете git pull чтобы вы могли использовать git pull --rebase для перемотки ваших изменений вверх, большую часть времени это уменьшает вероятность конфликта. Также он тянет все ветви на локальные.
git submodule foreach git pull --rebase
Чтобы проверить последнее состояние конкретного подмодуля, вы можете использовать:
git submodule update --remote <submodule_directory>
Установка подмодуля для следования ветви
Подмодуль всегда извлекается при определенном коммите SHA1 («gitlink», специальная запись в индексе родительского репо)
Но можно запросить обновление этого подмодуля до последней фиксации ветви субмодуля удаленного репо.
Вместо того, чтобы идти в каждом подмодуле, выполняя git checkout abranch --track origin/abranch, git pull , вы можете просто сделать (из родительского репо) a:
git submodule update --remote --recursive
Поскольку SHA1 подмодуля изменится, вам все равно нужно следовать этому:
git add .
git commit -m "update submodules"
Это предполагает, что подмодули были:
либо добавлено с веткой, чтобы следовать:
git submodule -b abranch -- /url/of/submodule/repoили настроить (для существующего подмодуля), чтобы следовать за веткой:
cd /path/to/parent/repo git config -f .gitmodules submodule.asubmodule.branch abranch
Удаление подмодуля
Вы можете удалить подмодуль (например, the_submodule ), вызвав:
$ git submodule deinit the_submodule
$ git rm the_submodule
git submodule deinit the_submoduleудаляетthe_submodules 'из .git / config. Это исключает the_submodule изgit submodule update,git submodule syncиgit submodule foreachвызовов и удаляет его локальный контент (источник) . Кроме того, это не будет отображаться как изменение в родительском репозитории.git submodule initиgit submodule updateвосстановит подмодуль, опять же без изменений в родительском репозитории.git rm the_submoduleудалит подмодуль из дерева работ. Файлы исчезнут, а также запись подмодулей в файле.gitmodules(источник) . Если толькоgit rm the_submodule(без предварительногоgit submodule deinit the_submoduleвыполняется, однако, запись подмодулей в вашем файле .git / config останется.
Взято отсюда :
- Удалите соответствующий раздел из файла
.gitmodules. - Этап изменения
.gitmodulesgit add .gitmodules - Удалите соответствующий раздел из
.git/config. - Запустить
git rm --cached path_to_submodule(без косой черты). - Запустить
rm -rf .git/modules/path_to_submodule - Commit
git commit -m "Removed submodule <name>" - Удалите теперь необработанные файлы подмодулей
-
rm -rf path_to_submodule
Перемещение подмодуля
Бежать:
$ git mv old/path/to/module new/path/to/module Измените
.gitmodulesи соответствующим образом измените путь подмодуля и поместите его в индекс с помощьюgit add .gitmodules.При необходимости создайте родительский каталог нового местоположения подмодуля (
mkdir -p new/path/to).Переместите весь контент из старого в новый каталог (
mv -vi old/path/to/module new/path/to/submodule).Убедитесь, что Git отслеживает этот каталог (
git add new/path /to).Удалите старый каталог с
git rm --cached old/path/to/module.Переместите каталог
.git/modules/ old/path/to/moduleсо всем содержимым в.git/modules/ new/path/to/module.Отредактируйте файл
.git/modules/ new/path/to /config, убедитесь, что элемент worktree указывает на новые местоположения, поэтому в этом примере это должно бытьworktree = ../../../../../ old/path/to/module. Как правило, должно быть еще два..затем каталоги на прямом пути в этом месте. , Отредактируйте файлnew/path/to/module /.git, убедитесь, что путь в нем указывает на правильное новое местоположение внутри основной папки проекта.git, поэтому в этом примереgitdir: ../../../.git/modules/ new/path/to/module.Выход
git statusвыглядит следующим образом:# On branch master # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # modified: .gitmodules # renamed: old/path/to/submodule -> new/path/to/submodule #Наконец, зафиксируйте изменения.
Этот пример из Stack Overflow , Axel Beckert