Подтвердить что ты не робот

Почему "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 печатает только один родительский
4b9b3361

Ответ 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.