Das Parsen der Ausgabe von git status
ist eine schlechte Idee, da die Ausgabe für den Menschen lesbar und nicht maschinenlesbar sein soll. Es gibt keine Garantie dafür, dass die Ausgabe in zukünftigen Versionen von Git oder in anders konfigurierten Umgebungen gleich bleibt.
UVVs Kommentar ist auf dem richtigen Weg, aber leider git status
ändert sich der Rückkehrcode von nicht, wenn nicht festgeschriebene Änderungen vorliegen. Es bietet jedoch die --porcelain
Option, dass die Ausgabe git status --porcelain
in einem leicht zu analysierenden Format für Skripte formatiert wird und in allen Git-Versionen und unabhängig von der Benutzerkonfiguration stabil bleibt.
Wir können die leere Ausgabe von git status --porcelain
als Indikator dafür verwenden, dass keine Änderungen festgeschrieben werden müssen:
if [ -z "$(git status --porcelain)" ]; then
# Working directory clean
else
# Uncommitted changes
fi
Wenn uns nicht verfolgte Dateien im Arbeitsverzeichnis egal sind, können wir diese mit der --untracked-files=no
Option ignorieren:
if [ -z "$(git status --untracked-files=no --porcelain)" ]; then
# Working directory clean excluding untracked files
else
# Uncommitted changes in tracked files
fi
Um dies robuste gegenüber Bedingungen , die tatsächlich dazu führen , git status
zum Scheitern verurteilt , ohne Ausgang stdout
, können wir den Scheck verfeinern:
if output=$(git status --porcelain) && [ -z "$output" ]; then
# Working directory clean
else
# Uncommitted changes
fi
Es ist auch erwähnenswert, dass, obwohl git status
es keinen aussagekräftigen Exit-Code gibt, wenn das Arbeitsverzeichnis unsauber ist, git diff
die --exit-code
Option zur Verfügung steht, mit der es sich ähnlich wie das Dienstprogramm diff verhält , dh mit dem Status beendet wird, 1
wenn es Unterschiede gab und 0
wenn keine gefunden wurden.
Auf diese Weise können wir nach nicht bereitgestellten Änderungen suchen:
git diff --exit-code
und inszenierte, aber nicht festgeschriebene Änderungen mit:
git diff --cached --exit-code
Obwohl git diff
nicht verfolgte Dateien in Submodulen über entsprechende Argumente an gemeldet werden können --ignore-submodules
, scheint es leider keine Möglichkeit zu geben, nicht verfolgte Dateien im tatsächlichen Arbeitsverzeichnis zu melden. Wenn nicht verfolgte Dateien im Arbeitsverzeichnis relevant sind, git status --porcelain
ist dies wahrscheinlich die beste Wahl.