Der Schlüssel zum zuverlässigen "Scripting" von Git liegt in der Verwendung der "Plumbing" -Befehle.
Die Entwickler achten beim Ändern der Installationsbefehle darauf, dass sie sehr stabile Schnittstellen bereitstellen (dh eine bestimmte Kombination aus Repository-Status, Standard, Befehlszeilenoptionen, Argumenten usw. erzeugt in allen Git-Versionen dieselbe Ausgabe, in denen der Befehl / Option existiert). Neue Ausgabevarianten in Installationsbefehlen können über neue Optionen eingeführt werden, dies kann jedoch keine Probleme für Programme mit sich bringen, die bereits für ältere Versionen geschrieben wurden (sie würden die neuen Optionen nicht verwenden, da sie nicht vorhanden waren (oder zumindest waren) nicht verwendet) zum Zeitpunkt der Erstellung des Skripts).
Leider sind die "alltäglichen" Git-Befehle die "Porzellan" -Befehle, so dass die meisten Git-Benutzer möglicherweise nicht mit den Installationsbefehlen vertraut sind. Die Unterscheidung zwischen Porzellan und Sanitärbefehl wird in der Haupt- Git-Manpage vorgenommen (siehe Unterabschnitte mit dem Titel Befehle auf hoher Ebene (Porzellan) und Befehle auf niedriger Ebene (Sanitär) .
Um sich über nicht genehmigte Änderungen zu informieren, müssen Sie wahrscheinlich git diff-index
(Index (und möglicherweise verfolgte Teile des Arbeitsbaums) mit einem anderen Baum vergleichen (z. B. HEAD
)), möglicherweise git diff-files
(Arbeitsbaum mit Index vergleichen) und möglicherweise git ls-files
( Listendateien ; z. B. Liste nicht verfolgt) , nicht signierte Dateien).
(Beachten Sie, dass in den folgenden Befehlen HEAD --
anstelle von verwendet wird, HEAD
da sonst der Befehl fehlschlägt, wenn eine Datei mit dem Namen vorhanden ist HEAD
.)
Verwenden Sie Folgendes, um zu überprüfen, ob ein Repository Änderungen vorgenommen hat (noch nicht festgeschrieben):
git diff-index --quiet --cached HEAD --
- Wenn es mit beendet
0
wird, gab es keine Unterschiede ( 1
bedeutet, dass es Unterschiede gab).
So überprüfen Sie, ob ein Arbeitsbaum Änderungen enthält, die bereitgestellt werden könnten:
git diff-files --quiet
- Der Exit-Code ist der gleiche wie für
git diff-index
( 0
== keine Unterschiede; 1
== Unterschiede).
So überprüfen Sie, ob sich die Kombination aus Index und nachverfolgten Dateien im Arbeitsbaum in Bezug auf Folgendes geändert hat HEAD
:
git diff-index --quiet HEAD --
- Dies ist wie eine Kombination der beiden vorherigen. Ein Hauptunterschied besteht darin, dass immer noch "keine Unterschiede" gemeldet werden, wenn Sie eine abgestufte Änderung haben, die Sie im Arbeitsbaum "rückgängig gemacht" haben (zurück zu den Inhalten, die sich in befinden
HEAD
). In derselben Situation würden die beiden separaten Befehle Berichte über "vorhandene Unterschiede" zurückgeben.
Sie haben auch nicht verfolgte Dateien erwähnt. Sie meinen möglicherweise "nicht verfolgt und nicht signiert", oder Sie meinen einfach "nicht verfolgt" (einschließlich ignorierter Dateien). In jedem Fall git ls-files
ist das Werkzeug für den Job:
Für "nicht verfolgt" (enthält ignorierte Dateien, falls vorhanden):
git ls-files --others
Für "nicht verfolgt und nicht signiert":
git ls-files --exclude-standard --others
Mein erster Gedanke ist, nur zu überprüfen, ob diese Befehle ausgegeben wurden:
test -z "$(git ls-files --others)"
- Wenn es mit beendet
0
wird, gibt es keine nicht verfolgten Dateien. Wenn es mit beendet 1
wird, gibt es nicht verfolgte Dateien.
Es besteht eine geringe Wahrscheinlichkeit, dass dadurch abnormale Exits git ls-files
in Berichte "Keine nicht verfolgten Dateien" übersetzt werden (beide führen zu Exits ungleich Null des obigen Befehls). Eine etwas robustere Version könnte folgendermaßen aussehen:
u="$(git ls-files --others)" && test -z "$u"
- Die Idee ist dieselbe wie beim vorherigen Befehl, ermöglicht jedoch die
git ls-files
Ausbreitung unerwarteter Fehler . In diesem Fall kann ein Exit ungleich Null bedeuten, dass nicht verfolgte Dateien vorhanden sind, oder dass ein Fehler aufgetreten ist. Wenn Sie stattdessen die Ergebnisse "Fehler" mit dem Ergebnis "Keine nicht verfolgten Dateien" kombinieren möchten, verwenden Sie test -n "$u"
(wobei exit von 0
"einige nicht verfolgte Dateien" bedeutet und ungleich Null Fehler oder "keine nicht verfolgten Dateien" bedeutet).
Eine andere Idee besteht darin --error-unmatch
, einen Exit ungleich Null zu verursachen, wenn keine nicht verfolgten Dateien vorhanden sind. Dies birgt auch das Risiko, dass "keine nicht verfolgten Dateien" (Beenden 1
) mit "Ein Fehler ist aufgetreten" (Beenden ungleich Null, aber wahrscheinlich 128
) zusammengeführt werden. Die Überprüfung auf Exit-Codes von 0
vs. 1
vs. ungleich Null ist jedoch wahrscheinlich ziemlich robust:
git ls-files --others --error-unmatch . >/dev/null 2>&1; ec=$?
if test "$ec" = 0; then
echo some untracked files
elif test "$ec" = 1; then
echo no untracked files
else
echo error from ls-files
fi
Jedes der oben genannten git ls-files
Beispiele kann verwendet werden, --exclude-standard
wenn Sie nur nicht verfolgte und nicht signierte Dateien berücksichtigen möchten.