В .gitmodule не найдено отображение подмодулей для пути, который не является подмодулем

335

У меня есть проект, который имеет подмодуль в lib/three20

мой .gitmodule файл выглядит так:

[submodule "lib/three20"]
    path = lib/three20
    url = git://github.com/facebook/three20.git

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

Я попытался клонировать это на новую машину, и теперь я получаю эту ошибку на git submodule init :

No submodule mapping found in .gitmodules for path 'Classes/Support/Three20'

Этот путь - просто пустая папка в Xcode, которую я использую для размещения проектов из другого каталога. Это не часть .gitmodulesфайла, поэтому я не вижу, откуда он получает этот путь.

Любые идеи?

Бен Шейрман
источник
1
Похоже, вам, возможно, удалось добавить этот путь в качестве gitlink - подмодуль представляет собой комбинацию gitlink и записей в файлах .gitmoddules и .git / config. Был недавний вопрос об этом; пытаясь найти его ...
Каскабель
@Jefromi - я не могу найти упоминания об этом пути нигде в .gitпапке. Выполнение а grep -r "Classes/Support/Three20" *.*также не дает никаких результатов
Бен Шейрман
2
@Ben: Почему вы ищете этот текст в папке .git? Это не то, как Git хранит контент. Если вы действительно хотите проверить, что думает Git, попробуйте git ls-tree HEAD Classes/Support, и если он говорит, что Three20 - это коммит, там есть gitlink. Если есть, следуйте соответствующим инструкциям из вопроса VonC, с которым вы столкнулись выше, чтобы либо превратить его в правильный субмодуль, либо в регулярно отслеживаемый контент.
Каскабель
2
для будущих посетителей, если ваша проблема связана с удаленным субмодулем, а геройку выдает ошибку, установите heroku-repo с github.com/heroku/heroku-repo и heroku repo: сброс -a appname
fadomire

Ответы:

310

После rajibchowdhury «s ответа (upvoted), используйтеgit rm команду , которая рекомендуется для удаления специальной записи индекса , указывающего подмодуль (а„папки“с особым режимом 160000).

Если этот специальный путь входа не указан в .gitmodule(как ' Classes/Support/Three20' в исходном вопросе), то вам нужно удалить его, чтобы избежать сообщения об ошибке « Не найдено сопоставление субмодуля .gitmodulesдля пути ».

Вы можете проверить все записи в индексе, которые ссылаются на подмодули:

git ls-files --stage | grep 160000

Предыдущий ответ (ноябрь 2010)

Возможно, вы неправильно объявили свой начальный подмодуль (т.е. без хвоста '/' в конце, как описано в моем старом ответе , даже если у вас .gitmoduleесть пути, которые в нем выглядят нормально).

В этой теме упоминается:

вы получаете ту же ошибку при запуске 'git submodule init' из свежего клона?
Если это так, у вас что-то не так.

Если у вас нет подмодулей, удалите .gitmodulesи любые ссылки на подмодули в .git / config и убедитесь, что в Pikimal dir нет .gitdir.
Если это решит проблему, зарегистрируйтесь и сделайте то же самое на своей рабочей копии круиза.

Очевидно, не удаляйте ваш основной .gitmodulesфайл, но позаботьтесь о других дополнительных .gitmodulesфайлах в вашем рабочем дереве.


Тем не менее, в теме «неправильной инициализации подмодулей» Джефроми упоминает подмодули, которые на самом деле являются gitlinks.

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

VonC
источник
5
У меня нет файла .gitmodules, и я по-прежнему получаю это сообщение при каждой проверке / извлечении. Что мне делать?
Аарон Бауман
2
Нашел мой ответ здесь: stackoverflow.com/questions/14720034/…
aaronbauman
4
@aaronbauman Да, вам нужно удалить gitlink, поэтому git rm xxx(без косой черты) git rm --cachedвы можете сохранить его на диске, удаляя его из индекса.
VonC
После запуска git ls-files --stage | grep 16000, я нашел несколько записей. Как мне удалить это?
Джон Майк
1
@JohnMike, если у вас есть .gitmoduleссылки на эти записи, то stackoverflow.com/a/16162000/6309 . Если нет, то все просто git rm afolder(без трейлинга / слэша)
VonC
412

Не найдено сопоставление подмодулей в .gitmodules для пути 'OtherLibrary / MKStore', когда

$ git submodule update --init

Я не знал, почему произошла ошибка. Потратив минуту и ​​нашел ответ в stackoverflow.

$ git rm --cached OtherLibrary/MKStore

и затем обновите субмодуль снова. Работает нормально.

http://en.saturngod.net/no-submodule-mapping-found-in-gitmodules

rajibchowdhury
источник
2
у меня это сработало после того, как я отредактировал файл .gitmodules, чтобы изменить https: // ссылки по git: // links
Diwann
1
Это сработало и для меня, но я должен был убедиться, что в конце пути субмодуля не было косой черты.
Питер
Я не могу поверить, что я забыл опцию init. Если вы клонируете проект, необходимо запустить подмодули, прежде чем обновлять их.
Алекс
Пришлось запустить это в корневом каталоге репо, тогда все работало нормально. Спасибо!
Pwdr
Большое спасибо за команду rm . Я звонил git submodule sync | grep "mapping found"тогда git rmи снова git submodule sync. Проблема ушла!
9-9
24

Когда я использую SourceTree, он выдаст это сообщение.
Сообщение, с которым я столкнулся:

git -c diff.mnemonicprefix=false -c core.quotepath=false -c credential.helper=sourcetree submodule update --init --recursive
No submodule mapping found in .gitmodules for path 'SampleProject/SampleProject'
Completed with errors, see above

Мой сценарий - я неправильно применил каталог проекта, содержащий папку .git .
SourceTree рассматривал эту папку как подмодуль git, но на самом деле это не так.

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

$ git rm -r SampleProject --cached
$ git commit -m "clean up folders"

уберите мусор в мерзавце и держите его в чистоте.

Джонни
источник
17

Я решил эту проблему для меня. Первоначально я пытался сделать это:

git submodule add --branch master [URL] [PATH_TO_SUBMODULE]

Как оказалось, спецификация опции --branch не должна использоваться, если вы хотите клонировать ветку master . Выдает эту ошибку:

fatal: Cannot force update the current branch.
Unable to checkout submodule '[PATH_TO_SUBMODULE]'

Каждый раз, когда вы пытаетесь сделать

git submodule sync

Эта ошибка будет выдана:

No submodule mapping found in .gitmodules for path '[PATH_TO_SUBMODULE]'

И строки, необходимые в .gitmodules, никогда не добавляются.

Таким образом, решение для меня было следующим:

git submodule add [URL] [PATH_TO_SUBMODULE]
luksak
источник
9

Я просто нажал эту ошибку после попытки "git submodule init" при новой проверке моего репо. Оказывается, я изначально указал подпапку модуля с неправильным регистром. Так как я на Mac с чувствительной к регистру файловой системой (ура), это терпело неудачу. Например:

git submodule add git@github.com:user/project.git MyApp/Resources/Project
Cloning into 'MyApp/Resources/Project'

успешно, но проблема в том, что на диске путь

Myapp/Resources/Project

Что я не понимаю, так это то, почему git запускает модуль в неправильную папку (игнорируя неверный регистр в моей команде), но затем работает правильно (с ошибками) с последующими командами.

Джеймс Мур
источник
То же самое здесь (Windows), хотя я не понимаю, почему. Вы можете свободно указать папку с другим регистром для проверки, и это не должно изменить имя модуля.
Ксавье Поинас
6

Просто git rm subdir будет хорошо. это удалит subdir как индекс.

hit9
источник
5

Просто была эта проблема. Некоторое время я пытался получить совет по удалению пути, git - по удалению пути, удалению .gitmodules, удалению записи из .git / config, добавлению подмодуля обратно, затем принятию и отправке изменений. Это было озадачивающе, потому что это выглядело как без изменений, когда я делал «git commit -a», поэтому я попытался нажать только на удаление, а затем на чтение, чтобы оно выглядело как изменение.

Через некоторое время я случайно заметил, что после удаления всего, если я запустил «git submodule update --init», у него появилось сообщение об определенном имени, на которое git больше не должен был ссылаться: имя хранилища подмодуль ссылался на, а не на путь, по которому он проверял. Греппинг показал, что эта ссылка была в .git / index. Поэтому я запустил «git rm --cached repo-name» и затем прочитал модуль. Когда я зафиксировал это время, в сообщении о фиксации содержалось изменение об удалении этого неожиданного объекта. После этого все работает нормально.

Не уверен, что случилось, я предполагаю, что кто-то неправильно использовал команду git submodule, возможно, поменял аргументы. Мог бы даже я ... Надеюсь, это кому-нибудь поможет!

anomolos
источник
5

в файле .gitmodules я заменил строку

"path = thirdsrc\boost" 

с участием

"path = thirdsrc/boost", 

и это решено! - -

Жужай Лю
источник
спасибо исправил мою проблему. Вероятно, проблема, которая возникает в Windows. В моем случае путь был "путь = что-то \\ папка"
Roozbeh G
Это сработало для меня, когда я столкнулся с ошибкой при использовании git-lfs вместо git на windows. (При использовании стандартного git ошибки не возникало)
frage
5

Сопоставление папок можно найти в .git/modulesпапке (у каждого есть configфайл со ссылкой на его worktree), поэтому убедитесь, что эти папки соответствуют конфигурации в .gitmodulesи .git/config.

Итак, .gitmodulesимеет правильный путь:

[submodule "<path>"]
  path = <path>
  url = git@github.com:foo/bar.git

и .git/modules/<path>/configв [core]разделе у Вас есть правильный путь к вашему <path>, например ,

[core]
  repositoryformatversion = 0
  filemode = true
  bare = false
  logallrefupdates = true
  worktree = ../../../<path>

Если нужная папка .git/modulesотсутствует, вам нужно перейти в каталог подмодулей и попробовать git reset HEAD --hardили git checkout master -f. Если это не поможет, вы, вероятно, захотите удалить все ссылки на сломанный подмодуль и добавить его снова, а затем: Переименовать подмодуль git .

kenorb
источник
3

Сценарий: изменение подмодуля из каталога dirA-xxx в другой каталог dirB-xxx

  1. переместить dirA-xxx в dirB-xxx
  2. изменить запись в .gitmodules, чтобы использовать dirB-xxx
  3. изменить запись в .git / config, чтобы использовать dirB-xxx
  4. измените .git / modules / dirA-xxx / config, чтобы отобразить правильный каталог
  5. измените dirA-xxx / .git, чтобы отобразить правильный каталог
  6. бегать git submodule status

    если возвращается ошибка: в .gitmodules для пути dirA-xxx не найдено отображение подмодулей. Это связано с тем, что dirA-xxx не существует, но все еще отслеживается git. Обновите индекс git:git rm --cached dirA-xxx

    Попробуй с git submodule foreach git pull. Я не изучал структуру подмодулей git, поэтому вышеописанные шаги могут что-то сломать. Тем не менее, пройдя вышеупомянутые шаги, все выглядит хорошо в данный момент. Если у вас есть какие-либо идеи или правильные шаги для достижения цели, поделитесь ими здесь. :)

кругозор
источник
1

Обычно git создает скрытый каталог в корневом каталоге проекта (.git /)

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

Самое быстрое решение - найти все каталоги .git и сохранить только свой корневой каталог метаданных git. Если вы сделаете это, git не будет рассматривать эти модули как подмодули проекта.

yilmi
источник
1

Посмотрев на мою .gitmodules, оказалось, что у меня есть заглавная буква, которую я не должен был иметь. Так что имейте в виду, .gitmodulesкаталоги чувствительны к регистру

Kelsey
источник
1
ты уверен, что не имел в виду .gitmodulesвместо этого?
Сергей Хейлик
0

В моем случае ошибка была, вероятно, из-за неправильного слияния .gitmodules на двух ветвях с различными конфигурациями подмодулей. Получив предложения от этого форума, я решил проблему, отредактировав вручную файл .gitmodules, добавив недостающую запись подмодуля довольно легко. После этого команда git submodule update --init --recursive работала без проблем.

user2281802
источник
0

Проблема для нас заключалась в том, что дублированные записи субмодулей были добавлены в .gitmodules (вероятно, из слияния). Мы искали путь, на который жаловался git в .gitmodules, и нашли два идентичных раздела. Удаление одного из разделов решило проблему для нас.

Что бы это ни стоило, git 1.7.1 выдал ошибку «no submodule mapping», но git 2.13.0, похоже, не заботился.

Уолтер Уилфингер
источник