W pliku Makefile chciałbym wykonać pewne działania, jeśli wystąpią niezatwierdzone zmiany (w drzewie roboczym lub w indeksie). Jaki jest najczystszy i najskuteczniejszy sposób to zrobić? Polecenie kończące się z wartością zwracaną zero w jednym przypadku i niezerową w drugim byłoby odpowiednie dla moich celów.
Mogę git status
przepuszczać i przesyłać dane wyjściowe grep
, ale wydaje mi się, że musi istnieć lepszy sposób.
Odpowiedzi:
AKTUALIZACJA : OP Daniel Stutzbach wskazuje w komentarzach, że to proste polecenie
git diff-index
działało dla niego:( nornagon wspomina w komentarzach, że jeśli istnieją pliki, które zostały dotknięte, ale których zawartość jest taka sama jak w indeksie, musisz uruchomić
git update-index --refresh
wcześniejgit diff-index
, w przeciwnym raziediff-index
niepoprawnie zgłosi, że drzewo jest brudne)Następnie możesz zobaczyć „ Jak sprawdzić, czy polecenie się powiodło? ”, Jeśli używasz go w skrypcie bash:
Uwaga: jak skomentował przez Anthony Sottile
I
haridsv
zwraca uwagę, w komentarzach , żegit diff-files
na nowym pliku nie wykrywa go jako diff.Wydaje się, że bezpieczniejszym rozwiązaniem jest
git add
najpierw uruchomienie specyfikacji pliku, a następniegit diff-index
sprawdzenie, czy przed uruchomieniem coś zostało dodane do indeksugit commit
.I 6502 raportów w komentarzach:
Te problemy ze znacznikami czasu mogą również wystąpić, jeśli git działa w oknie dokowanym .
Oryginalna odpowiedź:
„Programowo” oznacza, że nigdy nie należy polegać na porcelanowych poleceniach .
Zawsze polegaj na poleceniach hydraulicznych .
Zobacz także „ Sprawdzanie brudnego indeksu lub nieśledzonych plików za pomocą Git ”, aby znaleźć alternatywne rozwiązania (np.
git status --porcelain
)Możesz czerpać inspirację z nowej „
require_clean_work_tree
funkcji ”, która jest napisana w trakcie rozmowy ;) (początek października 2010 r.)źródło
git diff-index --quiet HEAD
.HEAD
w katalogu roboczym. Lepsze wykorzystaniegit diff-index --quiet HEAD --
.git status --help
stanów: --porcelain Podaj dane wyjściowe w łatwym do przeanalizowania formacie dla skryptów. Jest to podobne do krótkiego wyjścia, ale pozostanie stabilne w wersjach Git i niezależnie od konfiguracji użytkownika. Szczegóły poniżej.Podczas gdy inne rozwiązania są bardzo dokładne, jeśli chcesz czegoś naprawdę szybkiego i brudnego, spróbuj czegoś takiego:
Sprawdza tylko, czy w podsumowaniu statusu jest jakaś informacja wyjściowa.
źródło
[[ ... ]]
właściwie robi składnia? Nigdy wcześniej czegoś takiego nie widziałem.git status
jest faktycznie ignorowany w tym teście. Patrzy tylko na wynik. Sprawdź tę stronę związaną z bash, aby uzyskać więcej informacji o tym[
,[[
jak testowanie działa w bash.--porcelain
parametru pokazanego tutajgit status -s -uall
aby dołączyć nieśledzone pliki.git diff --exit-code
zwróci wartość niezerową, jeśli wystąpią jakiekolwiek zmiany;git diff --quiet
jest taki sam bez wyjścia. Ponieważ chcesz sprawdzić działające drzewo i indeks, użyjLub
Każdy z nich powie ci, czy istnieją niezatwierdzone zmiany, które zostały wprowadzone lub nie.
źródło
git diff --quite HEAD
powie ci tylko, czy działające drzewo jest czyste, a nie czy indeks jest czysty. Na przykład, jeślifile
został zmieniony między HEAD ~ i HEAD, to pogit reset HEAD~ -- file
tym nadal będzie kończył 0, mimo że w indeksie występują zmiany stopniowane (wt == HEAD, ale indeks! = HEAD).git diff --quiet && git diff --cached --quiet
.Rozwijając odpowiedź @ Nepthara:
źródło
$(git status -s "$file")
a następnie welse
klauzuligit add "$file"; git commit -m "your autocommit process" "$file"
git status -s
togit status --porcelain ; git clean -nd
zamiast tego, pojawią się tutaj również katalogi śmieci, które są niewidocznegit status
.Jak wskazano w innej odpowiedzi, wystarczy takie proste polecenie:
Jeśli pominiesz dwa ostatnie myślniki, polecenie zakończy się niepowodzeniem, jeśli masz plik o nazwie
HEAD
.Przykład:
Uwaga: to polecenie ignoruje nieśledzone pliki.
źródło
git add
igit clean
na ratunekStworzyłem kilka przydatnych aliasów git, aby wyświetlić listę plików niestacjonarnych i przemieszczanych:
Następnie możesz łatwo robić takie rzeczy jak:
Możesz uczynić go bardziej czytelnym, tworząc skrypt gdzieś na
PATH
nazwiegit-has
:Teraz powyższe przykłady można uprościć:
Dla kompletności tutaj są podobne aliasy dla nieśledzonych i ignorowanych plików:
źródło
Z pythonem i pakietem GitPython:
Zwraca wartość True, jeśli repozytorium nie jest czyste
źródło
LOGLEVEL=DEBUG
, zobaczysz wszystkie polecenia Popena, których używa do uruchomieniagit diff
Oto najlepszy, najczystszy sposób.
źródło
git status
to polecenie „porcelanowe”. Nie używaj porcelanowych poleceń w skryptach, ponieważ mogą one zmieniać wersje git. Zamiast tego użyj poleceń „hydraulika”.git status --porcelain
(który jest przeznaczony do tego celu - stabilnego formatu, który można analizować w skrypcie), być może również z -z (oddzielone zerą zamiast nowego wiersza?), Możesz zrobić coś użytecznego z tym pomysłem . @ codyc4321, zobacz szczegóły stackoverflow.com/questions/6976473/ ...