Вот часть содержимого моего .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
ничего не дает. Новый подмодуль игнорируется.
источник
Ответы:
У меня была такая же проблема - оказалось, что файл .gitmodules был зафиксирован, но фактическая фиксация подмодуля (то есть запись идентификатора фиксации подмодуля) не была.
Добавление его вручную, похоже, помогло - например:
(Даже не удаляя ничего из .git / config или .gitmodules.)
Затем зафиксируйте его, чтобы правильно записать идентификатор.
Добавление некоторых дополнительных комментариев к этому рабочему ответу: Если git submodule init или git submodule update не работает, то, как описано выше, git submodule add url должен помочь. Это можно проверить с помощью
и вы должны получить запись о подмодуле, который вы хотите извлечь, в результате команды git config --list. Если в результате конфигурации есть запись вашего подмодуля, то теперь обычное обновление подмодуля git --init должно вытащить ваш подмодуль. Чтобы протестировать этот шаг, вы можете вручную переименовать подмодуль, а затем обновить подмодуль.
Чтобы узнать, есть ли у вас локальные изменения в подмодуле, это можно увидеть с помощью git status -u (если вы хотите увидеть изменения в подмодуле) или git status --ignore-submodules (если вы не хотите видеть изменения в подмодуль).
источник
external/pyfacebook
?'your/local/path' already exists and is not a valid git repo
git config --list | grep submodule | sed -e "s/submodule\.//" -e "s/\(.*\)\.url=\(.*\)/git submodule add --force \2 \1/" | bash
git версии 2.7.4. Эта команда обновляет локальный код
git submodule update --init --force --remote
источник
git submodule update --init --force --remote <module-name>
.Была такая же проблема, когда git игнорировал
init
иupdate
команды и ничего не делал.КАК ИСПРАВИТЬ
Если эти требования соблюдены, он будет работать. В противном случае все команды будут выполняться без каких-либо сообщений и результата.
Если вы все это сделали, но все равно не работает:
git submodule add git@... path/to
git submodule init
git submodule update
.gitmodules
и папку вашего модуля (обратите внимание, что содержимое папки не будет фиксироваться).git/config
вас еще нет подмодулейgit submodule init
- и вы увидите сообщение, что модуль зарегистрированgit submodule update
- получит модуль.git/config
и вы найдете зарегистрированный подмодульисточник
Кажется, здесь (тоже) много путаницы в ответах.
git submodule init
это не предназначено , чтобы волшебным образом генерировать вещи в .git / конфигурации (от .gitmodules). Он предназначен для настройки чего-либо в полностью пустом подкаталоге после клонирования родительского проекта или выполнения фиксации, которая добавляет ранее несуществующий подмодуль.Другими словами, вы следуете a
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
если это подмодуль внутри субмодуля), чтобы получить новый, ранее не существовавшее, подмодуль проверил; так же, как после первоначального клона проекта с подмодулями (где, очевидно, у вас и раньше не было этих подмодулей).источник
git help submodule
что об init говорится следующее: «init: инициализировать подмодули, записанные в индексе (которые были добавлены и зафиксированы где-то еще), путем копирования имен и URL-адресов подмодулей из .gitmodules в .git / config». Так он уверен , звучит , как он должен делать именно то , что вы говорите , это не делает ...? Пришло время обновить документацию по git?--init
это необходимо для получения новых подмодулей (вместо их автоматического включенияupdate
)? Похоже, что обновление вашего репозитория должно захватить все необходимое, если оно не уничтожит данные. С--init
заставляет вас знать , что новые Подмодули могли быть созданы, или просто всегда выдают--init
каждый раз , когда в этом случае, опять же , казалось бы , что она должна быть включена по умолчанию.У меня была та же проблема, но ни одно из вышеперечисленных решений не помогло. Записи в .gitmodules и .git / config были правильными, но команда
git submodules update --init --recursive
ничего не делала. Я также удалил каталог подмодулей, запустилgit submodules update --init --recursive
и вернул каталог подмодулей, но с точно такой же фиксацией, как и раньше.Я нашел ответ на этой странице . Команда такая:
git submodule update --remote
источник
git submodule update
вместоgit submodule update --remote
.Сотрите это. Я действительно заставил это работать
git submodule update --init --recursive
. Надеюсь это поможет.PS: Убедитесь, что вы находитесь в корневом каталоге git, а не в подмодуле.
источник
Думая , что вручную настройки
.gitmodules
достаточно является НЕПРАВИЛЬНОМой местный
git version 2.22.0
на момент написания этой статьи.Итак, я пришел в эту ветку, задаваясь вопросом, почему не
git submodule init
работает; Я настроил.gitmodules
файл и приступил к выполнениюgit submodule init
...ВАЖНЫЙ
git submodule add company/project.git includes/project
это требуется (при добавлении модуля в первый раз), это будет:.git/config
.gitmodules
файлincludes/project
в этом примере).Вы должны затем
git commit
после добавления подмодуля, это будет совершать.gitmodules
и гусеничное место подмодуля.Когда проект будет снова клонирован, он будет иметь
.gitmodules
и пустой каталог подмодулей (например,includes/project
в этом примере). На данный момент.git/config
еще нет конфигурации подмодуля, пока он неgit submodule init
будет запущен, и помните, что это работает только потому, что.gitmodules
Иincludes/project
отслеживаются в основном репозитории git.Также для справки см .:
источник
По ответу Дэйва Джеймса Миллера я могу подтвердить, что у меня это сработало. Здесь важно было зафиксировать идентификатор фиксации подпроекта. Просто иметь запись в .gitmodules было недостаточно.
Вот подходящий коммит:
https://github.com/dirkaholic/vagrant-php-dev-box/commit/d5f4c40bdbd80eefbb5ac6029823733f591435ae
источник
У меня такая же проблема.
.gitmodules
был подмодуль, но послеgit submodule init
команды его не было.git/config
.Оказывается, разработчик, добавивший подмодуль, также добавил в
.gitignore
файл каталог подмодуля . Это не работает.источник
Как и вы, я обнаружил, что git submodule sync не делает того, что вы ожидаете.
git submodule add
URL-адрес подмодуля изменяется только после повторного явного выполнения.Итак, я вставил этот скрипт
~/bin/git-submodule-sync.rb
:https://gist.github.com/frimik/5125436
И я также использую ту же логику в нескольких сценариях развертывания git после получения.
Все, что мне нужно сделать сейчас, это отредактировать
.gitmodules
, затем запустить этот скрипт, и он, наконец, заработает так, как я думалgit submodule sync
.источник
Сегодня у меня была такая же проблема, и я понял, что, поскольку я набрал
git submodule init
тогда, у меня была эта строка в моем.git/config
:Я удалил это и набрал:
И все вернулось к норме, мой подмодуль обновился в своей подкаталоге как обычно.
источник
Проблема для меня в том, что предыдущий разработчик репо зафиксировал эту
submodules/thing
папку как обычную папку, что означает, что когда я пытался запуститьgit submodule add ...
, она не выполнялась с:,'submodules/thing' already exists in the index
но попытка обновить подмодуль также не удалась, потому что он увидел, что путь не содержат подмодуль.Чтобы исправить это, мне пришлось удалить
submodules/thing
папку, зафиксировать удаление, а затем запуститьgit submodule add
команду, чтобы правильно добавить ее обратно:источник
Когда я увидел это сегодня, разработчик переместил часть дерева в новый подкаталог, и похоже, что его клиент git не записал обновленные правила подпроекта в дереве, вместо этого они были просто атакованы, оставив
.gitmodules
ссылку на оба устаревших местоположениям и подпроектам, которых больше нет в текущем дереве.Снова добавление подмодулей и сравнение уровней фиксации подмодуля с найденными в
git show $breaking_commit_sha
(поиск строк, соответствующих регулярному выражению^-Subproject
) для корректировки необходимых исправлений.источник
Удаление каталога подмодуля и его содержимого (папка "external / pyfacebook"), если он существует раньше,
git submodule add ...
может решить проблемы.источник
У меня была аналогичная проблема с подмодулем. Он просто не хотел, чтобы его клонировали / вытаскивали / обновляли / что-то еще.
При попытке повторно добавить подмодуль с помощью
git submodule add git@my-repo.git destination
я получил следующий результат:Итак, я попытался применить команду добавления :
git submodule add --force git@my-repo.git destination
В моем случае это сработало.
источник
Для записи:
я создал ту же проблему, добавив пустой репозиторий в качестве подмодуля. В этом случае для подмодуля не было доступного ссылочного хэша, что привело к ошибке, описанной исходным плакатом.
Принудительное добавление репозитория после его фиксации решило проблему (как в сообщении Arvids)
git submodule add --force git@my-repo.git destination
источник
.git/config
git submodule init
командуgit pull origin master
Он должен работать сейчас
источник
Просто поделился тем, что сработало для меня:
Это клонирует удаленный репозиторий, уже включающий подмодули. Это означает, что вам не нужно запускать git submodule update или init после клонирования.
источник
Приведенная ниже команда синхронизации решила проблему:
источник