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.