Mam skrypt, który działa rsync
z katalogiem roboczym Git jako miejscem docelowym. Chcę, aby skrypt działał inaczej w zależności od tego, czy katalog roboczy jest czysty (żadnych zmian do zatwierdzenia), czy nie. Na przykład, jeśli dane wyjściowe git status
są jak poniżej, chcę, aby skrypt zakończył działanie:
git status
Already up-to-date.
# On branch master
nothing to commit (working directory clean)
Everything up-to-date
Jeśli katalog nie jest czysty, to chciałbym, aby wykonał więcej poleceń.
Jak mogę sprawdzić wyniki w powyższym skrypcie powłoki?
shell-script
git
brentwpeterson
źródło
źródło
git reset --hard origin/branch
jeśli to jest to, czego szukasz ... na przykład, jeśli próbujeszOdpowiedzi:
Analiza wyniku
git status
jest złym pomysłem, ponieważ jest przeznaczony do odczytu przez człowieka, a nie do odczytu maszynowego. Nie ma gwarancji, że dane wyjściowe pozostaną takie same w przyszłych wersjach Git lub w różnie skonfigurowanych środowiskach.Komentarz UVV jest na dobrej drodze, ale niestety kod powrotu
git status
nie zmienia się w przypadku niezatwierdzonych zmian. Zapewnia jednak--porcelain
opcję, która powoduje, że dane wyjściowegit status --porcelain
mają być sformatowane w łatwym do przeanalizowania formacie dla skryptów i pozostają stabilne w wersjach Git i niezależnie od konfiguracji użytkownika.Możemy użyć pustych danych wyjściowych
git status --porcelain
jako wskaźnika, że nie ma żadnych zmian do zatwierdzenia:Jeśli nie dbamy o nieśledzone pliki w katalogu roboczym, możemy użyć
--untracked-files=no
opcji, aby zignorować te:Aby uczynić to bardziej odpornym na warunki, które faktycznie powodują
git status
awarię bez wyjściastdout
, możemy zawęzić sprawdzenie, aby:Warto również zauważyć, że chociaż
git status
nie podaje sensownego kodu wyjścia, gdy katalog roboczy jest nieczysty,git diff
udostępnia--exit-code
opcję, która sprawia, że zachowuje się on podobnie do narzędzia diff , to znaczy wychodzenia ze statusem,1
gdy były różnice i0
kiedy nie znaleziono żadnego.Korzystając z tego, możemy sprawdzić zmiany niestacjonarne za pomocą:
i wprowadził zmiany, ale nie zatwierdził zmian w:
Chociaż
git diff
może raportować o nieśledzonych plikach w podmodułach za pomocą odpowiednich argumentów--ignore-submodules
, niestety wydaje się, że nie ma możliwości, aby raportował o nieśledzonych plikach w rzeczywistym katalogu roboczym. Jeśli nieśledzone pliki w katalogu roboczym są istotne,git status --porcelain
to prawdopodobnie najlepszy wybór.źródło
git status --porcelain
zakończy działanie z kodem 0, nawet jeśli nie zostaną wprowadzone zmiany dla plików zatwierdzania i nieśledzonych.git stash
coś zrobię (nie wyświetla przydatnego kodu powrotu). Musiałem dodać,--ignore-submodules
ponieważ inaczejgit status
wskazywałoby na zmiany w podmodule, któregit stash
ignorują.if [ -z
dzieje. Te-z
środki, jeśli następujący ciąg jest pusty, jeśli ma wartośćtrue
. Innymi słowy, jeśli niegit status --porcelain
spowoduje to powstania łańcucha, repozytorium jest czyste. Jeśli nie, wyświetla listę zmodyfikowanych / dodanych / usuniętych plików i nie jest już pustym ciągiem.if
Następnie ocenia sięfalse
.Posługiwać się:
Kod powrotu odzwierciedla stan katalogu roboczego (0 = czysty, 1 = brudny). Nieśledzone pliki są ignorowane.
źródło
git update-index --refresh
wcześniejgit diff-index HEAD
. Więcej informacji: stackoverflow.com/q/34807971/1407170git add .
przed ich wydaniem. Zwykle jest to sposób użycia go w skrypcieset +e
przed połączeniemgit
i dodającset -e
ponownie po dokonaniu oceny$?
.Niewielkie rozszerzenie doskonałej odpowiedzi André .
Jest to jeden ze sposobów oceny wyników, a także uniknięcia pułapki, jeśli jesteś w skrypcie, który wcześniej wydał zestaw -e .
Nieśledzone pliki są ignorowane.
źródło