Git alt modül ekle: “yerel olarak bir git dizini bulundu” sorunu


193

Aslında git, git submodulesubcommands dahil nasıl kullanılacağını öğrenmeye çalışıyorum . Git depolarını SSH kullanarak barındırabildiğim, itebileceğim ve çekebileceğim bir sunucu kurdum. Tüm sunucularımı alt modül olarak koymak istediğim bu sunucuda bir ana git deposu "Travail" oluşturdum.

Travail veri havuzumda zaten bir alt modül olarak bir projemi ekledim tools/libft: Bu alt modülü geliştirebilir, itebilir ve çekebilirim.

Ancak başka bir alt modül eklemeye çalıştığımda (sunucumdaki fdf.git'ten fdf adlı), aşağıdaki sorunu alıyorum:

git submodule add ssh://XXX.XXX.XXX.XXX:XXXXX/opt/git/fdf.git projets/fdf

Uzak (lar) ile yerel olarak 'projets / fdf' için bir git dizini bulunur: origin ssh: //git@XXX.XXX.XXX.XXX: XXXXX / opt / git / fdf.git Bu yerel git'i yeniden kullanmak istiyorsanız ssh: //XXX.XXX.XXX.XXX: XXXXX / opt / git / fdf.git dizininden tekrar klonlamak yerine '--force' seçeneğini kullanın. Yerel git dizini doğru repo değilse veya bunun ne anlama geldiğinden emin değilseniz, '--name' seçeneğiyle başka bir ad seçin.

Aslında bir alt dizin yok projets/

Başka bir iş parçacığı üzerinde kullanmalıyım git submodule syncveya alt modülün kök deposunun URL'sinin değişebileceği .gitmodules dosyasını düzenlemeliyim.

Ancak .gitmodules dosyam sadece ilk alt modülüm (tools / libft) hakkında bilgi içeriyor, projets / fdf hakkında değil:

[submodule "tools/libft"]
    path = tools/libft
    url = ssh://git@XXX.XXX.XXX.XXX:XXXXX/opt/git/libft.git

Bir Fransız öğrenci olarak İngilizce belgelerimde bir şeyleri kaçırmış olabilirdim, ama araştırdım ve bu sorunu neden aldığımı gerçekten anlamıyorum.

Bir çözüm alırsanız çok sevinirim ama sadece bir açıklama da yardımcı olacaktır.


Küçük bir düzeltme: 'depo' değil, 'depo' değil. Gerçekten bir cevap değil, ancak projeler birbirinden bağımsızsa, her bir projenin alt modüller yerine kendi repolarına sahip olması daha iyi olurdu.
jcm

Teşekkürler, düzelttim. Biliyorum ama tüm işlerimi aynı repoda ama ayrı projeler olarak toplamak istiyorum. Evden okula gittiğimde ve tam tersi olduğunda tüm çalışmamı güncel tutmak için bir seçimdir (ve bu araçları nasıl kullanacağımı öğrenmek için merak ediyorum;))
vmonteco

Merak her zaman iyi bir nedendir! :) Bu garip. Alt modülü daha önce eklemediğinizden emin misiniz?
jcm

Travail / 'de değil ve ~ /' de fdf.git'i klonlama sorunum yok. Travail'de / hiçbir fdf izi bulamıyorum. sadece libft: /
vmonteco

5
Oh bekle, içeri baktım /Travail/.git/modules/projets/ve bir fdfdizin buldum . Bu, çalışan ağaçta değil, daha eski taahhütlerde gibi görünüyor. Sorunu oluşturabilir mi?
vmonteco

Yanıtlar:


443

Ben son zamanlarda sildim bir alt modül ile aynı yolu olan bir alt modül eklemeye çalışırken bu SO yazı geldi.

Sonuçta benim için işe yaradı ( bu makale çok yardımcı oldu ):

Henüz çalıştırmadıysanız git rm --cached path_to_submodule(eğik çizgi yok) rm -rf path_to_submodule, bunu yapın!

Sonra:

  1. İlgili satırları .gitmodulesdosyadan silin . örneğin, bunları silin:

    [submodule "path_to_submodule"] path = path_to_submodule url = https://github.com/path_to_submodule

  2. İlgili bölümü .git / config dizininden silin. örneğin, bunları silin:

    [submodule "path_to_submodule"] url = https://github.com/path_to_submodule

  3. rm -rf .git/modules/path_to_submodule

Sonunda şunları yapabilirsiniz:

git submodule add https://github.com/path_to_submodule


47
Ben çalıştı başka bir şey bulabiliriz Bu gerçekten yararlı oldu. Diğer önerilerden en önemli fark 3. adımınızdı. Teşekkürler!
AndroidDev

8
Adım 2 ve 3 benim için gerekliydi.
U007D

8
Adım 3 benim için gerekliydi, ama alt modül neden orada da var?
Crt

1
Benim için adım 1 ve 2'yi atladım (içinde zaten doğru ayarları vardı) ve 3. adım benim için düzeltti. (Zaten ilk adımını git rmve rm -rfadımlarını yapmıştım.)
Rock Lee

2
3. adım bile benim için işe yaramadı. Sadece bir alt modülüm vardı, bu yüzden tümünü sildim .git/modulesve bu da işe yaradı.
ach

47

jbmilgrom'ın çözümünü denedim, özellikle denedim git rm --cacheve dizin / alt modül olmadığı için benim için çalışmadı. Benim için işe yarayan şuydu:

  1. rm -rf .git/modules/blah
  2. git submodule add git://path.to.new

Bunu komutlar ve diğer tüm dizinler --forceiçinde denedikten sonra yaptım , master vb. İter ... dizin yoktu ve önbellek için bir neden yoktu. Dışarı Dönüşler bu hata yatıyordu nerede olmasıdır.git submodulerm.git/modules


15

'projets/fdf'Diskinizi diskten silmiş olabilirsiniz , ancak Git deponuzda hala var. git rm -rf projets/fdfGit'ten kaldırmak için düğmelerini kullanın , ardından değişiklikleri uygulayın. Bundan sonra bu klasörü alt modül olarak ekleyebilirsiniz.


İşe yaradı :) Teşekkürler. Sanırım bu hatayı yaptım.
vmonteco

21
Bunu yaptığımda dizinin mevcut olmadığını söyledim. Her ikisi de var gibi görünüyor ve yok: /
Nathan Hornby

41
@ tom-mcfarlin Sonunda, Imanually .gitmodule'den satırları ve .git / modüllerinden bir klasörü sildi, sonra yeni bir alt modül eklememe izin verdi. Belki bunu yapmanın daha iyi bir yolu var, ama zamanım bitiyordu. Bu şekilde gidecek olursan, iyi bir yedek almanı öneririm ve senin için yanlış giderse lütfen beni suçlama. İyi şanslar.
sparklos

5
Teşekkür ederim, başka bir gönderide klasörü .git / modüllerinden kaldırmak için buldum ve bu benim için çalıştı. Hatanın çatışma olduğu söylenen mantıklı geliyor ... Sadece bu klasörden habersizdim
Tom McFarlin

10
@NathanHornby @Sparklos @TomMcFarlin - git'in son sürümlerinde git-submodule'un .git klasörüne bir dizin eklediğini göreceksiniz. Örneğin, eğer dizinde iseniz /tmp/repo, o zaman çalıştırın git submodule add ../otherrepo.git, o zaman o /tmp/repo/.git/modules/otherrepoklasörün var olduğunu göreceksiniz . Benim için sorun buydu. Bu klasörü .git'ten el ile sildim ve her şey işe yaradı.
Alexander Bird

13

Alt modül dizinini zaten yaptığım gibi sildiyseniz, geri kalan jbmilgrom'un talimatlarını izleyin. Anahtar, rm -rf .git/modules/path_to_submoduleancak devam edin ve önce tüm ana repo dizininizi yedekleyin .

Yalnızca bir alt modülünüz varsa, .gitmodules


2

Bu iki komut benim için çalışıyor.

rm path/to/submodule -rf
rm .git/modules/path/to/module -rf

Bu. Submodüllerin yaratılması için iki yol var gibi görünüyor. Bunlardan birinde, alt klasörde yalnızca üst projedeki bir dizini işaret eden tek bir .git dosyası bulunur .git/modules/. Alt modülün deposunu depolayan bir klasör var. Bu deponun silinmesi benim için sorunu düzeltti, ancak kabul edilen cevap olmadı.
William Randokun
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.