Почему «hg status» показывает измененные файлы, а «hg diff -g» - нет? (Один родитель) - PullRequest
35 голосов
/ 09 декабря 2011

У меня есть хранилище, где:

> hg st

показывает, что в моем рабочем каталоге есть некоторые незафиксированные изменения, в то время как

> hg diff


> hg diff -g


> hg diff --git

ничего не отображает.

Я читаю здесь: 4.10.hg status показывает измененные файлы, но 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 печатает только один родитель

Ответы [ 5 ]

20 голосов
/ 09 декабря 2011

Некоторые выдержки из 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 происходят из этого мира).

4 голосов
/ 12 июня 2017

В этих ситуациях (это часто случается с моей командой), я нахожу, что эта команда исправит все:

hg debugrebuilddirstate

или

hg debugrebuilddirstate -r tip

Это слегка задокументировано в справочной документации , но в целом я считаю, что он очищает файл "dirstate", который кэширует информацию о файлах рабочих каталогов. В следующий раз, когда вы hg stat обновите его с нуля.

Одно предупреждение: если вы добавили или удалили файлы, эта информация будет потеряна при восстановлении dirstate.

4 голосов
/ 10 декабря 2011

Если в .hgrc установлено ignorews или ignoreblanklines, тогда hg status покажет его как измененное, а hg diff - нет (при условии, что изменения, конечно, являются только пробелами).

3 голосов
/ 17 ноября 2015

Я просто удалил файлы, которые показались измененными (при необходимости создайте резервную копию), в результате чего все файлы были показаны с! рядом с ним, когда я побежал

hg st

После этого я выполнил следующую команду для возврата файлов (которые уже были проверены):

hg revert --all --no-backup

и это решило проблему

2 голосов
/ 12 ноября 2014

В моем случае что-то сломалось с помощью hg. (те же права и hg diff -g ничего не показывает). Я исправил проблему следующим образом:

  1. Я снова клонировал репозиторий в отдельной папке
  2. Я удалил все из этой папки, кроме .hg
  3. Я переехал со старого (сломанного) места все, кроме .hg, на новое место

Итак, после этого шага у меня есть репозиторий, который клонирован с текущей версией mercurial + точно такие же файлы.

После этого я получил одинаковые (пустые) результаты для команд: hg st и hg diff -g

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...