Ziel ist es, einen eindeutigen Status zu erhalten, der in einem Shell-Befehl ausgewertet werden kann.
Ich habe es versucht, git status
aber es gibt immer 0 zurück, auch wenn Elemente festgeschrieben werden müssen.
git status
echo $? #this is always 0
Ich habe eine Idee, aber ich denke, es ist eher eine schlechte Idee.
if [ git status | grep -i -c "[a-z]"> 2 ];
then
code for change...
else
code for nothing change...
fi
auf andere Weise?
Update mit folgender Lösung, siehe Mark Longairs Beitrag
Ich habe es versucht, aber es verursacht ein Problem.
if [ -z $(git status --porcelain) ];
then
echo "IT IS CLEAN"
else
echo "PLEASE COMMIT YOUR CHANGE FIRST!!!"
echo git status
fi
Ich erhalte den folgenden Fehler [: ??: binary operator expected
Jetzt schaue ich den Mann an und probiere den Git Diff aus.
=================== Code für meine Hoffnung und hoffentlich bessere Antwort ======================
#if [ `git status | grep -i -c "$"` -lt 3 ];
# change to below code,although the above code is simple, but I think it is not strict logical
if [ `git diff --cached --exit-code HEAD^ > /dev/null && (git ls-files --other --exclude-standard --directory | grep -c -v '/$')` ];
then
echo "PLEASE COMMIT YOUR CHANGE FIRST!!!"
exit 1
else
exit 0
fi
git
git-status
9nix00
quelle
quelle
$(git status --porcelain)
. Wenn Sie Ausrufezeichen in Ihre Nachricht einfügen möchten, müssen Sie einfache Anführungszeichen anstelle von doppelten Anführungszeichen verwenden - dh es sollteecho 'PLEASE COMMIT YOUR CHANGE FIRST!!!'
stattdessen sein$(git status --porcelain)
, so wie ich es Ihnen gesagt habe!Antworten:
Eine Alternative zum Testen, ob die Ausgabe von
git status --porcelain
leer ist, besteht darin, jede Bedingung, die Sie interessiert, separat zu testen. Es ist beispielsweise nicht immer wichtig, ob die Ausgabe von nicht verfolgte Dateien enthältgit status
.Um beispielsweise festzustellen, ob lokale nicht bereitgestellte Änderungen vorliegen, können Sie den Rückkehrcode von:
Um zu überprüfen, ob Änderungen bereitgestellt, aber nicht festgeschrieben wurden, können Sie den Rückkehrcode verwenden:
Wenn Sie wissen möchten, ob sich in Ihrem Arbeitsbaum nicht verfolgte Dateien befinden, die nicht ignoriert werden, können Sie testen, ob die Ausgabe des folgenden Befehls leer ist:
Update: Sie fragen unten, ob Sie diesen Befehl ändern können, um die Verzeichnisse in der Ausgabe auszuschließen. Sie können leere Verzeichnisse durch Hinzufügen ausschließen
--no-empty-directory
, aber um alle Verzeichnisse in dieser Ausgabe auszuschließen, müssen Sie die Ausgabe filtern, z. B.:Das
-v
toegrep
bedeutet, nur Zeilen auszugeben, die nicht mit dem Muster übereinstimmen, und das Muster stimmt mit jeder Zeile überein, die mit a endet/
.quelle
--quiet
(was impliziert--exit-code
) bringt auch die Ausgabe zum Schweigen, für diejenigen, die nur den Exit-Code wollen.Der Rückgabewert von gibt
git status
nur den Exit-Code von angit status
, nicht, ob Änderungen festgeschrieben werden müssen.Wenn Sie eine computerlesbarere Version der
git status
Ausgabe wünschen , versuchen Sie esgit status
Weitere Informationen hierzu finden Sie in der Beschreibung von .Beispielverwendung (Skript testet einfach, ob
git status --porcelain
eine Ausgabe vorliegt, keine Analyse erforderlich):Bitte beachten Sie, dass Sie die zu testende Zeichenfolge angeben müssen, dh die Ausgabe von
git status --porcelain
. Weitere Hinweise zu Testkonstrukten finden Sie im Advanced Bash Scripting Guide (Abschnitt Zeichenfolgenvergleich ).quelle
|| echo no
die Befehlsersetzung anhängen , damit der Arbeitsbereich nicht fälschlicherweise als sauber gemeldet wird, wenn ergit status
grundlegend fehlschlägt. Außerdem ist Ihr Code (lobenswerterweise) POSIX-kompatibel. Da Sie jedoch einen Link zu einem Bash-Handbuch erstellen , möchte ich hinzufügen, dass Sie die Befehlsersetzung nicht doppelt zitieren müssen , wenn Sie Bashs[[ ... ]]
anstelle von POSIX-kompatibel verwenden[ ... ]
schadet nicht) :[[ -z $(git status --porcelain) ]]
.Wenn Sie wie ich sind, möchten Sie wissen, ob es:
1) Änderungen an vorhandenen Dateien 2) neu hinzugefügte Dateien 3) gelöschte Dateien
und insbesondere nicht über 4) nicht verfolgte Dateien wissen wollen.
Dies sollte es tun:
Hier ist mein Bash-Code zum Beenden des Skripts, wenn das Repo sauber ist. Es wird die Kurzversion der Option für nicht verfolgte Dateien verwendet:
quelle
—untracked-files=no
; Ich denke, Ihr Test kann vereinfacht werden[[ -z $(git status --untracked-files=no --porcelain) ]]
.git status
sollte nicht auf stderr schreiben, es sei denn , etwas Grundsätzliches schief geht - und dann Sie tun wollen , dass Ausgabe zu sehen. (Wenn Sie in diesem Fall ein robusteres Verhalten wünschen, hängen Sie es|| echo no
an die Befehlsersetzung an, damit der Test auf Sauberkeit immer noch fehlschlägt.)-z
Zeichenfolgenvergleiche / Der Operator kann mit mehrzeiligen Zeichenfolgen umgehen - keine Notwendigkeittail
.[[ -z $(git status -u no --porcelain) ]]
[[ -z $(git status -uno --porcelain) ]]
Es ist möglich,
git status --porcelain
mit einem einfachengrep
Test durchzuführen.Ich benutze dies manchmal als einfachen Einzeiler:
Fügen Sie
-qs
Ihren grep-Befehl hinzu, um ihn stumm zu schalten.quelle
git status
Sollte ein tödlicher Fehler auftreten (z. B. ein beschädigtes Repo), meldet Ihr Test fälschlicherweise einen sauberen Arbeitsbereich. Eine Option ist die Verwendunggit status --porcelain 2>&1
, aber das würde die Fehlermeldung "auffressen", wenn Sie grep mit verwenden-q
. (Mit dem Umgang verlöre die Eleganz:(git status --porcelain || echo err) | grep -q .
)test -z "$(git status --porcelain)" || git pull origin master
Aus dem Git-Quellcode gibt es ein sh-Skript, das Folgendes enthält.
Dieses Sniplet zeigt, wie es verwendet werden kann
git diff-files
undgit diff-index
ob Änderungen an zuvor bekannten Dateien vorgenommen wurden. Sie können jedoch nicht herausfinden, ob dem Arbeitsbaum eine neue unbekannte Datei hinzugefügt wurde.quelle
if [ -n "$(git ls-files --others --exclude-standard)" ]
ohne zusätzliche Piping oder Greping sollte ausreichen, um nicht verfolgte Dateien zu erkennen.Ich würde einen Test dazu machen:
oder dies um explizit zu sein:
wo:
--exit-code
Beenden Sie das Programm mit Codes ähnlich wie bei diff (1). Das heißt, es wird mit 1 beendet, wenn es Unterschiede gab, und 0 bedeutet keine Unterschiede.
--ruhig
Deaktivieren Sie alle Ausgaben des Programms. Impliziert --exit-Code
quelle
Ich bin etwas spät in der Diskussion, aber wenn Sie nur einen Exit-Code von 0 benötigen, wenn
git status --porcelain
nichts zurückgegeben wird und! = 0, versuchen Sie Folgendes:Dadurch wird die Anzahl der Zeilen zum Exit-Code. Bei mehr als 255 Zeilen besteht die Gefahr von Problemen. So
wird das erklären;)
quelle
Ich benutze dies in einem Skript, um:
1, wenn es diff oder nicht verfolgte Dateien gibt
[-z "$ (Git-Status - Porzellan)"]
quelle
if ! git diff --quiet; then
ist sauberer und performanter (denke ich). Mit anderen Worten, verwenden Sie den Exit-Code, nicht den Standard-Code.git diff --quiet
verhält sich anders alsgit status --porcelain
bei zwischengespeicherten Änderungen.Nicht schön, funktioniert aber:
Sie sind sich nicht sicher, ob die Nachricht vom Gebietsschema abhängig ist
LANG=C
.quelle