Git alt modülü olarak ortak kod eklemeyle ilgili sorun: “zaten dizinde var”


226

Gitmek için yeniyim ve alt modüllerin eklenmesi ile ilgili yardım için teşekkür ederiz. Bazı ortak kodları paylaşan iki proje aldım. Paylaşılan kod iki projeye kopyalandı. Ortak kod için ayrı bir git repo oluşturdum ve bir git alt modülü olarak eklemek için plan ile projeden kaldırdım.

Ben klasörü belirtmek için git submodule add yol seçeneğini kullandım:

git submodule add url_to_repo projectfolder

ama sonra hatayı aldım:

'projectfolder' already exists in the index"

Depomun istenen yapısı:

repo
|-- projectfolder
    |-- folder with common code

Git alt modülünü doğrudan depoya veya orada yeni bir klasöre eklemek mümkündür, ancak proje klasörüne eklemek mümkün değildir. Sorun gerçekten proje klasöründe olması gerektiğidir .. Bu konuda ne yapabilirim ve git submodule add yol seçeneği hakkında ne yanlış anladım?


Yaparsan ne alırsın git ls-files --stage projectfolder?
Mark Longair

100644 ile başlayan tüm içeriği içeren bir liste alıyorum.
Vanja


8
benim git rmiçin var olan bir klasörde yardımcı oldu: |
rogerdpack

Yanıtlar:


343

Korkarım, sorunuzda ne olup bittiğinden emin olmak için yeterli bilgi yok, çünkü takip soruma cevap vermediniz, ancak bu her durumda yardımcı olabilir.

Bu hata projectfolder, zaten sahnelendiği anlamına gelir ("dizinde zaten var"). Burada neler olup bittiğini öğrenmek için, o klasör altındaki dizindeki her şeyi aşağıdakilerle listelemeyi deneyin:

git ls-files --stage projectfolder

Bu çıktının ilk sütunu, dizinde ne tür bir nesne olduğunu gösterir projectfolder. (Bunlar Unix filemodlarına benziyor, ancak git'de özel anlamları var.)

Şöyle bir şey göreceğinizden şüpheleniyorum:

160000 d00cf29f23627fc54eb992dde6a79112677cd86c 0   projectfolder

(yani ile başlayan bir satır 160000), bu durumda içindeki depo projectfolderzaten bir "gitlink" olarak eklenmiştir. Çıktısında görünmüyorsa git submoduleve alt modül olarak yeniden eklemek istiyorsanız, şunları yapabilirsiniz:

git rm --cached projectfolder

... onu bozmak için ve sonra:

git submodule add url_to_repo projectfolder

... depoyu alt modül olarak eklemek için.

Bununla birlikte, listelenen birçok blob'u (dosya modları 100644ve 100755) ile görmeniz de mümkündür , bu da bana projectfolderyeni deposu yerine kopyalamadan önce dosyaları düzgün bir şekilde bozmamanızı önerecektir . Bu durumda, tüm bu dosyaları kaldırmak için aşağıdakileri yapabilirsiniz:

git rm -r --cached projectfolder

... ve ardından alt modülü ekleyin:

git submodule add url_to_repo projectfolder

13
Ayrıntılı cevabınız için Mark'a teşekkür ederiz. Bir "git rm -r --cached projectfolder" yaptım ve alt modüle tekrar katılmaya çalıştım. Ancak bu sefer rmessage alıyorum "proje klasörü 'zaten var ve geçerli bir git repo değil".
Vanja

3
@Vanja: Bu, projectfolderbir .gitdizin içermediğini gösterir . Sorunuzdan, projectfolderbaşka bir yer için yeni veri havuzunu oluşturmuş ve yerine kopyalamışsınızmış gibi geliyordu , ancak durum böyle değildi. Bir alt modül olarak eklemeden önce var projectfolderolanı yoldan çıkarmanız ve ardından yeni havuzu ( .gitdiziniyle birlikte) kopyalamanız gerekir . Ya da, tarafından temsil edilen depoya zaten ittiyseniz url_to_repo, sadece projectfolderyoldan çıkıp alt modülü bu URL'den ekleyebilirsiniz.
Mark Longair

harika cevap +1 tüm yol
abbood

Bu bana bir ton yardımcı oldu. Teşekkür ederim!
Evan Moran

1
Yaptığım şey bu, 3 adımlı işlem ADIM 1: git rm -r --cached src / test / resources /, ADIM 2: mevcut kaynaklar dizinini başka bir yere kaldırdı, ADIM 3: git submodule add add url_to_repo src / Test / Kaynaklar
Vikramvi

52

Alt modülün manuel olarak kaldırılması adım sayısını içerir ve bu benim için çalıştı.

Proje kök dizininde olduğunuzu ve örnek git modül adının "c3-pro-ios-framework" olduğunu varsayarsak

Alt modülle ilişkili dosyaları kaldırın

rm -rf .git/modules/c3-pro-ios-framework/

Config içindeki alt modülle ilgili tüm içeriği kaldırın

vim .git/config

resim açıklamasını buraya girin

.Gitmodules'ü kaldırın

rm -rf .gitmodules

"Git" olmadan önbellekten kaldırın

git rm --cached c3-pro-ios-framework

Alt modül ekle

git submodule add https://github.com/chb/c3-pro-ios-framework.git

2
Harika gönderi, harika çalışıyor. Paylaşmak için harika, efendim. Gerçekten harika.
gabn88

1
Çıkarmadan git submodulesonra ve eklemeden önce alt modülleri listelemeye çalıştım ve bana bir hata verdi, kaldırma işleminin üstesinden geldim .
mehmet

1
Yapabilirsem bu 50x'i yükseltirdim; az önce günümü kurtardın!
Sensei James

touch .gitmodules(çalışma ağacında olması gerekir, bu yüzden kaldırmak yardımcı olur. Ancak tekrar eklemeniz gerekir). Harika yazı btw. Burada işe yarayan tek şey.
9'da Torxed

Benim için .githala kalıntılar olan dizindi. Bu harika çalıştı. Teşekkür ederim.
Kevin Anderson

45

Git yolu için önce alt modül git deponuzu (bu durumda projectfolder) kaldırmanız gerekir.

rm -rf projectfolder

git rm -r projectfolder

ve sonra alt modül ekle

git submodule add <git_submodule_repository> projectfolder

4
git submodule add --force <git_submodule_repository>benim için aynı alt modül adını korumak için çalıştı
Tenfrow

1
Teşekkürler!! Proje klasörüne eklemek zorunda kalmadım, alt dizine ve oradan klonlara geçtim.
Tony Fraser

32

Aynı problemi yaşadım ve saatlerce baktıktan sonra cevabı buldum.

Aldığım hata biraz farklıydı: <path> already exists and is not a valid git repo(ve SEO değeri için buraya eklendi)

Çözüm, alt modülü barındıracak dizini DEĞİL oluşturmaktır. Dizin, git submodule addkomutun bir parçası olarak oluşturulur .

Ayrıca, argümanın çalışma dizininize değil üst-repo köküne göre olması beklenir, bu nedenle buna dikkat edin.

Yukarıdaki örnek için çözüm:

  1. Ailenizin repo'sunun zaten klonlanması sorun değil.
  2. common_codeDizinin mevcut olmadığından emin olun .
  3. cd Repo
  4. git submodule add git://url_to_repo projectfolder/common_code/( Gerekli eğik çizgiyi not edin. )
  5. Akıl sağlığı restore edildi.

Umarım bu başka birine yardımcı olur, çünkü bu konuda başka bir yerde bulunacak çok az bilgi vardır.


1
Adım 4 başlamalı git submodule addve sondaki eğik çizgi gerekli değildir.
nullabilite

Yazım hatası düzeltildi. Tekrar test ettim ve sondaki eğik çizgi benim için bir fark yarattı. Herhangi bir etkisi varsa zsh kullanıyorum.
undefined

Bu benim sorunum çözüldü (add submodule commnand ile dizin oluşturma), teşekkür ederim!
jackJoe

18

xgit control altında bir klasör varsa , aynı ad alt modülünü eklemek istiyorsanız, klasörü silmeli xve önce kaydetmelisiniz .

@ Ujjwal-singh tarafından güncellendi:

Taahhüt gerekli değildir, aşamalandırma yeterlidir .. git add/git rm -r


Taahhüt ne özledim oldu. Kısa cevap, ama doğru olanı!
Qqwy

3
git addgir rm -r
Taahhüt

3

Sadece insan dilinde hatanın size ne anlatmaya çalıştığını açıklığa kavuşturmak için:

Bu klasörde, ana depoda önceden izlenen bir havuz oluşturamazsınız.

Örneğin: AwesomeThemeÖzel bir depo adı verilen bir tema klasörünüz var, doğrudan ana deponuza dökün git submodule add sites/themesve bunu elde edin "AwesomeTheme" index already exists.

sites/themes/AwesomeThemeAlt modülün orada oluşturulabilmesi için ana deponun sürüm izlemesinde zaten olmadığından emin olmanız gerekir .

Yani düzeltmek için, ana deponuzda boş bir sites/theme/AwesomeThemedizininiz varsa kaldırın. sites/theme/AwesomeThemeAna deponuzdaki dizinle zaten taahhütte bulunduysanız, tüm geçmişini aşağıdaki gibi bir komutla temizlemeniz gerekir:

git filter-branch --index-filter \
              'git rm -r --cached --ignore-unmatch sites/theme/AwesomeTheme'     HEAD

Şimdi koşabilirsin git submodule add git@AwesomeTheme.repowhateverurlthing sites/themes/AwesomeTheme

Ana depo daha önce hiç bir şey (aka indekslenmiş) görmediğinden sites/themes/AwesomeTheme, artık onu oluşturabilir.


1

Bunu başka şekilde yaparak çalıştım. Boş bir repo ile başlayarak, alt modülü "projectfolder / common_code" adlı yeni bir klasöre eklemek. Bundan sonra proje kodunu proje klasörüne eklemek mümkün oldu. Ayrıntılar aşağıda gösterilmiştir.

Boş bir repo türünde:

git submodule add url_to_repo projectfolder/common_code

Bu, istenen klasör yapısını oluşturur:

repo
|-- projectfolder
    |-- common_code

Artık daha fazla alt modül eklemek mümkündür ve proje kodu proje klasörüne eklenebilir.

Neden ötekine değil neden bu şekilde çalıştığını söyleyemem.


0

Bu herhangi bir yararlı olup olmadığını bilmiyorum, ama ben IntelliJ 15 içinde dosyalarımı taahhüt ederken aynı sorunu vardı. Sonunda, SourceTree açtım ve orada sadece dosyayı taahhüt. Sorun çözüldü. Fantezi git komutları vermeye gerek yok. Herkesin aynı sorunu olması durumunda bahsetmek.


0

Havuz klasörüne gidin. İlgili alt modülleri .gitmodules'den silin. Gizli dosyaları göster'i seçin. .Git klasörüne gidin, alt modülleri modül klasöründen ve config'ten silin.


0

Bu, hedef yolda .git dosyası eksikse olur. Ben idam sonra bu başıma geldi git clean -f -d.

Mesajda gösterilen ve sonra tüm hedef klasörleri silmek zorunda kaldım git submodule update --remote


-18

Git dizinizde, tüm değişiklikleri senkronize ettiğinizi varsayalım.

rm -rf .git 

rm -rf .gitmodules

Sonra şunları yapın:

git init
git submodule add url_to_repo projectfolder

2
bu projenin tüm geçmişini silecek!
redbandit
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.