Git не будет инициализировать / синхронизировать / обновлять новые подмодули - PullRequest
90 голосов
/ 26 июля 2010

Вот часть содержимого моего .gitmodules файла:

[submodule "src/static_management"]
        path = src/static_management
        url = git://github.com/eykd/django-static-management.git
[submodule "external/pyfacebook"]
        path = external/pyfacebook
        url = http://github.com/sciyoshi/pyfacebook.git

Однако .git/config содержит только первое:

[submodule "src/static_management"]
        url = git://github.com/eykd/django-static-management.git

Второй подмодуль (external/pyfacebook) был добавлен другим разработчиком в ветке функций.Теперь я унаследовал разработку и проверил ветку функций.Тем не менее, Git не будет тянуть субмодуль для меня.Я пробовал:

  • git submodule init
  • git submodule update
  • git submodule update --init
  • git submodule sync
  • Удаление всех определений подмодулей из .git/config и запуск git submodule init.Он только копирует ранее существовавший подмодуль и игнорирует новый.
  • Ввод новых определений подмодулей в .git/config вручную и запуск git submodule update.Обновлять могут только ранее существующие подмодули.

в различных комбинациях, но git просто не будет обновлять .git/config на основе нового содержимого .gitmodules и не будет создавать папку external/pyfacebookи вытащить содержимое подмодуля.

Чего мне не хватает?Действительно ли требуется ручное вмешательство (добавление записи подмодуля вручную в .git/config) и почему?

Редактировать: Ручное вмешательство не работает.Добавление новой записи субмодуля в .git/config вручную ничего не дает.Новый подмодуль игнорируется.

Ответы [ 17 ]

75 голосов
/ 29 января 2012

У меня была такая же проблема - оказалось, что файл .gitmodules был зафиксирован, но фактическая фиксация субмодуля (т.е. запись идентификатора фиксации субмодуля) не была.

Казалось, добавление его вручнуюсделайте трюк - например:

git submodule add http://github.com/sciyoshi/pyfacebook.git external/pyfacebook

(даже без удаления чего-либо из .git / config или .gitmodules.)

Затем передайте его для правильной записи идентификатора.

Добавление некоторых дополнительных комментариев к этому рабочему ответу: Если обновление подмодуля git init или обновление подмодуля git не работает, то, как описано выше, URL-адрес добавления подмодуля git должен помочь.Это можно перепроверить с помощью

 git config --list

, и в результате команды git config --list вы должны получить запись подмодуля, который вы хотите получить.Если в результате настройки есть запись вашего подмодуля, то теперь обычное обновление подмодуля git --init должно вытянуть ваш подмодуль.Чтобы проверить этот шаг, вы можете вручную переименовать субмодуль и затем обновить субмодуль.

 mv yourmodulename yourmodulename-temp
 git submodule update --init

Чтобы узнать, есть ли у вас локальные изменения в подмодуле, это можно увидеть через git status -u (если вы хотите увидеть изменения в подмодуле) или git status --ignore-submodules (если вы не хотите видеть изменения в подмодуле).

49 голосов
/ 21 ноября 2016

git версия 2.7.4. Эта команда обновляет локальный код git submodule update --init --force --remote

32 голосов
/ 26 августа 2010

Вы недавно обновились до git версии 1.7.0.4? У меня были и сейчас возникают похожие проблемы ...

Редактировать: я исправил свою проблему, но абсолютно не знаю, где проблема была. Я вручную удалил записи подмодулей как из .git / config, так и .gitmodules и повторно добавил свои подмодули с помощью обычных шагов (git submodule add и т. Д.) ... Worksforme, но не добавляет значения этой теме.

15 голосов
/ 27 октября 2015

Была та же проблема, когда git игнорировал команды init и update и ничего не делал.

КАК ИСПРАВИТЬ

  1. Ваша папка субмодуля должна быть передана в git repo
  2. Не должно быть в .gitignore

Если эти требования соблюдены, это сработает. В противном случае все команды будут выполняться без каких-либо сообщений и результатов.

Если вы все это сделали, а она все еще не работает:

  1. Добавить субмодуль вручную, например, git submodule add git@... path/to
  2. git submodule init
  3. git submodule update
  4. зафиксировать и отправить все файлы - .gitmodules и папку вашего модуля (обратите внимание, что содержимое папки не будет зафиксировано)
  5. бросьте свой локальный репозиторий
  6. клон нового
  7. убедитесь, что .git/config еще не имеет подмодулей
  8. Теперь git submodule init - и вы увидите сообщение о том, что модуль зарегистрирован
  9. git submodule update - получит модуль
  10. Теперь посмотрите на .git/config, и вы найдете зарегистрированный подмодуль
4 голосов
/ 27 декабря 2016

Здесь, кажется, также много путаницы в ответах.

git submodule init - это , а не , предназначенный для магического генерирования вещей в .git / config (из .gitmodules). Он предназначен для установки чего-либо в полностью пустой подкаталог после клонирования родительского проекта или получения коммита, который добавляет ранее несуществующий подмодуль.

Другими словами, вы следуете за git clone проекта, который имеет подмодули (что вы узнаете по тому факту, что клон извлек файл .gitmodules) за git submodule update --init --recursive.

Вы не следите git submodule add ... с git submodule init (или git submodule update --init), который не должен работать. Фактически, дополнение уже обновит соответствующий .git / config, если все будет работать.

EDIT

Если ранее не существовавший подмодуль git был добавлен кем-то другим, и вы делаете git pull этого коммита, то каталог этого подмодуля будет полностью пустым (когда вы выполните git submodule status хеш нового подмодуля должен быть видимым, но будет иметь - перед ним.) В этом случае вам необходимо следовать за git pull также git submodule update --init (плюс --recursive, когда это подмодуль внутри подмодуля), чтобы получить новый, ранее не существующий, проверенный субмодуль; точно так же, как после первоначального клона проекта с подмодулями (где, очевидно, у вас не было этих подмодулей раньше).

4 голосов
/ 19 мая 2014

В некотором роде волшебно, но сегодня я набрал git submodule init, затем git submodule sync, затем git submodule update, и он начал тянуть мои подмодули ... Магия?Может быть!Это действительно один из самых неприятных опытов с Git…

Поцарапайте это.Я на самом деле получил его, выполнив git submodule update --init --recursive.Надеюсь, это поможет.

PS: убедитесь, что вы находитесь в корневом каталоге git, а не в подмодуле.

3 голосов
/ 28 января 2013

У меня была такая же проблема.

У

.gitmodules был субмодуль, но после команды git submodule init его не было в .git/config.

Получается, что разработчик, добавивший подмодуль, также добавил каталог подмодуля в файл .gitignore. Это не работает.

2 голосов
/ 15 июля 2012

Согласно ответу Дейва Джеймса Миллера, я могу подтвердить, что это сработало для меня.Здесь важно было зафиксировать идентификатор фиксации подпроекта.Просто иметь запись в .gitmodules было недостаточно.

Вот соответствующий коммит:

https://github.com/dirkaholic/vagrant-php-dev-box/commit/d5f4c40bdbd80eefbb5ac6029823733f591435ae

2 голосов
/ 09 марта 2013

Как и вы, я обнаружил, что git submodule sync не делает то, что вы ожидаете. Только после выполнения явного git submodule add изменение URL-адреса подмодуля.

Итак, я поместил этот скрипт в ~/bin/git-submodule-sync.rb:

https://gist.github.com/frimik/5125436

И я также использую ту же логику в нескольких сценариях git deploy после получения.

Все, что мне нужно сейчас сделать, это отредактировать .gitmodules, затем запустить этот скрипт, и он, наконец, работает так, как я думал git submodule sync.

1 голос
/ 21 июня 2019

У меня была такая же проблема, но ни одно из приведенных выше решений не помогло.Записи в .gitmodules и в .git / config были правильными, но команда git submodules update --init --recursive ничего не делала.Я также удалил каталог подмодулей и запустил git submodules update --init --recursive и вернул каталог подмодулей, но с тем же коммитом, что и раньше.

Я нашел ответ на этой странице .Команда: git submodule update --remote

...