Dosyayı “git diff” dışında bırakmak istiyorum


229

db/irrelevant.phpGit farkından bir dosyayı ( ) hariç tutmaya çalışıyorum . İçine bir dosya koyarak denedimdb.gitattributesÇizgi ile çağrılan alt dizineirrelevant.php -diff ve ayrıca .git/info/attributesiçeren adlı bir dosya oluşturmaya çalıştım db/irrelevant.php.

Her durumda, db/irrelevant.php dosya diff'e Git ikili düzeltme eki olarak eklenir. Ne istediğim, bu dosyadaki değişikliklerin diff komutu tarafından yoksayılmasıdır. Neyi yanlış yapıyorum?

Yanıtlar:


325

Omg, sürücüler ve awk berbat bir dosyayı hariç tutmak için? Git 1.9'dan beri şunları yapabilirsiniz:

git diff -- . ':(exclude)db/irrelevant.php' ':(exclude)db/irrelevant2.php'

Ah, zarafet! Alıntılanan cevaba bakın ve @torek'in bu cevabı hakkında ayrıntılar için


4
NOT: Belirli bir dosya adını dışlamak istiyorsanız, .gitignoredosya sözdiziminden farklı olarak yıldız işaretiyle ön ek yapmanız gerekir . Örneğin :!*shrinkwrap.yamlyerine :!shrinkwrap.yaml.
vaughan

7
Daha fazla dosya hariç tutun, örneğin git farkından kaçınmak için * .min.css ve * .min.js dosyalarına sahibim. Yani, komutunu kullanıyorumgit diff -- . ':(exclude)*.min.js' ':(exclude)*.min.css'
maheshwaghmare

4
windows sözdizimi : git diff -- . ":(exclude)db/irrelevant.php"(tek tırnak yerine çift tırnak)
cnlevy

4
Teşekkür ederim! Böyle ezoterik bir sözdizimi .. Her seferinde bakmak zorundayım.
Daniel Waltrip

1
@ cnlevy veya alıntı yok! git diff -- . :(exclude)db/irrelevant.php
Matthias

62

Op komutu olmayan özel bir diff sürücüsü ayarlayabilir ve yoksayılması gereken dosyalara atayabilirsiniz.

Bu komutla depoya özel bir fark sürücüsü oluşturun

git config diff.nodiff.command /bin/true

veya tüm depolarınız için --global.

( /bin/trueMacOS'ta yoksa, alternatifler /usr/bin/trueveya kullanırdı echo).

Ardından, göz ardı istediğiniz o dosyalara yeni fark sürücüsünü atamak için de .git/info/attributesdosyaya.

irrelevant.php    diff=nodiff

Bu durumun diğer geliştiricilerle paylaşılması gerekiyorsa , komutu .gitattributesyerine arkadaşlarınızla .git/info/attributespaylaşabilirsiniz git config(bir belge dosyası veya başka bir şey aracılığıyla).


2
Tam da aradığım şey buydu - kerneltrap.org/mailarchive/git/2008/10/17/3711254'te açıklandığı gibi ~ / .gitconfig ekleyerek şunu düzenledim: [diff "nodiff"] `command = / bin / true` ve şu adla bir dosya oluşturdum: .git / info / eklediğim özellikler: irrelevant.php diff=nodiff
Michael

12
Bu cevap benim için çok daha iyi çalıştı: stackoverflow.com/questions/1016798/…
Neil Forrester

3
İlginçtir ki bu yaklaşım işe yaramaz git diff --stat. Bu durumda, git diff ... | diffstatgeçici çözüm olarak kullanılabilir.
ddkilzer

@Michael bu bağlantının kopmuş olduğunu, başka var mı?
DickieBoy

3
sadece bir ek: git diff'i yine de görüntülemeye zorlamak istiyorsanız, kullanın--no-ext-diff
Florian Klein

35

Bir farkın bazı bölümlerini hariç tutmak için patchutils program koleksiyonunun filterdiff programını da kullanabilirsiniz . Örneğin:

git diff | filterdiff -p 1 -x db/irrelevant.php

4
Not -pman, (1), bir "pn, --strip eşleme n = Eşleştirme, yol adı ilk n bileşenlerini yoksaydığınızda." Parçayı OP'nin yolundan -p 1kaldıranı yakalamak biraz zaman aldı db. Yalnızca bir dosya adı belirtmek ve tüm yol / dizin olasılıklarını yoksaymak istiyorsanız, kullanabilirsiniz -p 99.
Tyler Collier

32

Bu yöntem kabul edilen cevaplardan daha kısadır.

git diff 987200fbfb 878cee40ba --stat -- ':!*.cs'

Farklı dahil etme / hariç tutma olasılıkları hakkında daha fazla bilgi için bu diğer yazıyı okuyun


Filtrenin yalnızca geçerli dizininizin altındaki tüm dosyalar için geçerli olduğunu unutmayın.
Chiel ten Brinke

Bu en iyi cevaptı. Biraz daha basitleştirebildim: stackoverflow.com/a/58845608/3886183
dlsso

2
Diğer cevapların hiçbiri içermediğinden --stat kısmını kaldırır veya en azından ne yaptığını açıklarım.
mix3d

Stat bayrağı, filtrenin istediğiniz şekilde çalışıp çalışmadığını kolayca kontrol etmenizi sağlayan dosyaları ve fark toplamlarını gösterir.
Chiel ten Brinke

17

Bu tek satırlık çözüm, başka herhangi bir araç / indirme gerektirmez:

git diff `git status -s |grep -v ^\ D |grep -v file/to/exclude.txt |cut -b4-`

file/to/exclude.txtTabii ki hariç tutmak istediğiniz dosyanın adı nerede .

Düzenleme: fark kırma silinmiş dosyaları düzeltmek için kredi ksenzee .


Tek bir astarınızı git diff --stat masterçok başarılı olmadan uyarlamaya çalışıyorum - yardımcı olabilir misiniz?
Mr_and_Mrs_D

13

KurzedMetal'dan yapmam gereken şey için gerçekten iyi bir cevap, bu da dosyanın değiştiğini görebiliyordu, ancak benim durumumda büyük olabilecek farkları üretemedi .

Ama bir meslektaşım benim için daha basit ve işe yarayan bir yaklaşım önerdi:

.gitattributestarafından göz ardı edilecek dosyanın git diffaşağıdaki içeriğe sahip olduğu dizine dosya eklemek :

file-not-to-diff.bin -diff

Bu hala git statusdosya değiştiğinde "görmeye" izin verir . git diffayrıca dosyanın değiştiğini "görür", ancak dosyayı oluşturmaz diff.

.binÖrnekteki dosya için bu uzantı kasıtlıydı. Bunun ikili dosyalar için git'in varsayılan davranışı olduğunu ve özel işlem gerektirmediğinin farkındayım .gitattributes. Ama benim durumumda, bu dosyalar git ve "file" yardımcı programı tarafından metin dosyaları olarak kabul edildi ve bu hile yaptı.


11

En basit cevap

git diff ':!db/irrelevant.php'

Fark ':!<path to file>'komutunuzdan hemen sonra. Diff komutu istediğiniz kadar karmaşık olabilir ve isterseniz joker karakterler kullanabilir *.min.jsveya isterseniz birden fazla hariç tutma (boşluk verilen alıntı bloklarını ayırabilirsiniz) ekleyebilirsiniz.


5

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"

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 -- ":(exclude)*/$1/*"
}

Bu benim için işe yaramıyor, ben her iki sözdizimi ile (hariç) veya! Gitmek 2.21.0
Olivvv

İşaretlenmemiş veya aşamalı dosyaları git fark edebilirsiniz. Git onları eklediyseniz sahnelenir. Eğer sahnelenmişlerse, git diff --stagedumarım bu size yardımcı olur.
Jasonleonhard

Sözdizimsel olarak, kolon ne yapıyor?
Jonah

2

Çok basit, standart unix komutlarını kullanarak ne istediğinizi hariç tutabilirsiniz, bu komutlar Windows ortamında bile git bash altında kullanılabilir. Aşağıdaki örnek, pom.xml dosyaları için diff'in nasıl hariç tutulacağını gösterir, önce diff'i yalnızca dosya adları için master olarak kontrol edin, ardından 'grep -v' komutunu kullanarak istemediğiniz dosyaları hariç tutun ve daha sonra diff'i prepapred listesiyle master için tekrar çalıştırın:

git diff master `git diff --name-only master | grep -v pom.xml`

1

Ben Roux'nun çözümüne benzer , ancak yine de paylaşıyorum:

git status --porcelain | grep -v $PATTERN_TO_EXCLUDE | awk '{print $2}' | xargs git diff

veya değişiklikler yerel olarak zaten yapılmışsa:

git diff --name-only origin/master | grep -v $PATTERN_TO_EXCLUDE | xargs git diff origin/master

Örnekler:

git status --porcelain | grep -v docs | awk '{print $2}' | xargs git diff origin/master

git diff --name-only origin/master | grep -v docs | xargs git diff origin/master

1

Aşağıdakileri yaparım:

git add *pattern_to_exclude*
git diff
git reset HEAD .

Zarif bir çözüm olmadığını biliyorum ve bazen kullanılamıyor (örneğin, zaten sahnelendiğiniz şeyler varsa), ancak karmaşık bir komut yazmak zorunda kalmadan hile yapıyor


0

Bunu sadece farkı görsel olarak incelemek için yapmak istiyorsanız, görsel bir fark aracı ( Meld gibi ) bunu hatırlaması kolay kısa bir komutla yapmanıza izin verir.

Öncelikle, henüz yapmadıysanız bir fark aracı ayarlayın.

$ git config --global diff.tool = meld

Ardından, diff.

$ git difftool --dir-diff

Meld'de (veya seçtiğiniz araçta) diffs'ye (dosyaya) göz atabilirsiniz. Yoksaymak istediğiniz dosyayı açmayın.

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.