Git diff: alt proje kirli


227

Sadece git farkını çalıştırdım ve yaklaşık 10 alt modülümün tümü için aşağıdaki çıktıyı alıyorum

diff --git a/.vim/bundle/bufexplorer b/.vim/bundle/bufexplorer
--- a/.vim/bundle/bufexplorer
+++ b/.vim/bundle/bufexplorer
@@ -1 +1 @@
-Subproject commit 8c75e65b647238febd0257658b150f717a136359
+Subproject commit 8c75e65b647238febd0257658b150f717a136359-dirty

Ne anlama geliyor? Nasıl düzeltebilirim?

Yanıtlar:


268

Mark Longair'in Git Submodules blog yazısında açıklandığı gibi ,

Git'in 1.7.0 ve sonraki sürümleri git alt modülünün davranışında can sıkıcı bir değişiklik içerir .
Alt modüller artık değiştirilmiş dosyaları veya izlenmemiş dosyaları varsa kirli olarak kabul edilirken, daha önce sadece alt modüldeki HEAD yanlış işleme işaret ediyorsa durum böyle olurdu.

+Git alt modülünün çıktısındaki artı işaretinin ( ) anlamı değişti ve buna ilk kez rastladığınızda neyin yanlış gittiğini anlamak biraz zaman alıyor, örneğin changelog'lara bakarak veya git'te git bisect'i kullanarak Değişikliği bulmak için .git. “Belirtilen sürümde farklı, ancak kirli” için farklı bir sembol kullanmak kullanıcılara çok daha nazik olurdu.

Bunu şu şekilde düzeltebilirsiniz:

  • ana repoya geri dönmeden önce (farkın artık "kirli" dosyaları bildirmemesi gerekir) alt modüllerinizin her birindeki değişiklikleri / evrimleri yerine getirme veya geri alma. Alt modülünüzdeki tüm değişiklikleri sadece alt modülünüzün cdkök dizinine geri almak vegit checkout .

    dotnetCarpenter şunları yapabileceğinizi yorumlar :git submodule foreach --recursive git checkout .

  • veya ekleme --ignore-submodulesadresinden Müşteri git diffgeçici olanlar "kirli" alt modüllerini görmezden.

Git sürüm 1.7.2'deki yenilikler

As Noam aşağıda yorumlar , bu soruyu git sürümü 1.7.2 beri, pis submodules ile yoksayabileceğinizi bahseder:

git status --ignore-submodules=dirty

2
Ayrıca bilmeniz gereken iyi bir şey: git commit -aBu değişiklikleri eklemeden endişe etmeden yine de uygulayabilirsiniz. MÖnde işaretlenmiş olmalarına rağmen , taahhütlerinize son vermezler.
gitaarik

1
Benim için her kirli alt modüle girip koşmak zorunda kaldım git clean -id.
GDP2

1
@ GDP2 Hangi ile bir satırda donabilirsiniz git submodule foreach --recursive git clean -id(önce bir yedekleme deposunda test edilecek;))
VonC

1
Bunu açıklanamayan bir şekilde görmeye devam ettiğim şey, alt modülde bulunmayan dosyaların izlenmemiş olmasıydı .gitignore. Onları oraya veya genel yoksayma listesine sabit şeyler eklemek.
Ben

21

Ayrıca alt modülün çıkarılması ve ardından çalıştırılması git submodule initve git submodule updatehile yapacağı açıktır, ancak her zaman uygun veya mümkün olmayabilir.


1
Varolan bazı klasörleri alt modüllere dönüştürdüğümde ve daha sonra eski klasörlere sahip başka bir makineye çektiğimde bu benim için çalıştı.
Roger Lipscombe

18

Herhangi bir alt modüldeki izlenmeyen tüm dosyaları yoksaymak için, bu değişiklikleri yoksaymak üzere aşağıdaki komutu kullanın.

git config --global diff.ignoreSubmodules dirty

Yerel git yapılandırmanıza aşağıdaki yapılandırma seçeneğini ekler:

[diff]
  ignoreSubmodules = dirty

Daha fazla bilgi burada bulunabilir


16

DÜZENLEME : Bu yanıt (ve diğerlerinin çoğu) kullanılmıyor; bunun yerine Devpool'un cevabına bakınız .


Başlangıçta, " git diff --ignore-submodules" ve " git status --ignore-submodules" global varsayılan yapmak için herhangi bir yapılandırma seçeneği yoktu (ayrıca bkz . Komutlarda git varsayılan bayraklarını ayarlama ). Alternatif olarak, ignoreyoksaymak istediğiniz her bir alt modülde (hem git diffve hem de git status), .git/configdosyada (yalnızca yerel) veya .gitmodules(git tarafından sürümlendirilir) varsayılan bir yapılandırma seçeneği ayarlamaktır . Örneğin:

[submodule "foobar"]
    url = git@bitbucket.org:foo/bar.git
    ignore = untracked

ignore = untrackedsadece izlenmeyen dosyaları ignore = dirtyyok saymak, değiştirilmiş dosyaları ignore = allyok saymak ve ayrıca yoksaymayı da taahhüt eder. Görünüşe göre tüm alt modüller için joker karakter kullanmanın bir yolu yok.


13

Alt modül için sahip olduğunuz işaretçi, alt modül dizininde bulunan işaretçi olmadığından durum budur. Bunu düzeltmek için git submodule updatetekrar çalıştırmalısınız :


9
git submodule foreach --recursive git checkout .

Bu benim için hile yapmadı ama bana alt modülde (orada hiçbir şey yapmadan) değiştirilmiş dosyaların bir listesini (benim durumumda sadece) verdi.

Bu yüzden alt modüle gidebilirim ve git durumu bana HEAD'ımın ayrıldığını gösterdi -> git checkout master, değiştirilen dosyayı bir kez daha görmek için git durumu, git checkout> dosyaadı <, git pull ve her şey yolunda.


9

Alt modül dizinini kaldırıp tekrar başlattım.

cd my-submodule
git push
cd ../
rm -rf my-submodule
git submodule init
git submodule update

4
Ne olduğunu anlamak isterdim, ama bu benim için de işe
yarayan

6

Dosya modu ayarları etkinleştirilirse ve alt modül alt ağacındaki dosya izinlerini değiştirirseniz, bir alt modül kirli olarak işaretlenebilir.

Bir alt modülde dosya modunu devre dışı bırakmak için /.git/modules/path/to/your/submodule/config öğesini düzenleyebilir ve ekleyebilirsiniz.

[core]
  filemode = false

Tüm kirli durumları yoksaymak istiyorsanız, ya /.gitmodules dosyasında ignore = dirtyözellik ayarlayabilirsiniz , ancak yalnızca filemode'u devre dışı bırakmanın daha iyi olduğunu 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.