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ściowe git 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:
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=no
opcji, 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 status
awarię 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 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 i 0
kiedy 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 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.