Mercurial hg状态显示被忽略的文件

时间:2011-03-22 10:59:54

标签: mercurial hgignore

有人能告诉我为什么mercurial会显示'hg status'命令的被忽略文件吗?

这是确认mercurial确实忽略了文件:

$ hg addremove
$ hg commit 
nothing changed     

现在,看一下状态输出。我在上面的行之后立即运行了这个。 (打印输出是部分的,删除了可识别的文本)

$ hg status
? Core/target/Core-0.0.1-SNAPSHOT-tests.jar
? Core/target/Core-0.0.1-SNAPSHOT.jar
? Core/target/classes/META-INF/MANIFEST.MF
? Core/target/classes/xxx/yyy/zzz/X.class
? Core/target/classes/xxx/yyy/zzz/XBackup.class
? Core/target/classes/xxx/yyy/zzz/XBackupInput.class
? Core/target/classes/xxx/yyy/zzz/XBackupOutput.class
? Core/target/classes/xxx/yyy/zzz/XImpl$GetResultsAndStatistics.class
? Core/target/classes/xxx/yyy/zzz/XImpl$MonitoringMode.class
? Core/target/classes/xxx/yyy/zzz/XImpl$UpdateMode.class
? Core/target/classes/xxx/yyy/zzz/XImpl.class
? Core/target/classes/xxx/yyy/zzz/XIsFullException.class
? Core/target/classes/xxx/yyy/zzz/XSource.class
? Core/target/classes/xxx/yyy/zzz/XUsageException.class
? Core/target/classes/xxx/yyy/zzz/CheckResults.class
? Core/target/classes/xxx/yyy/zzz/Noise.class
? Core/target/classes/xxx/yyy/zzz/core/DateTimeGenerator$TemporalMeasure.class
? Core/target/classes/xxx/yyy/zzz/core/DateTimeGenerator.class
? Core/target/classes/xxx/yyy/zzz/core/LoggingConfigurator.class
? Core/target/classes/xxx/yyy/zzz/core/ManagedIterator.class
? Core/target/classes/xxx/yyy/zzz/core/NetworkUtils.class
? Core/target/classes/xxx/yyy/zzz/core/StackTraceUtils.class
? Core/target/classes/xxx/yyy/zzz/core/Summarisable.class
? Core/target/classes/xxx/yyy/zzz/core/TimingUtils.class
? Core/target/classes/xxx/yyy/zzz/core/XMLStaticStringUtils.class
? Core/target/classes/xxx/yyy/zzz/core/Zipper.class
...

在状态打印输出中显示了一千行这些被忽略的文件;那是一种严重的诅咒。

我怎样摆脱这个?

由于

更新:

这是我的.hgignore文件。

syntax:glob
.metadata*

syntax:regexp
^target.*$
^[^/]*/target.*$
^[^/]*/[^/]*/target.*$
^bin.*$
^[^/]*/bin.*$
^[^/]*/[^/]*/bin.*$

更新:

修改了正则位* - > *

7 个答案:

答案 0 :(得分:5)

您的regexp语法错误。你有这个:

syntax:regexp
^target*$

表示“忽略以目标开头并以星号

结尾的任何内容

未能忽略这些:

Core/target/classes/META-INF/MANIFEST.MF
Core/target/classes/xxx/yyy/zzz/X.class

有两个原因 - 它们以Core/而非target开头,并且不以星号结尾。

你可能的意思是:

syntax:regexp
^.*/target/.*$

匹配其中包含/target/的任何内容(请注意,regexp .*中的*适用于glob样式)。但是^$只能用来根你的正则表达式而你不想让它生根 - 你想在字符串中的任何地方找到它,所以就这样做:

syntax:regexp
/target/

所有这一切的线索是文件标有?,这意味着不会被忽略而不会被添加,如果被忽略,如果没有添加{则根本不会看到它们{1}}到状态命令。

答案 1 :(得分:2)

我遇到了类似的问题,因为我改变了一些文件的字母大小写。所以以前我得到了名为“sitenav.ext”的文件,将其重命名为“siteNav.ext”并开始出现同样的问题 - 当我尝试“hg st”时,我得到了“?siteNav.ext”。 修复很简单 重命名为“_siteNav.ext”, addremove, 承诺, 重命名回“siteNav.ext”, addremove, 提交 - >利润!

答案 2 :(得分:1)

在问题中由 Jerome 评论,提供您的配置可能会有所帮助。

问题的一个(不可否认的奇怪)原因可能是.hgignore文件与addremove命令的排除defaults相结合的权限问题。

我可以通过撤消忽略文件的任何读取权限并使用-X "**/target/**"作为addremove命令的默认选项来重现您的情况(可能在任何可能的Mercurial配置文件中设置) ):

$ hg st
# no output, as expected
$ chmod 000 .hgignore
$ hg addremove # with '-X "**/target/**"' set as default somewhere
$ hg commit 
nothing changed  
$ hg st
? Core/target/Core-0.0.1-SNAPSHOT-tests.jar
? Core/target/Core-0.0.1-SNAPSHOT.jar
...

hg无法读取忽略文件,因此不知道应忽略目标内容。来自hg的相应警告在此处会有所帮助。

此问题已根据杰罗姆的评论进行了更新。

答案 3 :(得分:1)

非常感谢大家对此的帮助。我还没有找到问题的答案,但我确实找到了一个摆脱它的解决方法。所以我假设在某些时候,当修改hgignore regexps时,mercurial会混淆并损坏它的内部数据......或者其他东西。我不太了解内部情况,知道这可能是什么。

无论如何,如果你发现自己在同一条船上,这就是我所做的:

  1. 确保您的.hgignore文件说出您想要的内容,并且所有以hg状态显示的文件都是您要忽略的文件。
  2. 添加要忽略的所有文件。 hg addremove不起作用,因为它确实支持hgignore内容,所以我使用了Eclipse的hg插件并手动完成了每个文件(好吧,我选择了所有文件,Eclipse将所有内容单独添加到它们中)。
  3. 还原所有已添加的文件。我使用以下因为我在Linux上。 (感谢另一张关于SO的单独问题的海报 - 我现在不能再找不到了)

    hg status -an0 | xargs -0 hg revert

  4. 重复上述步骤,直至不再有效。在我的情况下,有时连续多达3个恢复! (不知道它实际上在做什么:()

  5. 提交
  6. 您现在应该不再在hg状态输出中看到被忽略的文件。

    对不起,我不知道为什么会这样,或者原来的问题是什么。如果有人这样做,我会非常有兴趣知道你的想法。

    再次感谢大家:)

答案 4 :(得分:0)

并不意味着被忽略。

这只是意味着mercurial没有跟踪文件。

如果你不想看到它们,那就

hg status -mard

即。仅显示修改,添加,删除,删除

答案 5 :(得分:0)

您的.hgignore文件显示“^ target”被忽略,但文件位于Core / target中。所以忽略线应该是“目标”(没有^)或“^核心/目标”。

或者我错过了吗?

(注意:^意味着正则表达式匹配从路径的开头开始,即只有匹配目标的路径 匹配!)

答案 6 :(得分:0)

有同样的问题,鲍勃的回答对我有用。

如果您使用的是TortoiseHg,可以在上下文菜单(窗口)中选择“编辑忽略过滤器”,以验证并更改.hgignore设置。