В Makefile я хотел бы выполнить определенные действия, если есть незафиксированные изменения (либо в рабочем дереве, либо в индексе). Какой самый чистый и эффективный способ сделать это? Команда, которая завершается с возвращаемым значением, равным нулю в одном случае и ненулевым значением в другом, подойдет моим целям.
Я могу запустить git status
и grep
передать результаты , но я чувствую, что должен быть лучший способ.
Ответы:
ОБНОВЛЕНИЕ : ОП Даниэль Штутцбах отмечает в комментариях, что эта простая команда
git diff-index
работала для него:( Норнагон упоминает в комментариях, что, если есть файлы, к которым было произведено прикосновение, но содержимое которых такое же, как в индексе, вам нужно будет выполнить их
git update-index --refresh
раньшеgit diff-index
, иначеdiff-index
будет неверно сообщено, что дерево загрязнено)Затем вы можете увидеть « Как проверить, успешно ли выполнена команда? », Если вы используете ее в скрипте bash:
Примечание: в качестве комментировал от Энтони Sottile
А
haridsv
точки из в комментариях , чтоgit diff-files
на новом файле не определяет его как дифф.Кажется, что более безопасный подход -
git add
сначала запустить спецификацию файла, а затем использовать,git diff-index
чтобы увидеть, было ли что-либо добавлено в индекс перед запускомgit commit
.И 6502 сообщения в комментариях:
Эти проблемы с отметками времени также могут возникать, если git работает в Docker .
Оригинальный ответ:
«Программно» означает никогда не полагаться на фарфоровые команды .
Всегда полагайтесь на сантехнические команды .
См. Также « Проверка на наличие грязного индекса или неотслеживаемых файлов с помощью Git » для альтернатив (например
git status --porcelain
)Вы можете черпать вдохновение из новой «
require_clean_work_tree
функции », которая написана так, как мы говорим ;) (начало октября 2010 года)источник
git diff-index --quiet HEAD
.HEAD
в рабочем каталоге. Лучше использоватьgit diff-index --quiet HEAD --
.git status --help
состояниях: --porcelain Предоставляет вывод в простом для анализа формате для сценариев. Это похоже на короткий вывод, но останется стабильным во всех версиях Git и независимо от конфигурации пользователя. Смотрите ниже для деталей.Хотя другие решения очень основательны, если вы хотите что-то действительно быстрое и грязное, попробуйте что-то вроде этого:
Он просто проверяет, есть ли какие-либо выходные данные в сводке состояния.
источник
[[ ... ]]
самом деле делает синтаксис? Я никогда не видел ничего подобного раньше.git status
фактически игнорируется в этом тесте. Это только смотрит на вывод. Посетите эту страницу, связанную с bash, для получения дополнительной информации о том[
,[[
как работает тестирование в bash.--porcelain
параметр, как показано здесьgit status -s -uall
для включения неотслеживаемых файлов.git diff --exit-code
вернет ненулевое значение, если будут какие-либо изменения;git diff --quiet
то же самое без выхода. Поскольку вы хотите проверить рабочее дерево и индекс, используйтеИли
Любой из них скажет вам, есть ли незавершенные изменения, которые поставлены или нет.
источник
git diff --quite HEAD
только скажет вам, чистое ли рабочее дерево, а не чистый ли индекс. Например, еслиfile
было изменено значение между HEAD ~ и HEAD, то послеgit reset HEAD~ -- file
этого он все равно выйдет 0, даже если в индексе имеются поэтапные изменения (wt == HEAD, но index! = HEAD).git diff --quiet && git diff --cached --quiet
.Расширяя ответ @ Nepthar:
источник
$(git status -s "$file")
else
git add "$file"; git commit -m "your autocommit process" "$file"
git status -s
этоgit status --porcelain ; git clean -nd
вместо этого, здесь также будут появляться ненужные каталоги, которые невидимы дляgit status
.Как указано в другом ответе, достаточно простой команды:
Если вы пропустите последние две черты, команда не выполнится, если у вас есть файл с именем
HEAD
.Пример:
Слово предостережения: эта команда игнорирует неотслеживаемые файлы.
источник
git add
иgit clean
на помощьЯ создал несколько удобных псевдонимов git, чтобы вывести список неподготовленных и промежуточных файлов:
Тогда вы можете легко сделать такие вещи, как:
Вы можете сделать его более читабельным, создав скрипт где-то на вашем
PATH
вызываемомgit-has
:Теперь приведенные выше примеры можно упростить до:
Для полноты здесь аналогичные псевдонимы для неотслеживаемых и игнорируемых файлов:
источник
С python и пакетом GitPython:
Возвращает True, если хранилище не является чистым
источник
LOGLEVEL=DEBUG
вы увидите все команды Popen, которые он использует для запускаgit diff
Вот лучший, самый чистый способ.
источник
git status
это «фарфоровая» команда. Не используйте фарфоровые команды в скриптах, так как они могут меняться в разных версиях git. Вместо этого используйте команды «сантехника».git status --porcelain
(что предназначено для этой цели - стабильный формат, который вы можете анализировать в скрипте), возможно, также с -z (с нулевым разделением вместо новой строки?), Вы могли бы сделать что-то полезное с этой идеей , @ codyc4321 см stackoverflow.com/questions/6976473/... подробности