W .gitmodule nie znaleziono mapowania submodułów dla ścieżki, która nie jest submodułem

335

Mam projekt, który ma podmoduł w lib/three20

Mój .gitmoduleplik wygląda następująco:

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

Sklonowałem to w przeszłości bez błędów ( git submodule initpo którym następuje a git submodule update) i działa przez jakiś czas.

Próbowałem sklonować to na nowym komputerze, a teraz pojawia się ten błąd git submodule init:

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

Ta ścieżka to po prostu pusty folder w Xcode, którego używam do przechowywania projektów z innego katalogu. To nie jest część .gitmodulespliku, więc nie widzę, skąd bierze tę ścieżkę.

Jakieś pomysły?

Ben Scheirman
źródło
1
Wygląda na to, że mogłeś dodać tę ścieżkę jako gitlink - podmoduł to kombinacja gitlink i wpisów w plikach .gitmoddules i .git / config. Ostatnie pytanie dotyczyło tego; próbuje go znaleźć ...
Cascabel
@Jefromi - Nie mogę znaleźć żadnej wzmianki o tej ścieżce nigdzie w .gitfolderze. Wykonanie grep -r "Classes/Support/Three20" *.*nie przynosi żadnych rezultatów
Ben Scheirman
2
@Ben: Dlaczego szukasz tego tekstu w folderze .git? Nie tak git przechowuje treści. Jeśli naprawdę chcesz zweryfikować, co myśli git, spróbuj git ls-tree HEAD Classes/Support, a jeśli powie, że Three20 to zatwierdzenie, jest tam gitlink. Jeśli tak, postępuj zgodnie z odpowiednimi instrukcjami z pytania VonC, do którego link znajduje się powyżej, aby zmienić go w odpowiedni podmoduł lub przekształcić w regularnie śledzoną zawartość.
Cascabel
2
dla przyszłych użytkowników, jeśli problem jest powiązany z usuniętym modułem podrzędnym, a heroku generuje błąd, zainstaluj heroku-repo z github.com/heroku/heroku-repo i heroku repo: reset -a
nazwa aplikacji

Odpowiedzi:

310

W następstwie rajibchowdhury „s odpowiedź (upvoted), użyciegit rm polecenia, które jest zalecane jest usunięcie specjalnego wpisu w indeksie wskazującego submodule (a«folderu»ze specjalnym trybie 160000).

Jeśli do tej specjalnej ścieżki wpisu nie ma odniesienia w .gitmodule(np. „ Classes/Support/Three20” W pierwotnym pytaniu), należy ją usunąć, aby uniknąć komunikatu o błędzie „ Nie znaleziono mapowania podmodułu .gitmodulesdla ścieżki ”.

Możesz sprawdzić wszystkie wpisy w indeksie, które dotyczą podmodułów:

git ls-files --stage | grep 160000

Poprzednia odpowiedź (listopad 2010 r.)

Możliwe, że nie zadeklarowałeś poprawnie swojego początkowego submodułu (tj. Bez żadnego końca / końca na końcu, jak opisano w mojej starej odpowiedzi , mimo że masz .gitmoduleścieżki, które wyglądają w nim dobrze).

W tym wątku wspomniano:

pojawia się ten sam błąd podczas uruchamiania „git submodule init” ze świeżego klonu?
Jeśli tak, masz coś złego.

Jeśli nie masz podmodułów, usuń .gitmodulesi wszelkie odniesienia do podmodułów w .git / config i upewnij się, że katalog Pikimal nie ma .gitw nim katalogu .
Jeśli to rozwiąże problem, zamelduj się i zrób to samo na kopii roboczej rejsu.

Oczywiście nie usuwaj głównego .gitmodulespliku, ale dbaj o inne dodatkowe .gitmodulespliki z drzewa roboczego.


Wciąż w temacie „niepoprawnej inicjalizacji submodułu” Jefromi wymienia submoduły, które w rzeczywistości są gitlinkami.

Zobacz Jak śledzić nieśledzoną zawartość? aby przekonwertować taki katalog na prawdziwy podmoduł.

VonC
źródło
5
Nie mam żadnego pliku .gitmodules i wciąż otrzymuję ten komunikat przy każdym pobraniu / pobraniu. Co ja robię?
aaronbauman
2
Znalazłem moją odpowiedź tutaj: stackoverflow.com/questions/14720034/…
aaronbauman
4
@aaronbauman Tak, musisz usunąć gitlink, dlatego git rm xxx(bez ukośnika) git rm --cachedpozwala zachować go na dysku podczas usuwania go z indeksu.
VonC
Po uruchomieniu git ls-files --stage | grep 16000, znalazłem kilka wpisów. Jak je usunąć?
John Mike
1
@JohnMike, jeśli masz .gitmoduleodniesienia do tych wpisów, a następnie stackoverflow.com/a/16162000/6309 . Jeśli nie, prosty git rm afolder(bez końcowego / slash)
VonC
412

Nie znaleziono odwzorowania podmodułów w .gitmodules dla ścieżki „OtherLibrary / MKStore”, kiedy

$ git submodule update --init

Nie wiedziałem, dlaczego wystąpił błąd. Po spędzeniu minuty i znalezieniu odpowiedzi w stackoverflow.

$ git rm --cached OtherLibrary/MKStore

a następnie ponownie zaktualizuj submoduł. Działa dobrze.

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

rajibchowdhury
źródło
2
zadziałało dla mnie po edycji pliku .gitmodules, aby zmienić https: // linki przez git: // links
Diwann
1
To również działało dla mnie, ale musiałem się upewnić, że na końcu ścieżki submodułu nie było żadnego ukośnika.
Peter
Nie mogę uwierzyć, że zapomniałem opcji init. Jeśli sklonujesz projekt, przed aktualizacją należy uruchomić submoduły.
alex
Musiałem uruchomić to w katalogu głównym repozytorium, wtedy wszystko działało dobrze. Dzięki!
Pwdr,
Dziękuję bardzo za polecenie rm . Dzwoniłem od git submodule sync | grep "mapping found"czasu git rmdo czasu git submodule sync. Problem zniknął !.
nine9five
24

Kiedy użyję SourceTree do zrobienia tego, wypluje tę wiadomość.
Wiadomość, którą napotkałem:

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

Mój scenariusz polega na tym, że źle zastosowałem katalog projektu zawierający folder .git .
SourceTree uznał ten folder za podmoduł git, ale tak naprawdę nie.

Moje rozwiązanie polega na użyciu wiersza polecenia, aby go usunąć.

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

usuń śmieci z git i utrzymuj je w czystości.

Jasio
źródło
17

Rozwiązałem ten problem dla siebie. Początkowo próbowałem to zrobić:

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

Jak się okazuje, specyfikacja opcji --branch nie powinna być używana, jeśli chcesz sklonować gałąź master . Zgłasza ten błąd:

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

Za każdym razem, gdy próbujesz zrobić

git submodule sync

Ten błąd zostanie zgłoszony:

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

I wiersze potrzebne w .gitmodules nigdy nie są dodawane.

Tak więc dla mnie rozwiązaniem było:

git submodule add [URL] [PATH_TO_SUBMODULE]
luksak
źródło
9

Właśnie trafiłem w ten błąd po próbie „git submodule init” przy nowej kasie mojego repozytorium. Okazuje się, że początkowo podałem podfolder modułu z niewłaściwym przypadkiem. Ponieważ jestem na komputerze Mac z systemem plików z rozróżnianiem wielkości liter (hurr), to nie działa. Na przykład:

git submodule add [email protected]:user/project.git MyApp/Resources/Project
Cloning into 'MyApp/Resources/Project'

udaje się, ale problem polega na tym, że na dysku jest ścieżka

Myapp/Resources/Project

Nie rozumiem, dlaczego git inicjuje moduł w niewłaściwym folderze (ignorując niepoprawną wielkość liter w moim poleceniu), a następnie działa poprawnie (przez niepowodzenie) z kolejnymi poleceniami.

James Moore
źródło
To samo tutaj (Windows), chociaż nie rozumiem dlaczego. Powinieneś mieć swobodę określania folderu z inną obudową do kasy, co nie powinno zmieniać nazwy modułu.
Xavier Poinas
6

Po prostu git rm subdir będzie dobrze. spowoduje to usunięcie podkatalogu jako indeksu.

hit9
źródło
5

Właśnie miałem ten problem. Przez jakiś czas próbowałem porady dotyczące usuwania ścieżki, git usuwania ścieżki, usuwania .gitmodules, usuwania wpisu z .git / config, dodawania submodułu z powrotem, a następnie zatwierdzania i wypychania zmiany. To było zagadkowe, ponieważ nie wyglądało na żadną zmianę, kiedy wykonałem polecenie „git commit -a”, więc próbowałem przesunąć tylko usunięcie, a następnie przesunięcie odczytu, aby wyglądało jak zmiana.

Po chwili przypadkowo zauważyłem, że po usunięciu wszystkiego, jeśli uruchomiłem polecenie „git submodule update --init”, miał komunikat o konkretnej nazwie, do której git nie powinien już mieć żadnego odniesienia: nazwa repozytorium podmodułu linkuje do, a nie nazwa ścieżki, do której sprawdzał. Grepping ujawnił, że to odwołanie znajduje się w .git / index. Uruchomiłem więc „git rm --cached repo-name”, a następnie przeczytałem moduł. Kiedy zatwierdziłem ten czas, komunikat zatwierdzenia zawierał zmianę polegającą na usunięciu tego nieoczekiwanego obiektu. Po tym działa dobrze.

Nie jestem pewien, co się stało, domyślam się, że ktoś źle wykorzystał polecenie submodułu git, może odwracając argumenty. Mógłbym być nawet ja ... Mam nadzieję, że to komuś pomaga!

anomolos
źródło
5

w pliku .gitmodules zamieniłem ciąg

"path = thirdsrc\boost" 

z

"path = thirdsrc/boost", 

i rozwiązane! - -

zhuzhai liu
źródło
dzięki naprawił mój problem. prawdopodobnie problem występujący w systemie Windows. W moim przypadku ścieżka brzmiała „ścieżka = folder \ coś”
Roozbeh G
To działało dla mnie, gdy trafiłem błąd podczas używania git-lfs zamiast git w systemie Windows. (Podczas używania standardowego gita nie wystąpił błąd)
frage
5

Mapowanie folderów można znaleźć w .git/modulesfolderze (każdy ma configplik w odniesieniu do jego worktree), więc upewnij się, że foldery te odpowiadają konfiguracji w .gitmodulesi .git/config.

Tak więc .gitmodulesma właściwą ścieżkę:

[submodule "<path>"]
  path = <path>
  url = [email protected]:foo/bar.git

a .git/modules/<path>/configw [core]sekcji masz właściwą ścieżkę do <path>, na przykład

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

Jeśli .git/modulesbrakuje odpowiedniego folderu , przejdź do katalogu podmodułu i wypróbuj git reset HEAD --hardlub git checkout master -f. Jeśli to nie pomoże, prawdopodobnie chcesz usunąć wszystkie odniesienia do uszkodzonego podmodułu i dodać go ponownie, zobacz: Zmień nazwę podmodułu git .

kenorb
źródło
3

Scenariusz: zmiana submodułu z katalogu dirA-xxx na inny katalog dirB-xxx

  1. przenieś katalog dirA-xxx na katalog dirB-xxx
  2. zmodyfikuj wpis w .gitmodules, aby użyć dirB-xxx
  3. zmodyfikuj wpis w .git / config, aby użyć dirB-xxx
  4. zmodyfikuj .git / modules / dirA-xxx / config, aby odzwierciedlić poprawny katalog
  5. zmodyfikuj katalog dirA-xxx / .git, aby odzwierciedlał poprawny katalog
  6. biegać git submodule status

    jeśli błąd powrotu: Nie znaleziono mapowania submodułów w .gitmodules dla ścieżki dirA-xxx. Wynika to z faktu, że dirA-xxx nie istnieje, ale wciąż jest śledzony przez git. Zaktualizuj indeks git przez:git rm --cached dirA-xxx

    Spróbuj z git submodule foreach git pull. Nie przeszedłem właściwego badania struktury submodułu git, więc powyższe kroki mogą coś zepsuć. Niemniej jednak, przechodząc przez powyższe kroki, w tej chwili wszystko wygląda dobrze. Jeśli masz jakiś wgląd lub właściwe kroki, aby załatwić sprawę, udostępnij ją tutaj. :)

rozpoznać
źródło
1

Zwykle git tworzy ukryty katalog w katalogu głównym projektu (.git /)

Podczas pracy nad systemem CMS możliwe jest zainstalowanie modułów / wtyczek zawierających katalog .git / z metadanymi git dla określonego modułu / wtyczki

Najszybszym rozwiązaniem jest znalezienie wszystkich katalogów .git i zachowanie tylko głównego katalogu metadanych git. Jeśli to zrobisz, git nie uzna tych modułów za podmoduły projektu.

yilmi
źródło
1

Po obejrzeniu mojego .gitmodulesokazało się, że mam wielką literę, w której nie powinienem. Pamiętaj więc, że w .gitmoduleskatalogach rozróżniana jest wielkość liter

Kelsey
źródło
1
jesteś pewien, że .gitmoduleszamiast tego nie miałeś na myśli ?
Serhii Kheilyk
0

W moim przypadku błąd był prawdopodobnie spowodowany niepoprawnym połączeniem między .gitmodules w dwóch gałęziach z różnymi konfiguracjami submodułów. Po zapoznaniu się z sugestiami z tego forum rozwiązałem problem z ręczną edycją pliku .gitmodules, dodanie brakującego wpisu modułu jest dość łatwe. Następnie polecenie git submodule update --init --recursive działało bez problemów.

użytkownik2281802
źródło
0

Problemem dla nas było to, że do .gitmodules zostały dodane zduplikowane pozycje submodułu (prawdopodobnie z połączenia). Szukaliśmy ścieżki, na którą Git narzekał w .gitmodules i znaleźliśmy dwie identyczne sekcje. Usunięcie jednej z sekcji rozwiązało dla nas problem.

Za to, co jest warte, git 1.7.1 dał błąd „brak mapowania podmodułu”, ale git 2.13.0 nie wydawał się tym przejmować.

Walter Wilfinger
źródło