Wyklucz katalog z git diff

179

Zastanawiam się, jak mogę wykluczyć cały katalog z mojego pliku różnicowego Git. (W tym przypadku / specyfikacja). Tworzę różnicę dla całej naszej wersji oprogramowania za pomocą polecenia git diff. Jednak zmiany w specyfikacji są nieistotne dla tej procedury i po prostu powodują bóle głowy. teraz wiem, że mogę to zrobić

git diff previous_release..current_release app/

Spowoduje to utworzenie różnicy dla wszystkich zmian w katalogu aplikacji, ale nie na przykład w katalogu lib /. Czy ktoś wie, jak wykonać to zadanie? Dzięki!

Edycja: Chcę tylko, aby było jasne, wiem, że mogę po prostu podać parametry wszystkich moich katalogów na końcu, minus / spec. Miałem nadzieję, że istnieje sposób, aby naprawdę wykluczyć pojedynczy katalog w poleceniu.

Mysrt
źródło
4
Znalazłem to niesamowite pytanie, ponieważ chciałem zignorować moduły podrzędne . W takim przypadku, jeśli jesteś tak naiwny jak ja, to pytanie może być bardziej pomocne.
brandizzi
To dziwne, że nadal nie mamy natywnego przełącznika Git, który mógłby to zrobić we wrześniu 2016 r.
Michael Z

Odpowiedzi:

138

Zakładając, że używasz basha i masz włączone rozszerzone globbing ( shopt -s extglob), możesz sobie z tym poradzić od strony powłoki:

git diff previous_release current_release !(spec)

Dzięki temu nie musisz wymieniać wszystkich innych rzeczy.

Lub, agnostyk:

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

Możesz zawrzeć to w jednowierszowym skrypcie powłoki, aby zaoszczędzić sobie konieczności ponownego wpisywania argumentów.

Cascabel
źródło
1
Globbing PS nie pasuje do ukrytych plików, więc jeśli masz obsesję, możesz chcieć .!(.|)dopasować wszystko, zaczynając od .poza .i ...
Cascabel
Wydaje się, że nie działa to w przypadku plików, które są zupełnie nowe lub usunięte w różnych oddziałach. Otrzymuję błędy, które zatrzymują wykonanie skryptu, mówiąc, że nie może się z nim różnić.
Graham Christensen
2
@Graham: Uważam, że to, --co właśnie dodałem, powinno to naprawić.
Cascabel,
1
Świetna odpowiedź. Chciałem, aby pokazywały się tylko nazwy (a nie rzeczywiste różnice), więc musiałem również dodać --name-onlyna samym końcu.
sierpień
1
Po zabawie, chcę tylko dodać, że jeśli zmienisz nazwę pliku, -- path/of/new/filewyskoczy błąd, ale wszystko co musisz zrobić, to dodać i to rozgryźć :)
sie
321

Na podstawie tej odpowiedzi możesz również użyć:

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

Jest to nowa funkcja gita, która umożliwia wykluczanie pewnych ścieżek. Powinien być bardziej niezawodny niż różne oneliny muszlowe.

Publikuję to tutaj, ponieważ to pytanie nadal jest trafieniem nr 1 dla „ścieżki wykluczenia git diff”.

cdleonard
źródło
4
Uwielbiam tę odpowiedź. Jeśli dodajesz opcje, zrób to przed podwójnym myślnikiem. Np .: git diff previous_release current_release --name-status -- . ':!spec'
liamvictor
Nie zdawałem sobie sprawy, że mogę użyć nazw gałęzi dla current_releasei previous_release- sprawił, że uśmiechnąłem się, kiedy się zorientowałem.
trueheart78
2
Co mi pomogło git diff --stat dev -- . ':!/Mopy/Docs/*'. Co nie zadziałało dla mnie git diff dev --stat -- . ':!('Mopy/Docs/Wrye Bash General Readme.html'|'Mopy/Docs/Wrye Bash Advanced Readme.html')'i odmiany
Mr_and_Mrs_D
Naprawdę pomocny. Oto składnia umożliwiająca sprawdzenie, czy jakiekolwiek pliki inne niż database.yml zostały zmienione:git diff --check -- . ':!config/database.yml'
Dan Kohn
17
Może również wykluczyć wiele elementów, takich jak:git diff previous_release current_release -- . ':!file_a' ':!file_b'
PseudoNoise
37

Jeśli chcesz określić więcej niż jedną ścieżkę do wykluczenia w git diff, po prostu dodaj dodatkowe parametry wykluczające na końcu, np. Aby wykluczyć ze statystyk wszystko w katalogach vendor i bin : -

git diff --stat previous_release..current_release -- . ':!vendor' ':!bin'
David Graham
źródło
33

Możesz spróbować usunąć atrybut diff dla dowolnych plików w katalogu lib.
.gitattributes:

lib/* -diff

racl101 dodaje w komentarzach :

Aby to dodać, dla tych z Was, którzy chcą ograniczyć git diffwyjście plików określonego typu, w określonym katalogu i jego podkatalogach, jak na przykład cały JavaScript wygenerowany przez pakietowanie .jsplików Webpack , możesz dodać to do .gitattributes:

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

Wtedy nie widzisz całego tego szumu na wyjściu git diff i wyświetla się on jako: Binary files ... differco jest bardziej pomocne.

VonC
źródło
usunie to jednak specyfikację ze wszystkich moich różnic. Nadal chcę normalnie widzieć moje różnice w folderze specyfikacji, ale nie kiedy uruchamiam ten plik
różnicowy ``
2
@Mystr: Mógłbyś ustawić ten .gitattributesplik w specjalnej gałęzi stworzonej tylko dla tego rodzaju różnic w „wydaniu”;) Zrestartuj tę specjalną gałąź na wierzchu current_releasei wykonaj tam swoje porównywanie .
VonC,
Wydaje się, że to również nie działa w przypadku plików, które są usuwane między gałęziami. Pliki, które zostały usunięte, nadal pokazują pełną różnicę.
Graham Christensen
Nie działa na mnie. Czy _ ścieżki są specjalne? _site/* -diff
Marius,
@MariusAndreiana Nie, „_” nie jest czymś specjalnym. Czy możesz sprawdzić, która reguła gitattributes ma zastosowanie do pliku tego folderu z: git-scm.com/docs/git-check-attr
VonC
22

Git diff akceptuje teraz niestandardowy format wykluczeń: git diff -- ':(exclude)lib/*'

Uważaj, jeśli masz wiele powtarzających się nazw folderów („/ app”, „/ lib” itp.), Ponieważ spowoduje to wykluczenie plików względem bieżącego katalogu roboczego ORAZ katalogu głównego git.

MaxPRafferty
źródło
1
brakuje ci kropki, czy raczej nie powinno git diff -- . ':(exclude)lib/*'?
Nicolas Dermine
1
@NicolasDermine Nie, chociaż to, co napisałeś, jest równoważne. Część ścieżki „zawiera” jest również opcjonalna. Dlatego możesz po prostu zrobić git diffwszystko, co dotyczy twojej obecnej ścieżki, zamiast wymagaćgit diff -- .
MaxPRafferty
Uwaga: na komputerach z systemem Windows użyj podwójnych cudzysłowów, na przykładgit diff -- ":(exclude)lib/*"
cnlevy
Nie mam pojęcia dlaczego, ale dla mnie działa tylko z kropką, jak sugeruje @NicolasDermine. Używam Cmder na win10.
Olivvv
3

Względem katalogu głównego git

git diff akceptuje opcjonalne wykluczenie

git diff -- ":(exclude)thingToExclude"

Możesz dodać kilka symboli wieloznacznych

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

Kieruj reklamy na określone typy plików

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

Zastosowano trochę cukru syntaktycznego

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

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

Takich jak .bash_profilelub.zshrc

gde() {
    : '
        git diff exclude files or folders
        usage:
        gde fileOrFolderNameToExclude
    '
    git diff -- ":!/\$1/"
}
jasonleonhard
źródło
-6
git diff app lib
Jed Schneider
źródło