Tidak ditemukan pemetaan submodule di .gitmodule untuk jalur yang bukan submodule

335

Saya punya proyek yang memiliki submodule di lib/three20

.gitmoduleFile saya terlihat seperti ini:

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

Saya telah mengkloning ini di masa lalu tanpa kesalahan, ( git submodule initdiikuti oleh a git submodule update) dan sudah berfungsi untuk sementara waktu.

Saya mencoba untuk mengkloning ini ke mesin baru, dan sekarang saya mendapatkan kesalahan ini pada git submodule init:

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

Path itu hanyalah folder kosong di Xcode yang saya gunakan untuk menyimpan proyek-proyek dari direktori lain. Itu bukan bagian dari .gitmodulesfile, jadi saya tidak melihat dari mana ia mendapatkan jalur ini.

Ada ide?

Ben Scheirman
sumber
1
Sepertinya Anda mungkin berhasil menambahkan jalur itu sebagai gitlink - submodule adalah kombinasi dari gitlink dan entri dalam file .gitmoddules dan .git / config. Ada pertanyaan baru tentang ini; berusaha menemukannya ...
Cascabel
@ Jefromi - Saya tidak dapat menemukan jalan itu di .gitfolder. Melakukan hal grep -r "Classes/Support/Three20" *.*itu juga tidak membuahkan hasil apa pun
Ben Scheirman
2
@ Ben: Mengapa Anda mencari teks itu di folder .git? Itu bukan cara git menyimpan konten. Jika Anda benar-benar ingin memverifikasi apa yang menurut git, coba git ls-tree HEAD Classes/Support, dan jika dikatakan bahwa Three20 adalah commit, ada gitlink di sana. Jika ada, ikuti instruksi yang sesuai dari pertanyaan VonC yang ditautkan di atas untuk mengubahnya menjadi submodule yang tepat atau mengubahnya menjadi konten yang dilacak secara teratur.
Cascabel
2
untuk pengunjung masa depan, jika masalah Anda terkait dengan submodule yang dihapus dan heroku melempar kesalahan, instal heroku-repo dari github.com/heroku/heroku-repo dan heroku repo: reset -a
appname

Jawaban:

310

Berikut rajibchowdhury 's jawaban (upvoted), penggunaangit rm perintah yang disarankan adalah untuk menghapus entri khusus dalam indeks menunjukkan submodule (a 'folder' dengan modus khusus 160000).

Jika jalur entri khusus itu tidak dirujuk dalam .gitmodule(seperti ' Classes/Support/Three20' dalam pertanyaan asli), maka Anda harus menghapusnya, untuk menghindari pesan kesalahan " Tidak ada pemetaan submodule yang ditemukan di .gitmodulesjalur ".

Anda dapat memeriksa semua entri dalam indeks yang mereferensikan submodul:

git ls-files --stage | grep 160000

Jawaban sebelumnya (November 2010)

Ada kemungkinan bahwa Anda belum menyatakan submodul awal Anda dengan benar (yaitu tanpa ekor '/' pada akhirnya, seperti yang dijelaskan dalam jawaban saya yang lama , meskipun Anda .gitmodulememiliki jalur yang terlihat ok di dalamnya).

Utas ini menyebutkan:

apakah Anda mendapatkan kesalahan yang sama saat menjalankan 'git submodule init' dari klon baru?
Jika demikian, Anda memiliki sesuatu yang salah.

Jika Anda tidak memiliki submodul, hapus .gitmodules, dan referensi ke submodul di .git / config, dan pastikan dir Pikimal tidak memiliki .gitdir di dalamnya.
Jika itu memperbaiki masalah, periksa dan lakukan hal yang sama pada copy pekerjaan pelayaran Anda.

Jelas, jangan hapus .gitmodulesfile utama Anda , tetapi perhatikan .gitmodulesfile tambahan lainnya di pohon kerja Anda.


Masih dalam topik "inisialisasi submodul yang salah", Jefromi menyebutkan submodul yang sebenarnya adalah gitlink.

Lihat Bagaimana cara melacak konten yang tidak terlacak? untuk mengubah direktori seperti itu menjadi submodule nyata.

VONC
sumber
5
Saya tidak punya file .gitmodules dan saya masih menerima pesan ini di setiap checkout / pull. Apa yang saya lakukan?
aaronbauman
2
Ditemukan jawaban saya di sini: stackoverflow.com/questions/14720034/...
aaronbauman
4
@aaronbauman Ya, Anda perlu menghapus gitlink, karenanya git rm xxx(tanpa trailing slash) git rm --cachedmemungkinkan Anda untuk menyimpannya di disk saat menghapusnya dari indeks.
VonC
Setelah menjalankan git ls-files --stage | grep 16000, saya telah menemukan beberapa entri. Bagaimana cara menghapus ini?
John Mike
1
@JohnMike jika Anda memiliki .gitmodulereferensi entri tersebut, kemudian stackoverflow.com/a/16162000/6309 . Jika tidak, sederhana git rm afolder(tanpa trailing / slash)
VonC
412

Tidak ditemukan pemetaan submodule di .gitmodules untuk jalur 'OtherLibrary / MKStore' saat

$ git submodule update --init

Saya tidak tahu mengapa kesalahan itu terjadi. Setelah menghabiskan satu menit dan menemukan jawabannya di stackoverflow.

$ git rm --cached OtherLibrary/MKStore

dan kemudian perbarui submodule lagi. Ini bekerja dengan baik.

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

rajibchowdhury
sumber
2
itu bekerja untuk saya setelah mengedit file .gitmodules untuk mengubah https: // tautan oleh git: // tautan
Diwann
1
Ini juga bekerja untuk saya, tetapi saya harus yakin tidak ada garis miring di ujung jalur submodule.
peter
Saya tidak percaya saya lupa opsi init. Jika Anda mengkloning suatu proyek, sebaiknya mulai submodul sebelum memperbaruinya.
alex
Harus menjalankan ini di direktori root dari repo, maka semuanya bekerja dengan baik. Terima kasih!
Pwdr
Terima kasih banyak atas perintah rm . Aku menelepon git submodule sync | grep "mapping found"kemudian git rmdan lagi git submodule sync. Masalah hilang !.
nine9five
24

Ketika saya menggunakan SourceTree untuk melakukan hal-hal itu, itu akan memuntahkan pesan ini.
Pesan yang saya temui:

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

Skenario saya adalah saya salah menerapkan direktori proyek yang berisi folder .git .
SourceTree menganggap folder ini sebagai git submodule, tetapi sebenarnya tidak.

Solusi saya adalah menggunakan baris perintah untuk menghapusnya.

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

hapus sampah di git dan jaga kebersihannya.

Johnny
sumber
17

Saya menyelesaikan masalah ini untuk saya. Awalnya saya mencoba melakukan ini:

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

Karena ternyata spesifikasi opsi - cabang tidak boleh digunakan jika Anda ingin mengkloning cabang master . Itu melempar kesalahan ini:

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

Setiap kali Anda mencoba melakukan

git submodule sync

Kesalahan ini akan terjadi:

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

Dan garis yang dibutuhkan dalam .gitmodules tidak pernah ditambahkan.

Jadi solusi bagi saya adalah ini:

git submodule add [URL] [PATH_TO_SUBMODULE]
luksak
sumber
9

Saya baru saja menemukan kesalahan ini setelah mencoba "git submodule init" pada checkout baru dari repo saya. Ternyata saya telah menentukan sub-folder modul dengan case yang salah pada awalnya. Karena saya menggunakan Mac dengan sistem file case-sensitive (jam) itu gagal. Sebagai contoh:

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

berhasil tetapi masalahnya adalah pada disk pathnya

Myapp/Resources/Project

Yang tidak saya mengerti adalah mengapa git init'ing modul ke folder yang salah (mengabaikan kasus yang salah dalam perintah saya) tetapi kemudian beroperasi dengan benar (dengan gagal) dengan perintah berikutnya.

James Moore
sumber
Sama di sini (Windows), meskipun saya tidak mengerti mengapa. Anda harus bebas menentukan folder dengan casing berbeda untuk checkout dan ini tidak boleh mengubah nama modul.
Xavier Poinas
6

Hanya git rm subdir akan baik-baik saja. yang akan menghapus subdir sebagai indeks.

hit9
sumber
5

Baru saja mengalami masalah ini. Untuk sementara saya mencoba saran tentang menghapus path, git menghapus path, menghapus .gitmodules, menghapus entri dari .git / config, menambahkan submodule kembali, kemudian melakukan dan mendorong perubahan. Itu membingungkan karena sepertinya tidak ada perubahan ketika saya melakukan "git commit -a" jadi saya mencoba mendorong penghapusan saja, lalu mendorong readdition untuk membuatnya terlihat seperti perubahan.

Setelah beberapa saat saya perhatikan secara tidak sengaja bahwa setelah menghapus semuanya, jika saya menjalankan "git submodule update --init", ada pesan tentang nama spesifik yang git seharusnya tidak lagi memiliki referensi ke: nama repositori submodule sedang ditautkan, bukan nama jalur yang diperiksanya. Grepping mengungkapkan bahwa referensi ini ada di .git / index. Jadi saya menjalankan "git rm --cached repo-name" dan kemudian membaca kembali modul. Ketika saya melakukan kali ini, pesan komit menyertakan perubahan bahwa ia menghapus objek yang tidak terduga ini. Setelah itu berfungsi dengan baik.

Tidak yakin apa yang terjadi, saya menduga seseorang menyalahgunakan perintah submit git, mungkin membalikkan argumen. Bisa jadi saya bahkan ... Semoga ini bisa membantu seseorang!

anomolos
sumber
5

dalam file .gitmodules , saya mengganti string

"path = thirdsrc\boost" 

dengan

"path = thirdsrc/boost", 

dan itu terpecahkan! - -

zhuzhai liu
sumber
terima kasih memperbaiki masalah saya. mungkin masalah yang terjadi di windows. Dalam jalur kasus saya adalah "path = sesuatu \\ folder"
Roozbeh G
Ini bekerja untuk saya ketika saya menemukan kesalahan saat menggunakan git-lfs bukannya git di windows. (Tidak ada kesalahan terjadi ketika menggunakan git standar)
frage
5

Pemetaan folder dapat ditemukan di .git/modulesfolder (masing-masing memiliki configfile dengan rujukannya worktree), jadi pastikan folder ini sesuai dengan konfigurasi di .gitmodulesdan .git/config.

Begitu .gitmodulesjuga dengan jalur yang benar:

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

dan di .git/modules/<path>/configdalam [core]bagian Anda memiliki jalur yang benar ke Anda <path>, misalnya

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

Jika folder kanan .git/modulestidak ada, maka Anda harus pergi ke dir submodule Anda dan coba git reset HEAD --hardatau git checkout master -f. Jika ini tidak membantu, Anda mungkin ingin menghapus semua referensi untuk submodule yang rusak dan menambahkannya lagi, lalu lihat: Ganti nama submit git .

kenorb
sumber
3

Skenario: mengubah submodule dari direktori dirA-xxx ke direktori dirB-xxx lainnya

  1. pindahkan dirA-xxx ke dirB-xxx
  2. ubah entri dalam .gitmodules untuk menggunakan dirB-xxx
  3. ubah entri dalam .git / config untuk menggunakan dirB-xxx
  4. modifikasi .git / modules / dirA-xxx / config untuk mencerminkan direktori yang benar
  5. modifikasi dirA-xxx / .git untuk mencerminkan direktori yang benar
  6. Lari git submodule status

    if return error: Tidak ditemukan pemetaan submodule di .gitmodules untuk path dirA-xxx. Ini karena dirA-xxx tidak ada, namun masih dilacak oleh git. Perbarui indeks git dengan:git rm --cached dirA-xxx

    Coba dengan git submodule foreach git pull. Saya tidak mempelajari struktur submodule git yang sebenarnya, jadi langkah-langkah di atas mungkin merusak sesuatu. Meskipun demikian melalui langkah-langkah di atas, semuanya terlihat bagus saat ini. Jika Anda memiliki wawasan atau langkah-langkah yang tepat untuk menyelesaikan sesuatu, silakan bagikan di sini. :)

ken
sumber
1

Biasanya, git membuat direktori tersembunyi di direktori root proyek (.git /)

Ketika Anda bekerja pada CMS, mungkin Anda menginstal modul / plugin yang membawa direktori .git / dengan metadata git untuk modul / plugin tertentu

Solusi tercepat adalah dengan menemukan semua direktori .git dan hanya menyimpan direktori metadata root git Anda. Jika Anda melakukannya, git tidak akan menganggap modul-modul itu sebagai submodul proyek.

yilmi
sumber
1

Setelah melihat saya .gitmodules, ternyata saya memang memiliki huruf besar di mana seharusnya tidak. Jadi perlu diingat, .gitmodulesdirektori adalah case-sensitive

Kelsey
sumber
1
Anda yakin tidak bermaksud .gitmodulessebaliknya?
Serhii Kheilyk
0

Dalam kasus saya kesalahan itu mungkin karena penggabungan yang salah antara .gitmodules pada dua cabang dengan konfigurasi submodula yang berbeda. Setelah menerima saran dari forum ini, saya menyelesaikan masalah pengeditan secara manual file .gitmodules, menambahkan entri submodule yang hilang cukup mudah. Setelah itu, perintah git submodule update --init --recursive bekerja tanpa masalah.

pengguna2281802
sumber
0

Masalahnya bagi kami adalah entri entri duplikat telah ditambahkan ke .gitmodules (mungkin dari gabungan). Kami mencari jalan yang dikeluhkan oleh git dalam .gitmodules dan menemukan dua bagian yang identik. Menghapus salah satu bagian memecahkan masalah bagi kami.

Untuk apa nilainya, git 1.7.1 memberikan kesalahan "no submodule mapping" tetapi git 2.13.0 tampaknya tidak peduli.

Walter Wilfinger
sumber