Подмодули Git. Втягивание в новый клон суперпроекта


87

ОК. Так что я подумал, что мне это лизнули ... но теперь ....

У меня есть проект, который включает в себя одну небольшую библиотеку из GitHub в качестве подмодуля. В исходной версии этого суперпроекта подмодуль работает должным образом.

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

Если я сейчас попытаюсь сделать

git submodule update

я получил

fatal: Needed a single revision 
Unable to find current revision in submodule path 'external_libraries/BEACHhtml'

Если я попробую

git submodule foreach git pull

я получил

Entering 'external_libraries/BEACHhtml'
fatal: Where do you want to fetch from today?
Stopping at 'external_libraries/BEACHhtml'; script returned non-zero status.

В моем .git / config у меня есть следующее:

[submodule "external_libraries/BEACHhtml"]
    url = git@github.com:interstar/BEACHhtml.git

В моих .gitmodules у меня есть это:

[submodule "external_libraries/BEACHhtml"]
path = external_libraries/BEACHhtml
url = git@github.com:interstar/BEACHhtml.git

У кого-нибудь есть идея, чего не хватает?

Ответы:


189

Похоже, что теперь (в 2019 году) установка последнего клиента GIT может решить проблему согласно комментариям ниже. На данный момент это должно быть лучшим решением.


У меня такая же проблема, как и у вас. Это ошибка в git: http://git.661346.n2.nabble.com/BUG-git-submodule-update-is-not-fail-safe-td7574168.html

Короче говоря, для вашей проблемы попробуйте:

# rm -rf external_libraries/BEACHhtml
# git submodule update

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


1
для меня это был зависший git-fetch, который держал папку заблокированной
Михай Тимар

32
Мне пришлось удалить как подмодуль worktree ( ext/blah), так и соответствующую папку под GIT_DIR( .git/modules/ext/blah).
Tobu

2
В моем конкретном случае git submodule updateна моем сервере CI продолжался сбой, потому что он хотел, чтобы кто-то принял ключи RSA (сервер ci обычно использует соединение https, и это был первый раз, когда субмодуль подключился к ssh-соединению). Надеюсь, это сэкономит кому-нибудь час чесать голову!
Maverik

8
В 2016 году эта ошибка все еще продолжается :(
Пауло Невес

6
2017 год, все еще присутствует.
william.taylor 09

4

У меня была эта проблема (нестабильная сеть, поэтому я потерял проверку подмодуля, как это), и я решил ее, создав этот скрипт (назвал его, git-submodule-fixчтобы я мог запустить его как git submodule-fix)

#!/bin/bash 

for arg 
do 
  echo $arg 
  find . -name "`basename $arg`" | grep "$arg\$" | xargs rm -fr
done

Если вы получите это, например, от git submodule update

fatal: Needed a single revision
Unable to find current revision in submodule path 'some/submodule/path'

делать

git submodule-fix some/submodule/path
git submodule update

3

Решено удалением 2 каталогов и повторной загрузкой подмодуля:

  1. Зайдите external_libraries/BEACHhtmlи посмотрите в .gitфайл. Его содержание должно быть примерно такимgitdir: ../../.git/modules/external_libraries/BEACHhtml
  2. Удалить как external_libraries/BEACHhtmlи .git/modules/external_libraries/BEACHhtmlкаталоги.

Отныне git submodule updateработает без ошибок.


вам может потребоваться запустить его git submodule initраньше, git submodule updateчтобы подмодуль был повторно инициализирован, тогда это сработает.
Pellet

1

Если вы читаете в 2019 году или позже, просто обновите клиент git. Работал у меня.


0

используйте инструмент сравнения, чтобы сравнить исходный работающий клон и этот. Также, что делает git submoduleoutput. Перед тем как это сделать, убедитесь, что вы указываете на одну и ту же ветку в каждом репо.

Я подозреваю, что вы перешли на ветку или старую ревизию, в которой не был определен подмодуль.

надеюсь это поможет


0

У меня была такая же проблема с подмодулем в проекте. Когда я попытался клонировать подмодуль по отдельности, это сработало.

Я пробовал все ответы выше, но безуспешно (git submodule update, ..., удаление папок подмодуля, ...).

Проблема исчезла после обновления git (с Git-1.7.11-preview20120710) до последней версии (до Git-1.8.1.2-preview20130201) на тот момент. Как ни странно, у моих коллег была и более старая версия, работала без проблем, но они были на Mac. Я на Win7 64bit.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.