UPDATE : Das OP Daniel Stutzbach weist in den Kommentaren darauf hin, dass dieser einfache Befehl git diff-indexfür ihn funktioniert hat:
git update-index --refresh
git diff-index --quiet HEAD --
( nornagon erwähnt in den Kommentaren, dass Sie, wenn Dateien berührt wurden, deren Inhalt jedoch mit denen im Index übereinstimmt , git update-index --refreshzuvor ausgeführt werden müssen git diff-index, andernfalls diff-indexwird 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:
git diff-index --quiet HEAD -- || echo "untracked"; // do something about it
Hinweis: wie von Anthony Sottile kommentiert
git diff-index HEAD ...schlägt in einem Zweig fehl, der keine Commits hat (z. B. in einem neu initialisierten Repository).
Eine Problemumgehung, die ich gefunden habe, istgit diff-index $(git write-tree) ...
Und haridsvweist in den Kommentaren darauf hin, dass git diff-fileseine neue Datei diese nicht als Unterschied erkennt.
Der sicherere Ansatz scheint darin zu bestehen, zuerst git adddie Dateispezifikation auszuführen und dann git diff-indexzu prüfen, ob dem Index vor dem Ausführen etwas hinzugefügt wurde git commit.
git add ${file_args} && \
git diff-index --cached --quiet HEAD || git commit -m '${commit_msg}'
Und 6502 Berichte in den Kommentaren:
Ein Problem, auf das ich gestoßen bin, ist, git diff-indexdass es Unterschiede gibt, wenn es tatsächlich keine gibt, außer Zeitstempeln der Dateien.
Das git diffeinmalige Ausführen löst das Problem (überraschenderweise git diffändert sich tatsächlich der Inhalt der Sandbox, was hier bedeutet .git/index)
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_treeFunktion " inspirieren lassen, die gerade geschrieben wird ;) (Anfang Oktober 2010)
require_clean_work_tree () {
# Update the index
git update-index -q --ignore-submodules --refresh
err=0
# Disallow unstaged changes in the working tree
if ! git diff-files --quiet --ignore-submodules --
then
echo >&2 "cannot $1: you have unstaged changes."
git diff-files --name-status -r --ignore-submodules -- >&2
err=1
fi
# Disallow uncommitted changes in the index
if ! git diff-index --cached --quiet HEAD --ignore-submodules --
then
echo >&2 "cannot $1: your index contains uncommitted changes."
git diff-index --cached --name-status -r --ignore-submodules HEAD -- >&2
err=1
fi
if [ $err = 1 ]
then
echo >&2 "Please commit or stash them."
exit 1
fi
}