Soru Ortak kodun git submodule olarak eklenmesiyle ilgili sorun: "zaten dizinde var"


Gitmek için yeniyim ve alt modüller ekleyerek yardım için minnettarım. Bazı ortak kodları paylaşan iki proje aldım. Paylaşılan kod sadece iki projeye kopyalandı. Ortak kod için ayrı bir git repo oluşturdum ve onu projeyi bir alt modül olarak eklemeyi planladım.

Klasörü belirtmek için git submodule add yolunu kullandım:

git submodule add url_to_repo projectfolder

ama sonra hatayı aldım:

'projectfolder' already exists in the index"

Bu, depomun istenen yapısıdır:

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

Git alt modülünü doğrudan repo'ya veya orada yeni bir klasöre eklemek mümkündür, ancak proje klasöründe değildir. Sorun şu ki, proje klasöründe olması gerekiyor. Bu konuda ne yapabilirim ve git submodule eklemenin yol seçeneğini yanlış anladım?


152
2017-10-15 14:55


Menşei


Yaparsan ne alırsın git ls-files --stage projectfolder? - Mark Longair
100644 ile başlayan tüm içeriğin bir listesini alıyorum. - Vanja
ilgili: stackoverflow.com/questions/12696919/... - Julio Marins
benim için bir git rm varolan klasörde yardımcı oldu: | - rogerdpack


Cevaplar:


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

Bu hata demek ki projectfolder halihazırda sahnelendi ("zaten dizinde var"). Burada neler olduğunu öğrenmek için, bu klasörün altındaki dizindeki her şeyi listelemeye çalışın:

git ls-files --stage projectfolder

Bu çıktının ilk sütunu, endekste hangi nesnenin bulunduğunu size söyleyecektir. projectfolder. (Bunlar Unix filemodlarına benziyor, ama git'de özel anlamları var.)

Şunun gibi bir şey göreceğinden şüpheleniyorum:

160000 d00cf29f23627fc54eb992dde6a79112677cd86c 0   projectfolder

(yani, başlangıç ​​ile bir satır 160000), bu durumda depodaki projectfolder zaten "gitlink" olarak eklenmiştir. Eğer çıktıda görünmüyorsa git submoduleve bunu bir alt modül olarak yeniden eklemek isterseniz, şunları yapabilirsiniz:

git rm --cached projectfolder

... ve onu düzeltmek için:

git submodule add url_to_repo projectfolder

... depoyu bir alt modül olarak eklemek.

Ancak, listelenen birçok blob (dosya modları ile) görmeniz de mümkündür. 100644 ve 100755), dosyaları düzgün şekilde indirmediğinizi gösteren projectfolder Yeni depoyu yerine kopyalanmadan önce. Bu durumda, tüm bu dosyaları kaldırmak için aşağıdakileri yapabilirsiniz:

git rm -r --cached projectfolder

... ve sonra altmodülü aşağıdakilerle ekleyin:

git submodule add url_to_repo projectfolder

257
2017-10-15 19:43



Detaylı cevabınız için teşekkür ederiz. Bir "git rm -r --cached projectfolder" yaptım ve tekrar alt-modüle katılmaya çalıştım. Ancak bu sefer rmessage "'projectfolder' zaten var ve geçerli bir git repo değil" hatası alıyorum. - Vanja
@Vanja: Bu gösteriyor ki projectfolder içermedi .git dizin. Yeni depoyu oluşturmuşsunuz gibi sorunuzdan geliyordu. projectfolder başka yerde, yerine kopyaladı ve açıkça böyle değildi. Mevcut olanı taşımalısın projectfolder yoldan çıkın ve yeni depoyu kopyalayın ( .git dizin) bir alt modül olarak eklemeden önce yerine. Ya da zaten tarafından temsil edilen depoya ittiyseniz url_to_repo, sadece hareket edebilirsin projectfolder yoldan çıkıp altmodülü bu URL'den ekleyin. - Mark Longair
harika cevap +1 tüm yol - abbood
Bu bana bir ton yardımcı oldu. Teşekkür ederim! - Evan Moran
Yaptığım şey buydu, bu 3 adımlık bir süreç olan ADIM 1: git rm -r --cached src / test / resources /, STEP 2: var olan kaynak dizinini başka bir yere kaldırarak, STEP 3: git submodule add add url_to_repo src / Test / kaynaklar - vikramvi


Aynı problem vardı ve saatlerce aradıktan sonra cevabı buldum.

Benim 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 OLMAYACAKTIR. Dizin bir parçası olarak oluşturulacak git submodule add Komut.

Ayrıca, argümanın çalışma dizininiz değil, ana repo köküne göre olması beklenir, dolayısıyla buna dikkat edin.

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

  1. Ebeveyn repo'unuzun zaten klonlanmış olması iyi bir şeydir.
  2. Emin ol common_code dizin yapar değil var olmak.
  3. cd Repo
  4. git submodule add git://url_to_repo projectfolder/common_code/ (İstenen arka çizgiye dikkat edin.)
  5. Sanity geri yüklendi.

Umarım bu, başka bir yerde bulunacak çok az bilgi olduğu için, birine yardımcı olur.


29
2018-02-11 16:04



4. adım başlamalı git submodule addve takip eden eğik çizgi gerekli değildir. - nullability
Yazım hatası düzeltildi. Onu tekrar test ettim ve takip eden çizgi benim için fark yarattı. Bunun bir etkisi varsa zsh kullanıyorum. - Shelton
Bu benim problemimi çözdü (eklentiyi submodule commnand ile oluştururken), teşekkürler! - jackJoe


Alt modülü manuel olarak çıkarmak, adım sayısını içerir ve bu benim için işe yaradı.

Proje kök dizininde olduğunuzu varsayar ve örnek git modülü adı "c3-pro-ios-framework" olur.

Alt modüle ait dosyaları kaldırın.

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

Config içindeki submodule referansları kaldırın

vim .git/config

enter image description here

.Gitmodules öğesini kaldır

rm -rf .gitmodules

"Git" olmadan önbellekten kaldır

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

Alt modül ekle

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

29
2018-06-13 17:34



Harika yazı, harika çalışıyor. Paylaşman çok hoş efendim. Gerçekten harika. - gabn88
Alt modülleri listelemeye çalıştım git submodule kaldırıldıktan sonra ve eklemeden önce ve bana bir hata verdi, kaldırma işi halledildi. - mehmet


varsa, adında bir klasör varsa x git denetim altında, aynı ad alt modülünü eklemek istersiniz, klasörü sil x ve önce onu taahhüt et.

@ Ujjwal-singh tarafından güncellendi:

Evlenme gerekli değildir, evreleme yeterlidir .. git add / git rm -r


14
2018-02-14 07:30



Taahhüt ettiğim şeydi. Kısa cevap, ama doğru olanı! - Qqwy
Evlenme gerekli değildir, evreleme yeterlidir .. git add / gir rm -r - Ujjwal Singh


Sadece insan dilinde açıklığa kavuşturmak, hatanın size anlatmaya çalıştığı şey:

Ana depoda zaten izlenen bu klasörde bir depo oluşturamazsınız.

Örneğin: Bir tema klasörünüz var. AwesomeTheme Bu özel bir depo, siz doğrudan ana deponuza dökmeyi deneyin. git submodule add sites/themes ve sen bunu al "AwesomeTheme" index already exists.

Sadece zaten orada olmadığından emin olmalısın sites/themes/AwesomeTheme ana depodaki versiyon takibi, böylece alt modülün orada oluşturulabilir.

Yani, eğer boş bir kutunuz varsa, ana deponuzda sites/theme/AwesomeTheme dizini kaldırın ve kaldırın. Eğer daha önce sites/theme/AwesomeTheme Ana deponuzdaki dizini, tüm tarihini 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 depoda hiç bir şey görmediğinden (a.k.a index'd) sites/themes/AwesomeTheme önce, şimdi oluşturabilir.


2
2017-07-25 15:02





Bunu başka bir şekilde yaparak çalışıyorum. Boş bir repo ile başlayarak alt modülü "projectfolder / common_code" adlı yeni bir klasöre ekleyerek. Bundan sonra proje kodunu proje klasörüne eklemek mümkündü. Detaylar 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ün ve proje kodu proje klasörüne eklenebilir.

Bu şekilde neden bu şekilde çalıştığını ve diğerinin olmadığını söyleyemem.


1
2017-10-16 09:18





Git yolu için önce altmodule git deposunu (sizin durumunuzdaki proje klasörü) kaldırmanız gerekir.

rm -rf projectfolder

git rm -r projectfolder

ve sonra alt modüle ekle

git submodule add <git_submodule_repository> projectfolder

1
2017-07-07 16:04