Gitignore'unuzdaki bir git alt modülünü görmezden mi geliyorsunuz yoksa deponuza mı teslim ediyorsunuz?


94

Ben de projeme alt modülü ekledim project_dir/vendor/submodule_oneben çalıştırmak artık her zaman git statusalıyorum modified: vendor/submodule_one (new commits).

Sorum şu, bununla başa çıkmanın en iyi yolu nedir? Ana vendor/submodule_oneprojemin alt modülümün .gitignoreözelliklerini bilmesine gerek olmadığı için -folder'ı ekliyor muyum ?

Ya da alt modülümde değişiklik yaparken ve değişiklik yaparken ana projemde de taahhütler yapmam gerekir mi?

Alt modüllerle yeni başladım ve onları kurmanın ötesinde pek fazla bilgi bulamadım.

Yanıtlar:


81

Hayır, alt modülünüzü sizin alt modülünüze eklemenize gerek yok .gitignore: ebeveynin alt modülünüzden göreceği şey bir gitlink ( özel bir girişmode 160000 ).

Bu şu anlama gelir: bir alt modülde doğrudan yapılan herhangi bir değişikliğin ardından ana dizinde bir kayıt gelmelidir.
Bu şekilde, ana dizin alt modülün durumu için doğru yürütmeyi kaydedecektir: Bu commit yukarıda bahsedilen "gitlink" dir;

Bu politika hakkında daha fazla bilgiyi " git alt modül güncellemesi (alt modüllerin gerçek yapısı) " bölümünde okuyabilirsiniz .
Alt modüllerin arkasındaki ana fikir , belirli taahhütlerde diğer depolara başvurduğunuz bileşen tabanlı bir yaklaşımdır . Ancak bu alt modüllerdeki herhangi bir şeyi değiştirirseniz, bu referansları ana depoda da güncellemeniz gerekir.


Ederken Git 2.13 ile (Q2 2017), Not değil gitlink görmezden, hala ile alt modülü göz ardı edebilirsiniz:

git config submodule.<name>.active false

" Git alt modülü için yeni tamamlamaları yoksay " bölümünde daha fazlasını görün .


Not: Git 2.15.x / 2.16 (Q1 2018) ile bir alt modülü göz ardı etmek daha doğrudur.
" git status --ignored --untracked", yalnızca dizinin kendisini yok sayıldığını göstermek yerine, yok sayılan bir dizine gömülü ve diğer projedeki dosyaları listeleyen ayrı bir projenin çalışma ağacında durmadı.

Bkz. Commit fadb482 (25 Ekim 2017), Johannes Schindelin ( dscho) .
( Junio ​​C Hamano ile birleştirildi - gitster- in commit da7996a , 06 Kasım 2017)

status: hariç tutulan dizinlerdeki alt modüllerle karıştırılmayın

İşleve titizlikle excludebayrağı treat_directory()işleve aktarırız, böylece yineleme sırasında içindeki dosyaların izlenmemesi yerine dışlandığını belirtebiliriz.

Ancak alt modülleri henüz aynı şekilde ele almadık.

Bu nedenle, gitignored içindeki git status --ignored --untrackedbir alt modül ile alt modül " " bölümünde gösterilir, örn.submoduletracked/Untracked files

On branch master
Untracked files:
  (use "git add <file>..." to include in what will be committed)

    tracked/submodule/

Ignored files:
  (use "git add -f <file>..." to include in what will be committed)

    tracked/submodule/initial.t

Bunun yerine, alt modülü " Ignored files" bölümünde göstermesini isteriz :

On branch master
Ignored files:
  (use "git add -f <file>..." to include in what will be committed)

    tracked/submodule/

1
Teşekkürler VonC, böyle ifade ettiğinizde çok mantıklı geliyor.
sprysoft

8
Bu cevap kafa karıştırıcı çünkü Soru başlığı alt modül klasörlerini göz ardı edip etmeyeceğinizi soruyor ve soru gövdesinde daha sonra ayrı bir soruya evet ile cevap veriyorsunuz.
SgtPooki

1
Sanırım şimdi çok daha mantıklı ve çok yararlı derinlemesine bilgiler sağlıyor. Harika, güncellediğiniz için teşekkürler :)
SgtPooki

.Gitignore argümanı: Neden check-in .gitsubmodules dosyası, içerdiği url bir kullanıcı adı parametresine sahip bir kullanıcıya özel git url içerebiliyorsa?
djangofan

1
@djangofan soru (ve cevabım) alt modül klasörünün kendisini (gitlink ile temsil eden ) görmezden gelmek hakkındaydı . .gitmodulesDosyayı görmezden gelmekle ilgili değil . Bu tek dosyanın (the .gitmodules) kimlik bilgilerini içerebileceği doğrudur , ancak yalnızca genel depoları klonlamak için kullanılırsa, bunları içermesi gerekmez. Ayrıca, "Windows için Git Kimlik Bilgisi Yöneticisi" ( github.com/Microsoft/Git-Credential-Manager-for-Windows/… ) gibi kimlik bilgisi yardımcıları ile Windows'ta bile önbelleğe alınabilir . Yani kimlik bilgilerine sahip olmak .gitmodulesölüm değildir.
VonC

8

Bazı nedenlerden dolayı submodule.module-name.active benim için çalışmadı.

Bu yüzden submodule.module-name.ignore kullandım

git config submodule.<your module path>.ignore all

https://git-scm.com/docs/gitmodules - burada parametre için olası değerlerin açıklamasını bulabilirsiniz

Benim için (yeni taahhütler) ve (değiştirilmiş içerik) mesajları için çalışır.


1

Kabul edilen yanıta eklemek için, Git alt modül klasörünü .gitignore'a eklemenin aslında sorunlara neden olduğunu buldum - özellikle projenin yeni bir klonunu oluşturmaya çalışırken. Özellikle, normal alt modül klon komutlarının çalıştırılması alt modül klasörünün boş olmasına neden oldu:

git submodule init
git submodule update
git pull --recurse-submodules

Sadece yeniden koşmaya çalışarak

git submodule add <Git repo> <submodule folder>

çıktıya göre sorunun ne olduğu belliydi:

The following path is ignored by one of your .gitignore files:
<submodule folder>
Use -f if you really want to add it.

-fEklemek yerine , Git alt modülü klasörünü .gitignore'dan kaldırdım ve şimdi klasörü başarıyla oluşturan alt modül klon komutlarını yeniden çalıştırdım. Alt modül klon komutlarından birinin .gitignore'a saygı duyması, ancak buna göre bir alt modülü atladığı konusunda uyarmamasıyla ilgili bir hata olabileceğini düşünüyorum.

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.