Поиск…


Добавление подмодуля

Вы можете включить другой репозиторий 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
    

Удаление подмодуля

1,8

Вы можете удалить подмодуль (например, the_submodule ), вызвав:

$ git submodule deinit the_submodule
$ git rm the_submodule 
  • git submodule deinit the_submodule удаляет the_submodule s 'из .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 останется.

1,8

Взято отсюда :

  1. Удалите соответствующий раздел из файла .gitmodules .
  2. Этап изменения .gitmodules git add .gitmodules
  3. Удалите соответствующий раздел из .git/config .
  4. Запустить git rm --cached path_to_submodule (без косой черты).
  5. Запустить rm -rf .git/modules/path_to_submodule
  6. Commit git commit -m "Removed submodule <name>"
  7. Удалите теперь необработанные файлы подмодулей
  8. rm -rf path_to_submodule

Перемещение подмодуля

1,8

Бежать:

$ git mv old/path/to/module new/path/to/module
1,8
  1. Измените .gitmodules и соответствующим образом измените путь подмодуля и поместите его в индекс с помощью git add .gitmodules .

  2. При необходимости создайте родительский каталог нового местоположения подмодуля ( mkdir -p new/path/to ).

  3. Переместите весь контент из старого в новый каталог ( mv -vi old/path/to/module new/path/to/submodule ).

  4. Убедитесь, что Git отслеживает этот каталог ( git add new/path /to ).

  5. Удалите старый каталог с git rm --cached old/path/to/module .

  6. Переместите каталог .git/modules/ old/path/to/module со всем содержимым в .git/modules/ new/path/to/module .

  7. Отредактируйте файл .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
     #
    
  8. Наконец, зафиксируйте изменения.


Этот пример из Stack Overflow , Axel Beckert



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow