Git: 'değiştirilmiş içerik' / kirli alt modül girişlerini status, diff, vb. İçinde listelemeyi engelleyebilir miyim?


123

Bir şekilde (1.6.x sürümleri civarında) git, alt modüllerdeki değişikliklerin farkına vardı. Bu sadece beni kızdırmaya yarıyor:

$ git durum satıcısı | grep değiştirildi:
# değiştirildi: satıcı / raylar (değiştirilmiş içerik)
$ git diff satıcısı /
diff --git a / vendor / rails b / vendor / rails
--- a / vendor / rails
+++ b / vendor / rails
@@ -1 +1 @@
-Ana proje tamamlama 046c900df27994d454b7f906caa0e4226bb42b6f
+ Alt proje taahhüdü 046c900df27994d454b7f906caa0e4226bb42b6f-kirli

Lütfen durdurun mu?

Düzenle:

Tamam, bir cevabım var. Şimdi başka bir sorum var:

Bunu içine koyabilir miyim ~/.gitconfig? Başlangıcımdan, yapamayacağım gibi görünüyor ve yamayı gözden geçirerek umut verici bir şey görmedim. (Sanırım hala bir takma ad yapabilirim.)


Git e-posta listesinde bununla ilgili, Haziran 2010 tarihli bazı yamalar görüyorum. Bu yüzden umarım bir sonraki sürümdedir. ('git "--ignore-submodules = dirty"' için google)
kch

Mesajın neden oluştuğunu açıklamak için +1!
dotancohen

Yanıtlar:


175

.Gitmodules dosyası içinde eklenen her alt modül için yok sayma modunu ayarlama imkanı bile vardır.

Daha bugün bu sorunla karşılaştım ve bir çözüm bulduktan sonra bloguma hemen bununla ilgili bir makale yazdım: git alt modüllerindeki değişiklikler nasıl göz ardı edilir

İşin özü:

Bir alt modül ekledikten sonra, deponuzun .gitmoduleskök dizininde adlandırılmış bir dosya olacaktır.

Bu .gitmodulesdosyaya bir satır eklemeniz yeterlidir:

[submodule "bundle/fugitive"]
    path = bundle/fugitive
    url = git://github.com/tpope/vim-fugitive.git
    ignore = dirty

5
+1, ancak blog yayınınızın ana bölümünü SO'daki yanıtınıza ekledim : sonsuza kadar yaşayacak olan SO yanıtlarının aksine harici bağlantınız bir gün geçersiz hale gelebilir (SO dökümleri aracılığıyla: blog.stackoverflow.com/2009/ 06 /… )
VonC

5
git statusBeklendiği gibi çalışmadan önce .gitmodules dosyasını işlemem gerektiğini anladım . Ayrıca en az 1.7.4 veya daha iyisine ihtiyacınız olduğuna inanıyorum.
aleemb

İçin .gitignoredosyanın adı verilen özel bir sürümü var excludebulunan .git/info/sürüm ele değil. Dosya için, .gitmodulesalt modüldeki değişiklikleri, üzerinde değişiklik yapmadan, yalnızca sizin ana deponuzdaki örneğinizde bastırmanıza izin verecek karşılık gelen bir dosya var mı .gitmodules?
HelloGoodbye

2
Bunu, bir dalı izleyen bir alt modülle çalıştıramıyorum. Bunun için desteklenmiyor mu? "" [submodule "smstack / ansible / hosts"] yol = smstack / ansible / hosts url = https: // ... şube = ana görmezden gelin = kirli `` `` `
Marc Abramowitz

1
@MarcAbramowitz Sanırım aynı konuya rastladım - buna herhangi bir çözüm buldunuz mu?
Sebastian G. Marinescu

61

Bastırabileceğiniz iki tür değişiklik bildirimi vardır.

Birincisi untracked content, alt modülünüzde değişiklik yaptığınızda ancak bunları henüz işlemediğinizde gerçekleşir. Ana bilgi havuzu bunları fark eder ve git statusbuna göre rapor eder:

modified: modules/media (untracked content)

Bunları şu şekilde bastırabilirsiniz:

[submodule "modules/media"]
   path = modules/media
   url = git@github.com:user/media.git
   ignore = dirty

Bununla birlikte, bu değişiklikleri gerçekleştirdikten sonra, ana bilgi havuzu bir kez daha fark edecek ve bunları uygun şekilde raporlayacaktır:

modified:   modules/media (new commits)

Bunları da bastırmak istiyorsanız, alldeğişiklikleri görmezden gelmelisiniz.

[submodule "modules/media"]
   path = modules/media
   url = git@github.com:user/media.git
   ignore = all

2
İçin .gitignoredosyanın adı verilen özel bir sürümü var excludebulunan .git/info/sürüm ele değil. Dosya için, .gitmodulesalt modüldeki değişiklikleri, üzerinde değişiklik yapmadan, yalnızca sizin ana deponuzdaki örneğinizde bastırmanıza izin verecek karşılık gelen bir dosya var mı .gitmodules?
HelloGoodbye

1
HelloGoodbye: .git / modules / $ MODULENAME / öğesini kontrol ederseniz, o modül için .git dizini gibi görünen şeyi görürsünüz. Bu konumdaki bilgi / dışlama dosyasını değiştirmek işi yapar.
PaulW

1
ignore = allParçası yararlıdır.
Eric Wang

53

Güncelleme: See (ve upvote) nilshaldenwang 'ın cevabı olasılığını ilgili eklemek .gitmodulesbelirli bir altmodülün kirli durumunu görmezden gelmesi dosyasında bir yapılandırma parametresi.

ignore = dirty

Yani 1.7.2 git çıktı ve için --ignore-submodulesseçeneği içeriyor status.

Kimden git help status:

--ignore-alt-modülü [= <zaman>]
    Değişiklik ararken alt modüllerdeki değişiklikleri göz ardı edin.
    <when> "izlenmemiş", "kirli" veya "tümü" olabilir;
    varsayılandır. "Untracked" kullanıldığında alt modüller
    sadece izlenmemişler içerdiklerinde kirli sayılmazlar
    içerik (ancak yine de değiştirilmiş içerik için taranırlar).
    "Kirli" seçeneğinin kullanılması, şunun iş ağacındaki tüm değişiklikleri yok sayar
    alt modüller, yalnızca içinde depolanan taahhütlerdeki değişiklikler
    süper proje gösterilir (bu daha önceki davranıştı
    1.7.0). "Tümü" seçeneğinin kullanılması, alt modüllerdeki tüm değişiklikleri gizler (ve
    alt modül özetlerinin çıktısını bastırır.
    yapılandırma seçeneği status.submodulesummary ayarlandı).

İstediğim değer dirty.

git status --ignore-submodules=dirty

Bir takma ad kullanıyorum çünkü tembelim:

alias gst='git status --ignore-submodules=dirty'

2
Bu kabul edilen bir cevap olduğu için, bence burada dosyadaki ignore=dirtytek tek girişlere ekleme seçeneğini de eklemelisiniz .gitmodules.
Andriy Drozdyuk

14

Bahsettiğiniz gibi, yama git alt modülü: özet için kirli alt modülleri yok sayın ve durum yapım aşamasındadır.

Git 1.7.2-rc2 sürümünde ayrıca duyuruldu :

Git v1.7.2 Release Notes (draft)
================================

Updates since v1.7.1
--------------------

" git status" öğrenildi " --ignore-submodules" seçeneği.

Anlamı:

git config --global diff.ignoreSubmodules dirty

Bunu bir seçenek olarak görmek, şimdilik tam olarak seçilen yaklaşım değildir :

Bu seriden sonra , her alt modül için "tümü", "kirli", "izlenmeyen" veya "hiçbiri" (varsayılan) olarak ayarlanabilen bir yapılandırma seçeneği ' ignore' eklemeyi planlıyorum .gitmodules.

" git diff" ve " git status" her alt modül için bu yapılandırma değerini kullanacaktır.
" --ignore-submodule" Kullanılması bu varsayılanı geçersiz kılar (ve yapılandırma ayarlarını geçersiz kılmak için yeni "hiçbiri" parametresi buraya eklenecektir).

Ve git submdule syncbu seçenek her değiştiğinde " " yapmak zorunda kalmamak için, .git/configönce onu aramak istiyorum .
Orada bulunmazsa .gitmodules, varsa buradan alınacaktır .

Böylece kullanıcılar ayarı geçersiz kılabilir, ancak yapmazlarsa, yukarı akış bunu kolayca değiştirebilir (örneğin, artık .gitignore" ignore=untracked" artık gerekli olmayacak şekilde bir alt modül güncellendiğinde, bu ayar kaldırılabilir).
Ayrıca, ' ignore' girişi .gitmodulesşubeler arasında farklıysa, şubeleri değiştirmek anında etkili olacaktır .


Git durumunu (veya herhangi bir git komutunu) belirli bir alt modülü yok saymak için başka bir yaklaşım Git 2.13 (Q2 2017) ile kullanılabilir:

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 .


Soruyu bir gitconfig bitiyle güncelledim. Cevabı biliyorsan diye ping at.
kch

@kch: Cevabı şu anda bu tür bir ayarı saklamak için önerilen yaklaşımla güncelledim.
VonC

@drozzy: diğer yorumunuzda belirttiğiniz gibi: " ignore = dirty"
VonC

1
@drozzy: nilshaldenwang'ın cevabını ek yapılandırma parametresi "ignore = dirty" ile onayladım ve tamamladım, resmi cevabı düzenledim ve nilshaldenwang'ın gönderisine bir bağlantı ekledim.
VonC

Teşekkürler, kişisel bir şey değil, ama başlangıçta kaçırdığım daha yararlı cevabın en üstte olmasını istedim!
Andriy Drozdyuk

11

Ayrıca kullanabilirsiniz

% git config [--global] submodule.ignore dirty

Dosyanızda ayarlamak submodule.ignore = dirtyiçin .git/config. --globalsizin yok sayma bayrağını ayarlayacak ~/.gitconfigve tüm depolarınıza uygulanacaktır. Onsuz .git/config, şu anda içinde bulunduğunuz repo için ayarlanmalıdır .

Bu konuda bulabilirsiniz tek belgelerdir submodule.<name>.ignorede git-config docs . Onu bir .gitmodules dosyasından ~ / .gitconfig dosyama taşıdım ve hala benim için çalışıyor.


@ PawełGościcki Git 2.0.0'da çalıştığını doğrulayabilirim.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

6

Eklemelisin

yok say = kirli

.gitmodules'e


.Gitmodüllerin neresine eklersiniz?
Andriy Drozdyuk

@drozzy Bunu, yok saymak istediğiniz her alt modül için, "yol" ve "url" değerlerinin tanımlandığı bölümün altına eklersiniz.
jsdalton

2

Yani git v1.7.2-rc2 istediğim şeye sahip:

$ git diff --ignore-submodules = kirli satıcı
# çıktı yok
$ git status --ignore-submodules = kirli satıcı
# Dalda ...
işlenecek bir şey yok (çalışma dizini temiz)

Kendi git nasıl yapılır:

# get git
git clone git://git.kernel.org/pub/scm/git/git.git git
cd git
git checkout v1.7.2-rc2

# make git. beware of setting prefix
make configure
./configure --prefix=/usr/local
make
sudo make install

# you REALLY don't want to `make doc`, use this instead
sudo make quick-install-man
sudo make quick-install-html

1
Burada yedi gits saymak: git clone git://git.kernel.org/pub/scm/git/git.git git.
dotancohen

2

Bu soruyu burada daha ayrıntılı olarak yanıtladım .

Sadece koş

git config --global diff.ignoreSubmodules dirty

bu değişiklikleri göz ardı etmek için yerel bir yapılandırma seçeneği eklemek için.


1

Eklemek istediğiniz olmayabilir ignore = dirtyiçin .gitmodules, size görmezden diledi değişiklikler hakkında daha seçici olmak isteyebilirsiniz.

Bunu yapmak için .git/submodule_foo/bar/info/exclude, submodule_foo/bar/alt modülün yolunun bulunduğu yere desenler ekleyin .

Kalıplar, ekleyeceğiniz kalıplara benzer .gitignore, kök alt modül dizini olur. Örneğin, bu kalıp buildalt modüldeki dizini yok sayar submodule_foo/bar/:

# in .git/submodule_foo/bar/info/exclude:
/build/

3
Bunun bir alt modülün içindeyken de değişiklikleri gizleyeceğini düşünüyorum. Değişikliklerin yalnızca alt modülün dışındayken gizlenmesini istiyorum. Alt modül üzerinde aktif olarak çalışırken içeride görünmeleri sorun değil.
Raphael Schweikert
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.