Почему "hg status" показывает измененные файлы, когда "hg diff -g" нет? (Один родитель)
У меня есть репозиторий, где:
> hg st
показывает, что мой рабочий каталог имеет некоторые незафиксированные изменения, а
> hg diff
> hg diff -g
> hg diff --git
ничего не отображать.
Я читаю здесь: 4.10. Статус hg показывает измененные файлы, но hg diff не...:
hg отчеты о состоянии, когда содержимое файла или флаги изменились относительно любого из родителей. hg diff сообщает только измененное содержимое относительно первого родителя. Вы можете видеть информацию о флаге с параметром - git для hg diff и deltas относительно другого родителя с -r.
Однако, если я запустил hg parents
, он отображает только одного родителя (подсказка). Как я упоминал выше, я также пробовал hg diff --git
, и он все еще ничего не отображает.
Примечание:
- Вышеуказанное находится на Mercurial версии 2.0.1
-
hg status
показывает только M
рядом с обычным файлом.
-
hg diff
и hg diff -g
ничего не печатать
- Файловая система - NFS.
-
hg parents
печатает только один родительский
Ответы
Ответ 1
Некоторые выдержки из Mercurial в повседневном использовании (Mercurial: окончательное руководство) (копирование здесь, потому что, похоже, нет способа дать удобную ссылку до конца страница):
Вывод команды hg diff
по умолчанию с обратной совместимостью с помощью обычной команды diff
, но это имеет некоторые недостатки.
Выход hg diff выше скрывает тот факт, что мы просто переименовали файл. Команда hg diff принимает параметр --git
или -g
, чтобы использовать новый формат diff, который отображает такую информацию в более читаемой форме.
Эта опция также помогает в случае, который в противном случае может быть запутанным: файл, который, по-видимому, изменяется в соответствии с hg status
, но для которого hg diff
ничего не печатает. Эта ситуация может возникнуть, если мы изменим разрешения выполнить файл.
Нормальная команда diff не обращает внимания на права доступа к файлам, поэтому hg diff
ничего не выводит по умолчанию. Если мы снабдим его опцией -g
, она сообщит нам, что на самом деле произошло.
Подводя итог, команда hg diff
пропускает несколько видов информации об изменениях: атрибуты, разрешения, имена файлов и т.д. Эти изменения могут существовать, даже если у вас есть один родитель. И hg status
правильно учитывает все изменения. Чтобы узнать, что произошло, используйте hg diff -g
. Это ответ на вопрос "что происходит".
Кажется, что обратная совместимость - это "почему". Я не уверен, но я полагаю, что "нормальный diff" - это распространенный или встроенный инструмент Unix/Linux (судя по тому, что как hg, так и git происходят из этого мира).
Ответ 2
Если у вас есть ignorews
или ignoreblanklines
, установленный в .hgrc
, тогда hg status
покажет его как измененный, но hg diff
не будет (если изменения будут только пробелами, конечно).
Ответ 3
В моем случае что-то было сломано hg. (те же разрешения и hg diff -g ничего не показывают).
Я исправил проблему следующим образом:
- Я снова клонировал репозиторий в отдельной папке
- Я удалил все из этой папки, кроме .hg
- Я переехал из старого (сломанного) места, кроме .hg, в новое место.
Итак, после этого шага у меня есть репозиторий, который клонирует текущую версию mercurial + точно такие же файлы.
После этих шагов я получил одинаковые (пустые) результаты для команд: hg st
и hg diff -g
Ответ 4
Я просто удалил файлы, которые появились как измененные (при необходимости сделайте резервную копию), из-за чего все файлы появятся с помощью! рядом с ним, когда я бежал
hg st
После этого я выполнил следующую команду, чтобы вернуть файлы (которые уже были отмечены):
hg revert --all --no-backup
и это устранило проблему
Ответ 5
В этих ситуациях (это очень часто случается с моей командой), я нахожу, что эта команда исправит что угодно:
hg debugrebuilddirstate
или
hg debugrebuilddirstate -r tip
Он легко задокументирован в справочной документации, но в основном я считаю, что он очищает файл "dirstate", который кэширует информацию о рабочем каталоге файлы. В следующий раз, когда вы hg stat
, он обновит его с нуля.
Одно предупреждение: если вы добавили или удалили файлы, эта информация будет потеряна при восстановлении dirstate
.