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
...
ВАЖНЫЙ
-
git submodule add company/project.git includes/project
требуется git submodule add company/project.git includes/project
(при первом добавлении модуля), это будет:
- добавить конфиг в
.git/config
- обновить файл
.gitmodules
- отслеживать местоположение субмодуля (в этом примере -
includes/project
).
-
Затем вы должны 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