AKTUALIZACJA : OP Daniel Stutzbach wskazuje w komentarzach, że to proste polecenie git diff-indexdziałało dla niego:
git update-index --refresh
git diff-index --quiet HEAD --
( nornagon wspomina w komentarzach, że jeśli istnieją pliki, które zostały dotknięte, ale których zawartość jest taka sama jak w indeksie, musisz uruchomić git update-index --refreshwcześniej git diff-index, w przeciwnym razie diff-indexniepoprawnie zgłosi, że drzewo jest brudne)
Następnie możesz zobaczyć „ Jak sprawdzić, czy polecenie się powiodło? ”, Jeśli używasz go w skrypcie bash:
git diff-index --quiet HEAD -- || echo "untracked"; // do something about it
Uwaga: jak skomentował przez Anthony Sottile
git diff-index HEAD ...zawiedzie w gałęzi, która nie ma zatwierdzeń (takich jak nowo zainicjowane repozytorium).
Znalazłem jedno obejściegit diff-index $(git write-tree) ...
I haridsvzwraca uwagę, w komentarzach , że git diff-filesna nowym pliku nie wykrywa go jako diff.
Wydaje się, że bezpieczniejszym rozwiązaniem jest git addnajpierw uruchomienie specyfikacji pliku, a następnie git diff-indexsprawdzenie, czy przed uruchomieniem coś zostało dodane do indeksu git commit.
git add ${file_args} && \
git diff-index --cached --quiet HEAD || git commit -m '${commit_msg}'
I 6502 raportów w komentarzach:
Jednym z problemów, na które wpadłem, jest to, że git diff-indexbędą istniały różnice, a tak naprawdę nie ma żadnych, z wyjątkiem znaczników czasu plików.
Uruchomienie git diffraz rozwiązuje problem (co zaskakujące, w git diffrzeczywistości zmienia zawartość piaskownicy, co oznacza tutaj .git/index)
Te problemy ze znacznikami czasu mogą również wystąpić, jeśli git działa w oknie dokowanym .
Oryginalna odpowiedź:
„Programowo” oznacza, że nigdy nie należy polegać na porcelanowych poleceniach .
Zawsze polegaj na poleceniach hydraulicznych .
Zobacz także „ Sprawdzanie brudnego indeksu lub nieśledzonych plików za pomocą Git ”, aby znaleźć alternatywne rozwiązania (np. git status --porcelain)
Możesz czerpać inspirację z nowej „ require_clean_work_treefunkcji ”, która jest napisana w trakcie rozmowy ;) (początek października 2010 r.)
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
}