У меня есть сценарий, update.py
, который загружает новые версии файлов отслеживаются в моем хранилище мерзавца:Git изменения Diff-файлы вывода после статуса мерзавца
$ python update.py
Doing work...
Done
$ git status
On branch my-branch
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: foo.txt
modified: bar.txt
modified: baz.txt
no changes added to commit (use "git add" and/or "git commit -a")
Иногда файлы, загруженные идентичны файлам уже в HEAD
, поэтому после загрузки рабочий каталог чист:
$ python update.py
Doing work...
Done
$ git status
On branch my-branch
nothing to commit, working directory clean
Однако, я обнаружил, что git diff-files
появляется запутаться, когда файлы заменяются, даже если их содержимое идентично:
$ python update.py
Doing work...
Done
$ git diff-files
:100644 100644 ffa91f655007c56f209cf15fee13c55991a76e18 0000000000000000000000000000000000000000 M foo.txt
:100644 100644 dc05558729c3c94a088aa63da3bbd8f1213b8cf3 0000000000000000000000000000000000000000 M bar.txt
:100644 100644 002cc3f53dc64b89b1b91adbb6fe61035ba9e832 0000000000000000000000000000000000000000 M baz.txt
$ git status
On branch my-branch
nothing to commit, working directory clean
$ git diff-files
$
В приведенном выше фрагменте кода:
- Я бегу update.py, который заменяет
foo.txt
,bar.txt
иbaz.txt
файлы с идентичными копиями загруженных из других источников. git diff-files
неправильно сообщает, что эти три файла были отредактированы на месте в дереве работ в соответствии с исходным форматом вывода, описанным на git diff man page.git status
правильно сообщает, что ничего не изменилось.git diff-files
, бежать послеgit status
, теперь также сообщает, что ничего не изменилось.
После запуска update.py
, git diff-files
будет продолжать неправильно сообщать об изменениях, пока не закончатся git status
, после чего он ведет себя снова.
Что здесь происходит? Почему git diff-files
сообщает об изменениях, если их нет?
В случае, если вы хотите знать, почему это вызывает у меня неприятности, вот еще несколько контекст:
У меня есть еще один сценарий, update_and_commit_if_needed.py
, что делает следующее:
- Run
update.py
. - Если
git diff-files
возвращает ноль, рабочее дерево чистое, аupdate.py
ничего не изменило. Выход. - В противном случае рабочее дерево загрязнено. Зафиксируйте изменения.
Я видел странный провал в update_and_commit_if_needed.py
: Я хотел бы получить к третьему шагу, но тогда git commit
будет жаловаться, что там было nothing to commit, working directory clean
. Отслеживая эту ошибку, я обнаружил это странное поведение git diff-files
.
Я использую git версию 2.5.0 на OS X 10.11.4 (15E65).
EDIT 1: Я нашел легкий способ воспроизвести это поведение:
$ git diff-files
$ git status
On branch my-branch
nothing to commit, working directory clean
$ cp foo.txt ~
$ mv ~/foo.txt .
$ git diff-files
:100755 100755 20084b5d6da359748f62c259c24f2b9cc2359780 0000000000000000000000000000000000000000 M foo.txt
$ git status
On branch my-branch
nothing to commit, working directory clean
$ git diff-files
$
EDIT 2: Как было предложено в комментарии, я попытался переворачивания core.trustctime
и core.ignoreStat
от их значений по умолчанию. В этом случае это не изменяет поведение git.
Очевидно, что это какая-то ошибка. Точно какой ... ну, эта часть * не * ясна. :-) Поскольку индекс хранит результаты «stat» для целей кеша, ваша ОС может быть релевантной. См. Также настройки 'core.trustctime' и' core.ignoreStat' в 'git config'. – torek
Wow, Man! Вы только что исследовали причины долговременного/недочеты/gitk, которые по существу страдают от этой ошибки: иногда она демонстрирует, что есть изменения, но не может их продемонстрировать, а после «F5» (перезагрузить) флаг изменения исчезает. Я уверен, что быстрая проверка включает в себя какую-то «статистику» без фактического сравнения контента, но это только спекуляции, а не настоящие расследования. – user3159253