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
}