Не знайдено відображення підмодуля у .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
Здається, що вам, можливо, вдалося додати цей шлях у вигляді посилання - підмодуль - це комбінація посилань і записів у файлах .gitmoddules та .git / config. З цього питання виникло нещодавнє питання; намагаються знайти його ...
Каскабель


@Jefromi - я не можу знайти жодного згадування про цей шлях у .gitпапці. Рухаємося grep -r "Classes/Support/Three20" *.*не дає ніяких результатів або
Бен Scheirman

2
@Ben: Чому ви шукаєте цей текст у папці .git? Це не те, як git зберігає вміст. Якщо ви дійсно хочете перевірити, що git думає, що це таке, спробуйте git ls-tree HEAD Classes/Support, і якщо він каже, що Three20 - це фіксація, там є gitlink. Якщо є, дотримуйтесь відповідних вказівок із пов'язаного вище питання VonC, щоб або перетворити його у належний підмодуль, або перетворити його на регулярно відстежуваний контент.
Каскабель

2
для майбутніх відвідувачів, якщо ваша проблема пов’язана з видаленим підмодулем та heroku, який видаляє помилку, встановіть 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файли у вашому робочому дереві.


Ще в темі "неправильної ініціалізації субмодуля", Jefromi згадує про підмодулі, які насправді є посиланнями.

Див. Як відстежувати вміст, що не відслідковується? з метою перетворення такого каталогу в реальний підмодуль.


5
У мене немає жодного файлу .gitmodules, і я все одно отримую це повідомлення під час кожного оформлення замовлення. Що мені робити?
aaronbauman

2
Знайдено моя відповідь тут: stackoverflow.com/questions/14720034 / ...
aaronbauman

4
@aaronbauman Так, вам потрібно видалити посилання gitlink, отже, git rm xxx(без останнього косого кута ) git rm --cachedдозволяє тримати його на диску, видаляючи його з індексу.
VonC

Після запуску git ls-файлів --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


2
він працював на мене після редагування .gitmodules файлу, щоб змінити https: // посилання на git: // посилання
Diwann

1
Це працювало і для мене, але я мав бути впевнений, що в кінці шляху підмодуля немає перерізу.
пітер

Не можу повірити, що забув варіант init. Якщо ви клонуєте проект, перед оновленням слід запустити підмодулі.
alex

Довелося запустити це в кореневому каталозі репо, тоді все працювало нормально. Дякую!
Pwdr

Дуже дякую за команду rm . Я дзвонив git submodule sync | grep "mapping found"тоді git rmі знову git submodule sync. Проблема відпала !.
дев'ять п'яти

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 не повинна використовуватися, якщо ви хочете клонувати головну гілку . Він видає цю помилку:

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]

9

Я просто потрапив на цю помилку після спроби "git submodule init" на новій касі мого репо. Виявляється, спочатку я вказав підпапку модуля з неправильним регістром. Оскільки я на Mac з файловою системою, що враховує регістр (hurr), вона вийшла з ладу. Наприклад:

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 буде добре. що видалить субдіар як індекс.


5

Просто була ця проблема. Якийсь час я спробував поради щодо видалення шляху, git видалення контуру, видалення .gitmodules, видалення запису з .git / config, додавання підмодулі назад, потім здійснення та натискання змін. Це було спантеличено, тому що це було схоже на відсутність змін, коли я робив "git commit -a", тому я спробував натиснути просто на видалення, а потім натиснути на повторне редагування, щоб це виглядало як зміна.

Через деякий час я випадково помітив, що після видалення всього, якщо я запустив "оновлення підмодуля git --init", у ньому з'явилося повідомлення про конкретну назву, на яку git більше не повинен мати посилання на: назву репозиторію, підмодуль посилався на, а не на назву шляху, на яку він перевіряв. Grepping показав, що ця посилання була в .git / index. Тому я запустив "git rm - кешоване репо-ім'я", а потім перечитав модуль. Коли я вчинив цей час, повідомлення про фіксацію включило зміну, що вона видаляла цей несподіваний об'єкт. Після цього він працює чудово.

Не впевнений, що сталося, я здогадуюсь, що хтось неправильно використовував команду git submodule, можливо, міняючи аргументи. Я міг бути навіть мені ... Сподіваюся, це комусь допоможе!


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 .


3

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

  1. перемістіть dirA-xxx на dirB-xxx
  2. змінити запис у .gitmodules для використання dirB-xxx
  3. змінити запис у .git / config для використання dirB-xxx
  4. змінити .git / module / 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 не вважатиме ці модулі підмодулями проекту.


1

Подивившись на моє .gitmodules, виявилось, що у мене були великі літери там, де я не мав. Тож майте на увазі, що .gitmodulesкаталоги залежать від регістру


1
ти впевнений, що .gitmodulesзамість цього не мав на увазі ?
Сергій Хейлик

0

У моєму випадку помилка, ймовірно, була пов'язана з неправильним злиттям між .gitmodules на двох гілках з різною конфігурацією підмодулів. Після прийняття пропозицій на цьому форумі я вирішив проблему редагування вручну файлу .gitmodules, додавши відсутній запис підмодуля досить просто. Після цього оновлення підмодуля команди git --init --рекурсивна працювало без проблем.


0

Проблема для нас полягала в тому, що в .gitmodules були додані подвійні записи підмодуля (ймовірно, злиття). Ми шукали шлях git, на який скаржилися у .gitmodules, і знайшли два однакові секції. Видалення одного з розділів вирішило для нас проблему.

Для чого це варто, git 1.7.1 дав помилку "без відображення підмодуля", але git 2.13.0, здається, не хвилює.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.