UPDATE : ВП Daniel Stutzbach вказує в коментарях , що ця проста команда git diff-indexпрацювала для нього:
git update-index --refresh
git diff-index --quiet HEAD --
( Nornagon згадує в коментарях , що, якщо є файли , які були порушені, але зміст яких такого ж , як в індексі, вам потрібно запустити git update-index --refreshдо того git diff-index, інакше diff-indexбуде неправильно повідомляти про те , що дерево забруднено)
Потім ви можете побачити " Як перевірити, чи вдала команда? ", Якщо ви використовуєте її в скрипті bash:
git diff-index --quiet HEAD -- || echo "untracked"; // do something about it
Примітка: в якості коментував від Ентоні Sottile
git diff-index HEAD ...не вдасться до гілки, яка не має комісій (наприклад, щойно ініціалізований сховище).
Я знайшов одне вирішенняgit diff-index $(git write-tree) ...
А haridsvточки з коментарів , що git diff-filesна новому файлі не визначає його як дифф.
Більш безпечним підходом здається, що спочатку запустіть git addфайл-специфікацію, а потім застосуйте, git diff-indexщоб побачити, чи щось додано до індексу перед запуском git commit.
git add ${file_args} && \
git diff-index --cached --quiet HEAD || git commit -m '${commit_msg}'
І 6502 повідомлень у коментарях:
Одна з проблем, на яку я зіткнувся, полягає в тому, що я git diff-indexскажу, що існують відмінності, коли насправді таких немає, крім часових позначок файлів.
Запуск git diffодного разу вирішує проблему (на диво, git diffале насправді змінює вміст пісочниці, маючи на увазі тут .git/index)
Ці проблеми із часовою міткою також можуть виникнути, якщо git працює в docker .
Оригінальна відповідь:
"Програмно" означає, що ніколи не покладайтеся на порцелянові команди .
Завжди покладайтеся на сантехнічні команди .
Дивіться також " Перевірка на наявність забрудненого індексу або непотреблених файлів за допомогою Git " щодо альтернатив (наприклад git status --porcelain)
Ви можете взяти натхнення у нової " require_clean_work_treeфункції ", написаної в процесі розмови ;) (початок жовтня 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
}