我有一个存储库:
> 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
,它仍然没有显示任何内容。
注意:
hg status
仅在常规文件旁边显示M
。hg diff
和hg diff -g
不打印任何内容hg parents
仅打印一个父答案 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没有显示任何内容)。 我用下一个方法解决了问题:
因此,在此步骤之后,我将使用当前版本的mercurial +完全相同的文件克隆存储库。
完成此步骤后,我收到了相同(空)的命令结果:hg st
和hg diff -g