Das Parsen der Ausgabe von git statusist 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 --porcelainOption, dass die Ausgabe git status --porcelainin 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 --porcelainals 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=noOption 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 statuszum 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 statuses keinen aussagekräftigen Exit-Code gibt, wenn das Arbeitsverzeichnis unsauber ist, git diffdie --exit-codeOption zur Verfügung steht, mit der es sich ähnlich wie das Dienstprogramm diff verhält , dh mit dem Status beendet wird, 1wenn es Unterschiede gab und 0wenn 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 diffnicht 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 --porcelainist dies wahrscheinlich die beste Wahl.