Ich habe ein Skript, das rsync
mit einem Git-Arbeitsverzeichnis als Ziel ausgeführt wird. Ich möchte, dass das Skript ein anderes Verhalten aufweist, je nachdem, ob das Arbeitsverzeichnis sauber ist (keine Änderungen zum Festschreiben) oder nicht. Wenn zum Beispiel die Ausgabe von wie git status
folgt ist, möchte ich, dass das Skript beendet wird:
git status
Already up-to-date.
# On branch master
nothing to commit (working directory clean)
Everything up-to-date
Wenn das Verzeichnis nicht sauber ist, möchte ich, dass es weitere Befehle ausführt.
Wie kann ich in einem Shell-Skript nach Ausgaben wie den oben genannten suchen?
shell-script
git
brentwpeterson
quelle
quelle
git reset --hard origin/branch
wenn Sie das wollen ... zum Beispiel, wenn Sie versuchen, nach dem Kompilieren von etwas usw.Antworten:
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 Ausgabegit 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:Wenn uns nicht verfolgte Dateien im Arbeitsverzeichnis egal sind, können wir diese mit der
--untracked-files=no
Option ignorieren:Um dies robuste gegenüber Bedingungen , die tatsächlich dazu führen ,
git status
zum Scheitern verurteilt , ohne Ausgangstdout
, können wir den Scheck verfeinern: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 und0
wenn keine gefunden wurden.Auf diese Weise können wir nach nicht bereitgestellten Änderungen suchen:
und inszenierte, aber nicht festgeschriebene Änderungen mit:
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.quelle
git status --porcelain
wird mit Code 0 beendet, auch wenn Änderungen für festgeschriebene und nicht überwachte Dateien nicht gespeichert wurden.git stash
etwas unternommen werden soll (es wird kein nützlicher Rückkehrcode ausgegeben). Ich musste hinzufügen,--ignore-submodules
da sonstgit status
Submoduländerungen angezeigt würden, diegit stash
ignoriert werden.if [ -z
ich nachgesehen, was passiert ist. Das-z
bedeutet, wenn die folgende Zeichenfolge leer ist, wird das if zu ausgewertettrue
. Mit anderen Worten, wenn diesgit status --porcelain
zu keiner Zeichenfolge führt, ist das Repo sauber. Wenn nicht, werden die geänderten / hinzugefügten / entfernten Dateien aufgelistet und es handelt sich nicht mehr um eine leere Zeichenfolge. Derif
wertet dann auffalse
.Verwenden:
Der Rückkehrcode gibt den Status des Arbeitsverzeichnisses wieder (0 = sauber, 1 = schmutzig). Nicht überwachte Dateien werden ignoriert.
quelle
git update-index --refresh
vorgit diff-index HEAD
. Weitere Informationen: stackoverflow.com/q/34807971/1407170git add .
bevor ich sie ausstelle. Normalerweise wird es in einem Skript so verwendetset +e
vor dem Aufruf von tungit
undset -e
nach der Auswertung erneut hinzufügen$?
.Geringfügige Erweiterung von André's exzellenter Antwort .
Dies ist eine Möglichkeit, die Ergebnisse auszuwerten und auch eine Falle zu vermeiden, wenn Sie sich in einem Skript befinden, das zuvor set -e ausgegeben hat .
Nicht überwachte Dateien werden ignoriert.
quelle