Chcesz wykluczyć plik z „git diff”

229

Próbuję wykluczyć plik ( db/irrelevant.php) z Git diff. Próbowałem umieścić plik w dbpodkatalogu wywoływanym .gitattributesza pomocą wiersza irrelevant.php -diff i próbowałem również utworzyć plik o nazwie .git/info/attributeszawierającej db/irrelevant.php.

We wszystkich przypadkach db/irrelevant.phpplik jest zawarty w pliku różnicowym jako łatka binarna Git. Chcę, aby zmiany w tym pliku były ignorowane przez polecenie diff. Co ja robię źle?

Michael
źródło

Odpowiedzi:

325

Omg, sterowniki i awk, aby wykluczyć kiepski plik? Od wersji git 1.9 możesz:

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

Ach, elegancja! Zobacz cytowaną odpowiedź i szczegółowe informacje na temat tej odpowiedzi @torek

Mr_i_Mrs_D
źródło
4
UWAGA: Jeśli chcesz wykluczyć określoną nazwę pliku, musisz poprzedzić ją gwiazdką, inną niż .gitignoreskładnia pliku. Np. :!*shrinkwrap.yamlZamiast :!shrinkwrap.yaml.
vaughan
7
Wyklucz więcej plików, np. Mam pliki * .min.css i * .min.js, aby uniknąć z git diff. Używam więc poleceniagit diff -- . ':(exclude)*.min.js' ':(exclude)*.min.css'
maheshwaghmare
4
składnia systemu Windows : git diff -- . ":(exclude)db/irrelevant.php"(podwójne cudzysłowy zamiast pojedynczych cudzysłowów)
cnlevy 24.04.18
4
Dziękuję Ci! Taka ezoteryczna składnia ... Muszę to sprawdzić za każdym razem.
Daniel Waltrip
1
@cnlevy lub brak cytatów! git diff -- . :(exclude)db/irrelevant.php
Matthias
62

Można skonfigurować niestandardowy sterownik różnicowy za pomocą polecenia no op i przypisać go do plików, które należy zignorować.

Za pomocą tego polecenia utwórz sterownik różnic specyficzny dla repozytorium

git config diff.nodiff.command /bin/true

lub dla wszystkich twoich transakcji repo --global.

(Jeśli /bin/truenie istnieje w MacOS, alternatywą byłoby użycie /usr/bin/truelub echo).

Następnie przypisz nowy sterownik różnicowy do plików, które chcesz zignorować w swoim .git/info/attributespliku.

irrelevant.php    diff=nodiff

Jeśli ten stan ma być współdzielony z innymi programistami, możesz użyć .gitattributeszamiast tego .git/info/attributesi udostępnić git configpolecenie swoim rówieśnikom (poprzez plik dokumentacji lub coś takiego).

KurzedMetal
źródło
2
Właśnie tego szukałem - jak opisano w kerneltrap.org/mailarchive/git/2008/10/17/3711254 Edytowałem ~ / .gitconfig dodając: [diff "nodiff"] `command = / bin / true`, a następnie utworzyłem plik o nazwie .git / info / atrybuty, do których dodałem: irrelevant.php diff=nodiff
Michael
12
Ta odpowiedź działała dla mnie znacznie lepiej: stackoverflow.com/questions/1016798/…
Neil Forrester,
3
Co ciekawe, to podejście nie działa git diff --stat. W takim przypadku można zastosować git diff ... | diffstatobejście.
ddkilzer
@Michael, ten link wydaje się być zepsuty, czy jest jakiś inny?
DickieBoy,
3
tylko dodatek: jeśli chcesz zmusić git diff do wyświetlenia go, użyj--no-ext-diff
Florian Klein
35

Można również użyć filterdiff program do patchutils odbioru programu, aby wykluczyć niektóre części diff. Na przykład:

git diff | filterdiff -p 1 -x db/irrelevant.php
Szilárd Pfeiffer
źródło
4
Zauważ, że -pz manpage (1) jest „-pn, --strip-match = n Podczas dopasowywania, zignoruj ​​pierwsze n składników ścieżki”. Zajęło mi trochę czasu, aby złapać, że -p 1usuwa dbczęść z drogi PO. Jeśli chcesz tylko podać nazwę pliku i zignorować wszystkie możliwości ścieżki / katalogu, możesz użyć -p 99.
Tyler Collier
32

Ta metoda jest krótsza niż przyjęte odpowiedzi.

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

Aby uzyskać więcej informacji na temat różnych możliwości włączenia / wyłączenia, przeczytaj ten drugi post

Chiel ten Brinke
źródło
Pamiętaj, że filtr dotyczy tylko wszystkich plików poniżej bieżącego katalogu.
Chiel ten Brinke
To była najlepsza odpowiedź. Mogłem to trochę uprościć: stackoverflow.com/a/58845608/3886183
dlsso
2
Chciałbym usunąć część --stat, a przynajmniej wyjaśnić, co robi, ponieważ żadna z pozostałych odpowiedzi tego nie zawiera.
mix3d
Flaga statystyki pokazuje pliki i ich sumy różnic, co pozwala łatwo sprawdzić, czy filtr działał w zamierzony sposób.
Chiel ten Brinke
17

To jedno-liniowe rozwiązanie nie wymaga innych narzędzi / plików do pobrania:

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

Gdzie file/to/exclude.txtoczywiście jest nazwa pliku, który chcesz wykluczyć.

Edycja: kredyt ksenzee za naprawienie usuniętych plików zerwania różnic.

Ben Roux
źródło
Staram się dostosować twój jeden liner git diff --stat masterbez większego powodzenia - czy możesz pomóc?
Mr_and_Mrs_D
13

Naprawdę dobra odpowiedź od KurzedMetal na to, co musiałem zrobić, czyli zobaczyć, że plik się zmienił, ale nie wygenerować różnicy, która w moim przypadku mogłaby być ogromna.

Ale mój kolega zaproponował podejście, które było jeszcze prostsze i działało dla mnie:

dodanie .gitattributespliku do katalogu, w którym plik, który ma zostać zignorowany, git diffznajduje się w następującej treści:

file-not-to-diff.bin -diff

To pozwala git status„zobaczyć”, jeśli plik się zmienił. git diffzobaczy również, że plik się zmienił, ale nie wygeneruje pliku diff.

To .binrozszerzenie pliku w tym przykładzie było celowe. Zdaję sobie sprawę, że jest to domyślne zachowanie git dla plików binarnych i nie wymaga specjalnej obsługi .gitattributes. Ale w moim przypadku pliki te zostały rozpoznane przez git i narzędzie „file” jako pliki tekstowe i to załatwiło sprawę.

użytkownik3589608
źródło
11

Najprostsza odpowiedź

git diff ':!db/irrelevant.php'

To jest zaraz ':!<path to file>'po poleceniu diff. Polecenie diff może być tak skomplikowane, jak chcesz, i możesz używać symboli wieloznacznych takich jak *.min.jslub dodawać wiele wykluczeń (oddzielaj spacje cytowanymi blokami), jeśli chcesz.

dlsso
źródło
5

Względem katalogu głównego git

git diff akceptuje opcjonalne wykluczenie

git diff -- ":(exclude)thingToExclude"

Możesz dodać kilka dzikich kart

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

Kieruj na określone typy plików

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

Lub upuść mały skrypt dla swoich plików dot

Takich jak .bash_profilelub.zshrc

gde() {
    # git diff exclude files or folders 
    # usage: 
    # gde fileOrFolderNameToExclude
    git diff -- ":(exclude)*/$1/*"
}
jasonleonhard
źródło
to po prostu nie działa dla mnie, nie mam żadnych różnic, przy obu składniach, używając (wyklucz) lub! Mam git 2.21.0
Olivvv
Możesz różnicować zarówno pliki niestacjonarne, jak i przemieszczane. Jeśli je dodasz, zostaną zainscenizowane. Jeśli są wystawiane, możesz zrobić git diff --stagedNadzieję, że to ci pomoże.
jasonleonhard
Składniowo, co robi dwukropek?
Jonasz
2

To bardzo proste, możesz wykluczyć to, co chcesz za pomocą standardowych poleceń unix, te polecenia są dostępne w git bash, nawet w środowisku Windows. Poniższy przykład pokazuje, jak wykluczyć diff dla plików pom.xml, najpierw sprawdź diff do master tylko dla nazw plików, a następnie używając 'grep -v' wyklucz pliki, których nie chcesz, a następnie uruchom ponownie diff dla master z przygotowaną listą:

git diff master `git diff --name-only master | grep -v pom.xml`
Nieznany Anonimiec
źródło
1

podobne do rozwiązania Bena Rouxa , ale mimo to udostępnianie:

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

lub, jeśli zmiany zostały już zatwierdzone lokalnie:

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

Przykłady:

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
Chris Montoro
źródło
1

Wykonuję następujące czynności:

git add *pattern_to_exclude*
git diff
git reset HEAD .

Wiem, że to nie jest eleganckie rozwiązanie i czasami nie można go użyć (np. Jeśli masz już rzeczy wystawione), ale robi to bez konieczności wpisywania skomplikowanego polecenia

BlueMagma
źródło
0

Jeśli chcesz to zrobić tylko w celu wizualnej kontroli różnicy, wizualne narzędzie różnicowania (takie jak Meld ) pozwoli ci to zrobić za pomocą krótkiego, łatwego do zapamiętania polecenia.

Najpierw skonfiguruj narzędzie do porównywania, jeśli jeszcze tego nie zrobiłeś.

$ git config --global diff.tool = meld

Następnie możesz uruchomić katalog różnic.

$ git difftool --dir-diff

Będziesz mógł przeglądać pliki różnic (według plików) w Meld (lub wybranym narzędziu). Po prostu nie otwieraj pliku, który chcesz zignorować.

mkasberg
źródło