In einem Makefile möchte ich bestimmte Aktionen ausführen, wenn nicht festgeschriebene Änderungen vorliegen (entweder im Arbeitsbaum oder im Index). Was ist der sauberste und effizienteste Weg, dies zu tun? Ein Befehl, der in einem Fall mit einem Rückgabewert von Null und in dem anderen von einem Wert ungleich Null beendet wird, würde meinen Zwecken entsprechen.
Ich kann git status
den Ausgang durchlaufen lassen grep
, aber ich denke, es muss einen besseren Weg geben.
Antworten:
UPDATE : Das OP Daniel Stutzbach weist in den Kommentaren darauf hin, dass dieser einfache Befehl
git diff-index
für ihn funktioniert hat:( nornagon erwähnt in den Kommentaren, dass Sie, wenn Dateien berührt wurden, deren Inhalt jedoch mit denen im Index übereinstimmt ,
git update-index --refresh
zuvor ausgeführt werden müssengit diff-index
, andernfallsdiff-index
wird fälschlicherweise gemeldet, dass der Baum verschmutzt ist.)Sie können dann sehen, wie Sie überprüfen, ob ein Befehl erfolgreich war, wenn Sie ihn in einem Bash-Skript verwenden:
Hinweis: wie von Anthony Sottile kommentiert
Und
haridsv
weist in den Kommentaren darauf hin, dassgit diff-files
eine neue Datei diese nicht als Unterschied erkennt.Der sicherere Ansatz scheint darin zu bestehen, zuerst
git add
die Dateispezifikation auszuführen und danngit diff-index
zu prüfen, ob dem Index vor dem Ausführen etwas hinzugefügt wurdegit commit
.Und 6502 Berichte in den Kommentaren:
Diese Zeitstempelprobleme können auch auftreten, wenn git im Docker ausgeführt wird .
Ursprüngliche Antwort:
"Programmatisch" bedeutet, sich niemals auf Porzellanbefehle zu verlassen .
Verlassen Sie sich immer auf Installationsbefehle .
Siehe auch " Suchen nach einem schmutzigen Index oder nicht verfolgten Dateien mit Git " für Alternativen (wie
git status --porcelain
)Sie können sich von der neuen "
require_clean_work_tree
Funktion " inspirieren lassen, die gerade geschrieben wird ;) (Anfang Oktober 2010)quelle
git diff-index --quiet HEAD
.HEAD
im Arbeitsverzeichnis haben. Besser nutzengit diff-index --quiet HEAD --
.git status --help
: --porcelain Geben Sie die Ausgabe in einem einfach zu analysierenden Format für Skripte an. Dies ähnelt der kurzen Ausgabe, bleibt jedoch in allen Git-Versionen und unabhängig von der Benutzerkonfiguration stabil. Siehe unten für Details.Während die anderen Lösungen sehr gründlich sind, versuchen Sie Folgendes, wenn Sie etwas wirklich schnelles und schmutziges wollen:
Es wird nur geprüft, ob die Statusübersicht eine Ausgabe enthält.
quelle
[[ ... ]]
Syntax tatsächlich tut? Ich habe so etwas noch nie gesehen.git status
wird in diesem Test tatsächlich ignoriert. Es wird nur die Ausgabe betrachtet. Schauen Sie sich diese bash ähnliche Seite für weitere Informationen auf[
,[[
und wie funktioniert in der Bash testen.--porcelain
Parameter wie hiergit status -s -uall
Dateien einschließen.git diff --exit-code
gibt bei Änderungen ungleich Null zurück;git diff --quiet
ist das gleiche ohne Ausgabe. Verwenden Sie, da Sie nach dem Arbeitsbaum und dem Index suchen möchtenOder
Entweder wird man Ihnen sagen, ob es nicht festgeschriebene Änderungen gibt, die bereitgestellt werden oder nicht.
quelle
git diff --quite HEAD
zeigt nur an, ob der Arbeitsbaum sauber ist, nicht, ob der Index sauber ist. Wenn beispielsweisefile
zwischen HEAD ~ und HEAD geändert wurde, wird danachgit reset HEAD~ -- file
immer noch 0 beendet, obwohl im Index abgestufte Änderungen vorhanden sind (wt == HEAD, aber index! = HEAD).git diff --quiet && git diff --cached --quiet
.Erweiterung der Antwort von @ Nepthar:
quelle
$(git status -s "$file")
und dann in derelse
Klauselgit add "$file"; git commit -m "your autocommit process" "$file"
git status -s
eingit status --porcelain ; git clean -nd
stattdessen wird Junk - Verzeichnisse auch hier aufgetaucht, die unsichtbar sindgit status
.Wie in einer anderen Antwort erwähnt, ist ein so einfacher Befehl ausreichend:
Wenn Sie die letzten beiden Striche weglassen, schlägt der Befehl fehl, wenn Sie eine Datei mit dem Namen haben
HEAD
.Beispiel:
Achtung: Dieser Befehl ignoriert nicht verfolgte Dateien.
quelle
git add
undgit clean
zur RettungIch habe einige praktische Git-Aliase erstellt, um nicht bereitgestellte und bereitgestellte Dateien aufzulisten:
Dann können Sie ganz einfach Dinge tun wie:
Sie können es besser lesbar machen, indem Sie irgendwo auf Ihrem
PATH
Aufruf ein Skript erstellengit-has
:Nun können die obigen Beispiele vereinfacht werden zu:
Der Vollständigkeit halber sind hier ähnliche Aliase für nicht verfolgte und ignorierte Dateien aufgeführt:
quelle
Mit Python und dem GitPython-Paket:
Gibt True zurück, wenn das Repository nicht sauber ist
quelle
LOGLEVEL=DEBUG
, sehen Sie alle Popen-Befehle, mit denen es ausgeführt wirdgit diff
Hier ist der beste und sauberste Weg.
quelle
git status
ist ein 'Porzellan'-Befehl. Verwenden Sie keine Porzellanbefehle in Skripten, da diese zwischen Git-Versionen wechseln können. Verwenden Sie stattdessen 'Sanitär'-Befehle.git status --porcelain
(was für diesen Zweck gedacht ist - ein stabiles Format, das Sie in einem Skript analysieren können), möglicherweise auch mit -z (nulltrennend anstelle von Zeilenumbruch?), Könnten Sie mit dieser Idee etwas Nützliches tun . @ codyc4321 siehe stackoverflow.com/questions/6976473/… für Details