当“hg diff -g”没有时,为什么“hg status”会显示更改的文件? (一位家长)

时间:2011-12-08 23:47:50

标签: mercurial

我有一个存储库:

> hg st

显示我的工作目录有一些未提交的更改,而

> hg diff


> hg diff -g


> hg diff --git

什么都不显示。

我在这里阅读:4.10. hg status shows changed files but hg diff doesn't!以下内容:

  当文件内容或标志相对于任一父文件发生更改时,

hg状态报告。 hg diff仅报告相对于第一个父项的更改内容。您可以使用--git选项查看标记信息,以使用-r将hg diff和deltas相对于另一个父项进行查看。

但是,如果我运行hg parents,它只显示一个父项(提示)。正如我上面提到的,我也尝试了hg diff --git,它仍然没有显示任何内容。

注意:

  • 上面是 Mercurial版本2.0.1
  • hg status仅在常规文件旁边显示M
  • hg diffhg diff -g不打印任何内容
  • 文件系统是NFS。
  • hg parents仅打印一个父

5 个答案:

答案 0 :(得分:20)

Mercurial in daily use (Mercurial: the definitive guide)的一些摘录(在此处复制,因为似乎没有办法给页面的末尾提供方便的链接):

  

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。这是“发生了什么”这个问题的答案。

似乎向后兼容是'为什么'。我不确定,但我认为'普通差异'是一些普遍的或内置的Unix / Linux工具(从hg和git都来自那个世界的事实来判断)。

答案 1 :(得分:4)

如果您在ignorews设置了ignoreblanklines.hgrc,那么hg status会将其显示为已更改,但hg diff则不会(假设更改仅当然是空白。)

答案 2 :(得分:3)

我刚删除了显示为已修改的文件(如果需要,请进行备份),这会导致所有文件显示为!我跑的时候旁边

hg st

之后我运行以下命令来恢复文件(已经签入):

hg revert --all --no-backup

并修复了问题

答案 3 :(得分:3)

在这些情况下(我的团队发生了很多事情),我发现这个命令可以修复任何事情:

hg debugrebuilddirstate

hg debugrebuilddirstate -r tip

help documentation中有轻微记录,但基本上我相信它会清除“dirstate”文件,该文件缓存有关工作目录文件的信息。下次hg stat它将从头开始刷新它。

有一点需要注意:如果您已添加了已删除的文件,则在重建dirstate时该信息将会丢失。

答案 4 :(得分:2)

在我的情况下,某些东西被hg打破了。 (相同的权限和hg diff -g没有显示任何内容)。 我用下一个方法解决了问题:

  1. 我在另外的文件夹
  2. 中再次克隆了存储库
  3. 我从此文件夹中删除了除.hg
  4. 之外的所有内容
  5. 我从旧的(破碎的)地方搬到除了.hg以外的所有地方
  6. 因此,在此步骤之后,我将使用当前版本的mercurial +完全相同的文件克隆存储库。

    完成此步骤后,我收到了相同(空)的命令结果:hg sthg diff -g