Alt modül olmayan bir yol için .gitmodule içinde alt modül eşlemesi bulunamadı


335

Bir alt modülü olan bir projem var lib/three20

Dosyam .gitmoduleşöyle görünüyor:

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

Bunu geçmişte hatasız klonladım, ( git submodule inita'yı izledi git submodule update) ve bir süredir çalışıyor.

Bunu yeni bir makineye kopyalamaya çalıştım ve şimdi şu hatayı alıyorum git submodule init:

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

Bu yol, Xcode içinde diğer dizin projelerini barındırmak için kullandığım boş bir klasör. .gitmodulesDosyanın bir parçası değil , bu yüzden bu yolu nereden aldığını göremiyorum.

Herhangi bir fikir?


1
Bu yolu bir gitlink olarak eklemeyi başarabileceğiniz anlaşılıyor - bir alt modül, bir gitlink ve .gitmoddules ve .git / config dosyalarındaki girişlerin birleşimidir. Bu konuda yeni bir soru vardı; bulmaya çalışıyor ...
Cascabel


@Jefromi - .gitKlasörün herhangi bir yerinde bu yoldan bahsedemiyorum . A yapmak grep -r "Classes/Support/Three20" *.*da sonuç vermez
Ben Scheirman

2
@Ben: Neden bu metni .git klasöründe arıyorsunuz? Git içeriği böyle depolamaz. git ls-tree HEAD Classes/SupportGit'in ne düşündüğünü gerçekten doğrulamak istiyorsanız, deneyin ve Three20'nin bir taahhüt olduğunu söylüyorsa, orada bir gitlink var. Varsa, uygun bir alt modüle dönüştürmek veya düzenli olarak izlenen içeriğe dönüştürmek için yukarıda bağlı VonC sorusundaki uygun talimatları izleyin.
Cascabel

2
gelecekteki ziyaretçiler için, sorunun kaldırılmış bir alt modüle ve hatayı atan heroku ile bağlantılı olması durumunda, github.com/heroku/heroku-repo ve heroku repo'dan heroku-repo yükleyin : reset -a appname
fadomire

Yanıtlar:


310

Aşağıdaki rajibchowdhury 'ın cevabı (upvoted), kullanımgit rm tavsiye edilir komut çıkarmadan içindir özel girişi alt modülü belirten endeksinde (özel mod ile klasör 'a' 160000).

Bu özel giriş yoluna.gitmodule ( Classes/Support/Three20orijinal sorudaki ' ' gibi) başvurulmazsa , " Yol için alt modül eşlemesi bulunamadı.gitmodules " hata iletisini önlemek için kaldırmanız gerekir .

Dizindeki alt modülleri referans alan tüm girişleri kontrol edebilirsiniz:

git ls-files --stage | grep 160000

Önceki cevap (Kasım 2010)

İlk alt modülünüzü doğru bir şekilde beyan etmemiş olabilirsiniz (yani, tamamında görünen yollar olsa bile, eski cevabımda açıklandığı gibi, sonunda herhangi bir kuyruk / 'olmadan .gitmodule).

Bu konudan bahsediyor:

yeni bir klondan 'git submodule init' çalıştırırken aynı hatayı alıyorsunuz?
Eğer öyleyse, yanlış bir şey var.

.gitmodulesAlt modülleriniz yoksa, .git / config dizinindeki alt modüllere ilişkin silme ve tüm referansları silin ve Pikimal dizininde bir dizin olmadığından emin olun .git.
Bu sorunu çözüyorsa, check-in yapın ve seyir çalışma kopyasında da aynısını yapın.

Açıkçası, ana .gitmodulesdosyanızı silmeyin , ancak .gitmodulesçalışma ağacınızdaki diğer ekstra dosyalara bakın.


Yine de "yanlış alt modül başlatma" konusunda, Jefromi aslında gitlink olan alt modüllerden bahseder.

Bkz izlenmeyen içeriği nasıl izlenir? Böyle bir dizini gerçek bir alt modüle dönüştürmek için.


5
Herhangi bir .gitmodules dosyanız yok ve hala bu mesajı her ödeme / çekme işleminde alıyorum. Ben ne yaparım?
aaronbauman


4
@aaronbauman Evet, gitlink'i kaldırmanız gerekiyor, bu nedenle git rm xxx(sondaki eğik çizgi olmadan) git rm --cacheddizinden çıkarırken diski korumanıza izin veriyor.
VonC

Git ls-files --stage çalıştırdıktan sonra | grep 16000, bazı girişler buldum. Bunları nasıl kaldırabilirim?
John Mike

1
@JohnMike .gitmodulebu girişlere referansınız varsa stackoverflow.com/a/16162000/6309 . Değilse, basit git rm afolder(izleyen / eğik çizgi yok)
VonC

412

.Gitmodules içinde 'OtherLibrary / MKStore' yolu için alt modül eşlemesi bulunamadı

$ git submodule update --init

Hatanın neden oluştuğunu bilmiyordum. Bir dakika geçirdikten ve cevabı yığın akışında bulduktan sonra.

$ git rm --cached OtherLibrary/MKStore

ve sonra alt modülü tekrar güncelleyin. İyi çalışıyor.

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


2
git ile // bağlantılar: bunun https değiştirmeye .gitmodules dosyasını düzenledikten sonra benim için çalıştı // bağlantıları
Diwann

1
Bu benim için de işe yaradı, ancak alt modül yolunun sonunda eğik çizgi olmadığından emin olmalıydım.
peter

Init seçeneğini unuttuğuma inanamıyorum. Klonlarsanız, bir proje güncellenmeden önce alt modülleri başlatmalıdır.
alex

Reponun kök dizininde çalıştırmak zorunda kaldı, sonra her şey iyi çalıştı. Teşekkürler!
Pwdr

Rm komutu için çok teşekkür ederim . Aradım git submodule sync | grep "mapping found"sonra git rmtekrar git submodule sync. Sorun gitti !.
nine9beş

24

Kaynak yapmak için SourceTree kullandığımda, bu iletiyi tükürecek.
Karşılaştığım mesaj:

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

Benim senaryom, proje dizinini içeren .git klasörünü yanlış uygulama .
SourceTree bu klasörü git submodule olarak kabul etti, ancak aslında böyle değildi.

Benim çözüm kaldırmak için komut satırı kullanın.

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

git içindeki çöpleri çıkarın ve temiz tutun.


17

Bu sorunu benim için çözdüm. Başlangıçta bunu yapmaya çalıştım:

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

Anlaşıldığı gibi, ana dalı klonlamak istiyorsanız --branch seçeneğinin belirtimi kullanılmamalıdır . Bu hatayı atar:

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

Her yapmaya çalıştığınızda

git submodule sync

Bu hata atılacaktır:

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

Ve .gitmodules için gereken çizgiler asla eklenmez.

Benim için çözüm şuydu:

git submodule add [URL] [PATH_TO_SUBMODULE]

9

Ben sadece benim repo yeni bir kasada "git submodule init" denedikten sonra bu hatayı vurdu. Başlangıçta yanlış durumda modül alt klasörünü belirtmiştim. Büyük / küçük harfe duyarlı bir dosya sistemine (hurr) sahip bir Mac'te olduğum için başarısız oluyordu. Örneğin:

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

başarılı ama sorun diskte yol

Myapp/Resources/Project

Ne anlamıyorum git neden modülü yanlış klasöre (benim komut yanlış durumda göz ardı) başlatıyor ama sonra (başarısız) sonraki komutları ile düzgün çalışıyor olmasıdır.


Burada aynı (Windows), nedenini anlamıyorum. Ödeme için farklı kasaya sahip bir klasör belirtebilirsiniz ve bu modül adını değiştirmemelidir.
Xavier Poinas

6

Sadece iyi git rm subdir olacak. alt dizini bir dizin olarak kaldıracaktır.


5

Sadece bu problemi yaşadım. Bir süre yolun kaldırılması, yolun kaldırılması, .gitmodüllerin kaldırılması, .git / config'ten girişin kaldırılması, alt modülün geri eklenmesi, daha sonra değişikliğin yapılması ve itilmesi ile ilgili önerileri denedim. Şaşırtıcı çünkü "git commit -a" yaptığımda hiçbir değişiklik görünmüyordu, bu yüzden sadece kaldırmayı itmeye çalıştım, sonra bir değişiklik gibi görünmesi için readdition'ı ittim.

Bir süre sonra, her şeyi kaldırdıktan sonra, "git submodule update --init" komutunu çalıştırırsam, git artık başvurması gereken belirli bir adla ilgili bir mesaj olduğunu fark ettim: havuzun alt modülünün adı bağlantı veriyordu, kontrol ettiği yol adını değil. Grepping, bu başvurunun .git / dizininde olduğunu ortaya koydu. Bu yüzden "git rm --cached repo-name" komutunu çalıştırdım ve modülü okudum. Bu kez taahhütte bulunduğumda, tamamlama mesajı, bu beklenmedik nesneyi silmekte olduğu bir değişiklik içeriyordu. Bundan sonra iyi çalışıyor.

Ne olduğundan emin değilim, birinin git submodule komutunu kötüye kullandığını tahmin ediyorum, belki de argümanları tersine çeviriyor. Ben bile olabilirdim ... Umarım bu birine yardım eder!


5

.gitmodules dosyasında dizeyi değiştirdim

"path = thirdsrc\boost" 

ile

"path = thirdsrc/boost", 

ve çözüldü! - -


teşekkürler sorunumu düzeltti. muhtemelen pencerelerde oluşan sorun. Benim durumumda yol "path = bir şey \\ klasör" oldu
Roozbeh G

Windows'da git yerine git-lfs kullanırken bir hataya çarptığımda bu benim için çalıştı. (Standart git kullanılırken hata oluşmadı)
2018

5

Klasör haritalama bulunabilir .git/modules(her vardır klasöre configonun atfen dosyayı worktree), çok emin bu klasörler içinde yapılandırmaya uygun hale .gitmodulesve .git/config.

Yani .gitmodulesdoğru yolu vardır:

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

ve .git/modules/<path>/configiçinde [core]bölüm Eğer sizin için doğru yolu var <path>, mesela

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

Doğru klasör .git/moduleseksikse, alt modül dizininize gidip git reset HEAD --hardveya seçeneğini deneyin git checkout master -f. Bu işe yaramazsa, muhtemelen bozuk alt modüle yapılan tüm başvuruları kaldırmak ve tekrar eklemek istersiniz, sonra bkz: Git alt modülünü yeniden adlandırma .


3

Senaryo: alt modülü dirA-xxx dizininden başka bir dizine dirB-xxx olarak değiştirme

  1. dirA-xxx'i dirB-xxx'e taşıyın
  2. dirB-xxx kullanmak için .gitmodules içindeki girdiyi değiştirme
  3. dirB-xxx kullanmak için .git / config içindeki girişi değiştirin
  4. .git / modules / dirA-xxx / config dosyasını doğru dizini yansıtacak şekilde değiştirin
  5. dirA-xxx / .git dosyasını doğru dizini yansıtacak şekilde değiştirin
  6. Çalıştırmak git submodule status

    eğer return error: dirA-xxx yolu için .gitmodules içinde alt modül eşlemesi bulunamadı. Bunun nedeni dirA-xxx'in mevcut olmamasıdır, ancak yine de git tarafından izlenir. Git dizinini şu şekilde güncelleyin:git rm --cached dirA-xxx

    İle deneyin git submodule foreach git pull. Git submodül yapısının gerçek çalışmasından geçmedim, bu yüzden yukarıdaki adımlar bir şeyleri kırabilir. Yine de yukarıdaki adımlardan geçtikçe, şu anda işler iyi görünüyor. Bir şeylerin yapılması için herhangi bir öngörünüz veya doğru adımınız varsa, burada paylaşın. :)


1

Git genellikle projenin kök dizininde (.git /) gizli bir dizin oluşturur

Bir CMS üzerinde çalışırken, belirli modül / eklenti için git meta verisiyle .git / dizin taşıyan modüller / eklentiler kurmanız mümkündür.

En hızlı çözüm tüm .git dizinlerini bulmak ve sadece root git meta veri dizininizi tutmaktır. Bunu yaparsanız, git bu modülleri proje alt modülleri olarak kabul etmez.


1

Baktıktan sonra .gitmodules, olmamam gereken bir büyük harfim vardı. Unutmayın, .gitmodulesdizinler büyük / küçük harfe duyarlıdır


1
.gitmodulesbunun yerine demek istemediğine emin misin ?
Serhii Kheilyk

0

Benim durumumda, hata muhtemelen farklı alt modül konfigürasyonlarına sahip iki dalda .gitmodules arasındaki yanlış bir birleşmeden kaynaklandı. Bu forumdan öneriler aldıktan sonra .gitmodules dosyasını elle düzenleme sorununu çözdüm, eksik alt modül girişini eklemek oldukça kolaydır. Bundan sonra, git submodule update --init --recursive komutu hiçbir sorun olmadan çalıştı.


0

Bizim için sorun, yinelenen alt modül girişlerinin .gitmodules'e (muhtemelen bir birleştirme işleminden) eklenmiş olmasıdır. Git .gitmodules hakkında şikayet yolu aradı ve iki özdeş bölüm bulundu. Bölümlerden birini silmek sorunu bizim için çözdü.

Değer için git 1.7.1 "alt modül eşleme yok" hatası verdi ama git 2.13.0 umurumda değildi.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.