Analiza wyniku git statusjest 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 statusnie zmienia się w przypadku niezatwierdzonych zmian. Zapewnia jednak --porcelainopcję, która powoduje, że dane wyjściowe git status --porcelainmają 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 --porcelainjako wskaźnika, że nie ma żadnych zmian do zatwierdzenia:
if [ -z "$(git status --porcelain)" ]; then
# Working directory clean
else
# Uncommitted changes
fi
Jeśli nie dbamy o nieśledzone pliki w katalogu roboczym, możemy użyć --untracked-files=noopcji, aby zignorować te:
if [ -z "$(git status --untracked-files=no --porcelain)" ]; then
# Working directory clean excluding untracked files
else
# Uncommitted changes in tracked files
fi
Aby uczynić to bardziej odpornym na warunki, które faktycznie powodują git statusawarię bez wyjścia stdout, możemy zawęzić sprawdzenie, aby:
if output=$(git status --porcelain) && [ -z "$output" ]; then
# Working directory clean
else
# Uncommitted changes
fi
Warto również zauważyć, że chociaż git statusnie podaje sensownego kodu wyjścia, gdy katalog roboczy jest nieczysty, git diffudostępnia --exit-codeopcję, która sprawia, że zachowuje się on podobnie do narzędzia diff , to znaczy wychodzenia ze statusem, 1gdy były różnice i 0kiedy nie znaleziono żadnego.
Korzystając z tego, możemy sprawdzić zmiany niestacjonarne za pomocą:
git diff --exit-code
i wprowadził zmiany, ale nie zatwierdził zmian w:
git diff --cached --exit-code
Chociaż git diffmoż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 --porcelainto prawdopodobnie najlepszy wybór.