Git не будет инициировать/синхронизировать/обновлять новые подмодули

Здесь часть содержимого моего файла .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 ничего не значит. Новый подмодуль игнорируется.

Ответ 1

Вы недавно обновились до версии git версии 1.7.0.4? Я сделал и теперь имею подобные проблемы...

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

Ответ 2

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

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

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

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

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

Добавление дополнительных комментариев к этому рабочему ответу: если обновление подмодуля git initodule или git does not работает, то, как описано выше git subodule add url должен сделать трюк. Можно проверить это на

 git config --list

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

 mv yourmodulename yourmodulename-temp
 git submodule update --init

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

Ответ 3

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

Ответ 4

Имела ту же самую проблему, когда git игнорировались команды init и update и ничего не делали.

КАК ИСКАТЬ

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

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

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

  • Добавить подмодуль вручную, например. git submodule add [email protected] path/to
  • git submodule init
  • git submodule update
  • зафиксировать и нажать все файлы - .gitmodules и папку вашего модуля (обратите внимание, что содержимое папки не будет выполнено)
  • отмените локальный репозиторий git
  • клонировать новый
  • убедитесь, что .git/config еще не имеет подмодулей
  • Теперь git submodule init - и вы увидите сообщение, в котором зарегистрирован модуль
  • git submodule update - извлечет модуль
  • Теперь посмотрите .git/config, и вы найдете зарегистрированный подмодуль

Ответ 5

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

Поцарапайте это. Я на самом деле работал, делая git submodule update --init --recursive. Надеюсь, это поможет.

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

Ответ 6

В ответах есть много путаницы (также).

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, если все будет работать.

ИЗМЕНИТЬ

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

Ответ 7

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

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

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

Ответ 8

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

Вот соответствующая фиксация:

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

Ответ 9

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

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

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

И я также использую ту же логику для нескольких сценариев развертывания post-receive git.

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

Ответ 10

Когда я увидел это сегодня, разработчик переместил часть дерева в новый подкаталог, и похоже, что его клиент git не записывал обновленные правила Subproject в дереве, вместо этого они были просто ядерными, оставляя .gitmodules как для устаревших местоположений, так и для подпроектов, которые больше не существовали в текущем дереве.

Добавление подмодулей назад и сравнение шага фиксации подмодуля с элементами, найденными в git show $breaking_commit_sha (поиск строк, соответствующих регулярному выражению ^-Subproject), для настройки необходимых фиксированных вещей.

Ответ 11

У меня была та же проблема сегодня и выяснил, что, поскольку я набрал git submodule init, тогда у меня была такая строка в моем .git/config:

[submodule]
   active = .

Я удалил это и набрал:

git submodule update --init --remote

И все вернулось к нормальному состоянию, мой подмодуль обновлен в его подкаталоге, как обычно.

Ответ 12

У меня была аналогичная проблема с подмодулем. Он просто не хотел, чтобы его клонировали/вытащили/обновили/независимо.

При попытке повторного добавления субмодуля с помощью git submodule add [email protected] destination я получил следующий вывод:

A git directory for 'destination' is found locally with remote(s):
  origin        [email protected]
If you want to reuse this local git directory instead of cloning again from
  [email protected]
use the '--force' option. If the local git directory is not the correct repo
or you are unsure what this means choose another name with the '--name' option.

Итак, я попытался выполнить команду добавления:
git submodule add --force [email protected] destination

Это сработало в моем случае.

Ответ 13

Удаление субмодуля dir и его содержимого (папка "external/pyfacebook" ), если оно существует до git submodule add ..., может устранить проблемы.

Ответ 14

Для записи:
Я создал ту же проблему, добавив пустой репозиторий в качестве субмодуля. В этом случае для подмодуля отсутствовал ссылочный хеш, что приводило к ошибке, описанной исходным постером.

Принудительное добавление хранилища после того, как оно было зафиксировано, решило проблему (как в посте Arvids)
git submodule add --force [email protected] destination

Ответ 15

  • Удалите подмодуль из вашего .git/config
  • Запустите команду git submodule init
  • Перейдите в каталог подмодулей и запустите git pull origin master

Должно работать сейчас

Ответ 16

Думать, что ручной настройки .gitmodules достаточно, НЕПРАВИЛЬНО

Моя локальная git version 2.22.0 на момент написания этой статьи.

Так что я пришел к этой теме, задаваясь вопросом, почему не работает git submodule init; Я установил файл .gitmodules и приступил к git submodule init...

ВАЖНЫЙ

  1. git submodule add company/project.git includes/project требуется git submodule add company/project.git includes/project (при первом добавлении модуля), это будет:

    • добавить конфиг в .git/config
    • обновить файл .gitmodules
    • отслеживать местоположение субмодуля (в этом примере - includes/project).
  2. Затем вы должны git commit после добавления подмодуля, при этом будут зафиксированы .gitmodules и отслеживаемое местоположение подмодуля.

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

Также для справки смотрите:

Ответ 17

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

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