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.


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.


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”.


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'

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.


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.


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/"
}

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.