UPDATE : Das OP Daniel Stutzbach weist in den Kommentaren darauf hin, dass dieser einfache Befehl git diff-index
fü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 --refresh
zuvor ausgeführt werden müssen git diff-index
, andernfalls diff-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:
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 haridsv
weist in den Kommentaren darauf hin, dass git 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 dann git diff-index
zu 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-index
dass es Unterschiede gibt, wenn es tatsächlich keine gibt, außer Zeitstempeln der Dateien.
Das git diff
einmalige 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_tree
Funktion " 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
}