Bir dizini git diff'ten hariç tutma


179

Bir dizinin tamamını Git farkımdan nasıl hariç tutabileceğimi merak ediyorum. (Bu durumda / spesifikasyon). Git diff komutunu kullanarak tüm yazılım sürümümüz için bir fark oluşturuyorum. Bununla birlikte, spesifikasyonlardaki değişiklikler bu prosedür için önemsizdir ve sadece baş ağrıları oluşturur. şimdi yapabileceğimi biliyorum

git diff previous_release..current_release app/

Bu, uygulama dizinindeki tüm değişiklikler için fark yaratır, ancak örneğin lib / dizininde bir fark yaratmaz. Bu görevi nasıl başaracağını bilen var mı? Teşekkürler!

Düzenleme: Ben sadece net olmak istiyorum, ben sadece sonunda, eksi / spec tüm dizinlerimin parametreleri dize biliyorum. Komutta tek bir dizini gerçekten hariç tutmanın bir yolu olduğunu umuyordum.


4
Bu şaşırtıcı soruyu buldum çünkü alt modülleri görmezden gelmeyi hedefliyordum . Bu durumda, benim kadar naifseniz, bu soru daha yararlı olabilir.
brandizzi

Bu, Eylül 2016'da bunu yapmak için hala yerel Git anahtarımızın olmaması garip
Michael Z

Yanıtlar:


138

Bash kullandığınızı ve genişletilmiş globbing'i ( shopt -s extglob) etkinleştirdiğinizi varsayarsak , bunu kabuk tarafından yönetebilirsiniz:

git diff previous_release current_release !(spec)

Diğer tüm şeyleri listelemeniz için sizi kurtarır.

Veya kabuk agnostik:

git diff previous_release current_release --name-only | grep -v '^spec/' \
    | xargs git diff previous_release current_release --

Argümanları yeniden yazmak zorunda kalmamak için bunu tek satırlık bir kabuk betiğine sarabilirsiniz.


1
PS Eğer obsesif konum eğer öyleyse, sen üzerinde tack isteyebilirsiniz, gizli dosyaları eşleşmiyor globbing .!(.|)bir ile başlayan maç her şeyi .yanında .ve ...
Cascabel

Bu, yeni veya şubeler arasında silinen dosyalar için işe yaramıyor gibi görünüyor. Komut dosyasının yürütülmesini durdurarak hataya aykırı olamayacağını söyleyerek hatalar alıyorum.
Graham Christensen

2
@Graham: --Yeni eklediğim şeyin bunu düzeltmesi gerektiğine inanıyorum .
Cascabel

1
Müthiş cevap. Sadece isimleri göstermek istedim (gerçek fark değil), bu yüzden --name-onlyen sonunda da eklemek zorunda kaldım .
Ağustos

1
Onunla uğraşırken sonra, sadece bir dosyanın adını değiştirirseniz, bu bir hata atar eklemek ancak tüm yapmanız gereken eklenti olduğunu ister -- path/of/new/fileve onu :) onu anlamaya olacak
aug

321

Bu cevaba dayanarak şunları da kullanabilirsiniz:

git diff previous_release..current_release -- . ':!spec'

Bu, belirli yolların hariç tutulmasına izin veren yeni bir git özelliğidir. Çeşitli kabuk onelinerlerinden daha güvenilir olmalıdır.

Bunu burada gönderiyorum çünkü bu soru hala "git diff exclude path" için # 1 hit.


4
Bu yanıtı seviyorum. Seçenek ekliyorsanız, bunu çift tireden önce yapın. Örneğin: git diff previous_release current_release --name-status -- . ':!spec'
liamvictor

Şube isimlerini kullanabileceğimi fark etmedim current_releaseve previous_release- anladığımda beni güldürdü.
trueheart78

2
Benim için ne işe yaradı git diff --stat dev -- . ':!/Mopy/Docs/*'. Ne yaptım değil benim için çalışmak git diff dev --stat -- . ':!('Mopy/Docs/Wrye Bash General Readme.html'|'Mopy/Docs/Wrye Bash Advanced Readme.html')'ve varyasyonları
Mr_and_Mrs_D

Gerçekten yardımcı. İşte database.yml dışında herhangi bir dosyanın değiştirilip değiştirilmediğini görmek için sözdizimi:git diff --check -- . ':!config/database.yml'
Dan Kohn

17
Bunun gibi birden çok öğeyi de hariç tutabilir:git diff previous_release current_release -- . ':!file_a' ':!file_b'
PseudoNoise

37

Git farkında hariç tutmak için birden fazla yol belirtmek istiyorsanız, sonuna ek hariç tutma parametreleri eklersiniz, örneğin satıcı ve depo dizinlerindeki her şeyi istatistiklerden hariç tutmak için: -

git diff --stat previous_release..current_release -- . ':!vendor' ':!bin'

33

Lib dizinindeki herhangi bir dosya için diff niteliğini deneyebilir ve ayarını kaldırabilirsiniz.
.gitattributes:

lib/* -diff

racl101 yorum ekliyor :

Sadece buna eklemek için git diff, örneğin Webpack'in .jsdosyalarınızı paketlemesiyle oluşturulan tüm JavaScript gibi, belirli bir dizindeki ve alt dizinlerindeki belirli bir türdeki dosyaların çıktısını sınırlamak isteyenler için , bunu ekleyebilirsiniz. kime .gitattributes:

dist/js/**/*.js -diff

Sonra git diff çıkışınızdaki tüm bu gürültüyü görmezsiniz ve sadece şu şekilde görünür: Binary files ... differhangisi daha yararlıdır.


Bu olsa da benim diffs tüm spec kaldıracaktı. Hala bu 'bırakma' diff çalıştırdığımda değil, normalde spec klasöründe benim diffs görmek istiyorum
Mysrt

2
@Mystr: Bunu ayarlayabilirsiniz .gitattributes; üstünde özel dal olduğunu) Rebase özel branşında dosyayı 'salma' diff bu tür sadece yapılmış current_releaseve oradan diff yapmak.
VonC

Bu da dallar arasında silinen dosyalar için işe yaramıyor gibi görünüyor. Kaldırılan dosyalar tüm farkı gösterir.
Graham Christensen

Benim için çalışmıyor. _ Yolları özel mi? _site/* -diff
Marius

@MariusAndreiana Hayır, '_' özel değil. Bu klasörün bir dosyası için hangi gitattributes kuralının geçerli olduğunu kontrol edebilir misiniz: git-scm.com/docs/git-check-attr
VonC

22

Git diff artık özel bir hariç tutma biçimini kabul ediyor: git diff -- ':(exclude)lib/*'

Çok sayıda tekrarlayan klasör adınız ('/ app', '/ lib' vb.) Varsa dikkatli olun, çünkü bu dosyalar geçerli çalışma dizinine ve git kök dizinine göre dosyaları hariç tutar.


1
bir noktayı mı kaçırıyorsun, değil git diff -- . ':(exclude)lib/*'mi?
Nicolas Dermine

1
@NicolasDermine Hayır, yazdıklarınız eşdeğerdir. Yolun "içerir" kısmı da isteğe bağlıdır. Bu nedenle git diff, geçerli yolunuza göre her şey için gerekli olmaktan ziyade yapabilirsinizgit diff -- .
MaxPRafferty

Not: Windows makinelerinde, çift tırnak kullanın, örneğingit diff -- ":(exclude)lib/*"
cnlevy

Neden olduğu hakkında bir fikrim yok, ama benim için @NicolasDermine tarafından önerildiği gibi sadece nokta ile çalışıyor. Win10'da Cmder kullanıyorum.
Olivvv

3

Git kök dizinine göre

git diff isteğe bağlı bir hariç tutmayı kabul eder

git diff -- ":(exclude)thingToExclude"

Bazı joker karakterler eklemek isteyebilirsiniz

git diff -- ":(exclude)*/thingToExclude/*"

Belirli dosya türlerini hedefleme

git diff -- ":(exclude)*/$1/*.png"

Bazı sözdizimsel şeker uygulandı

git diff -- ":!/\$1/"

Veya nokta dosyalarınız için küçük bir komut dosyası bırakın

Gibi .bash_profileveya.zshrc

gde() {
    : '
        git diff exclude files or folders
        usage:
        gde fileOrFolderNameToExclude
    '
    git diff -- ":!/\$1/"
}

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.