有人能告诉我为什么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.*$
更新:
修改了正则位* - > *
答案 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会混淆并损坏它的内部数据......或者其他东西。我不太了解内部情况,知道这可能是什么。
无论如何,如果你发现自己在同一条船上,这就是我所做的:
还原所有已添加的文件。我使用以下因为我在Linux上。 (感谢另一张关于SO的单独问题的海报 - 我现在不能再找不到了)
hg status -an0 | xargs -0 hg revert
重复上述步骤,直至不再有效。在我的情况下,有时连续多达3个恢复! (不知道它实际上在做什么:()
您现在应该不再在hg状态输出中看到被忽略的文件。
对不起,我不知道为什么会这样,或者原来的问题是什么。如果有人这样做,我会非常有兴趣知道你的想法。
再次感谢大家:)
答案 4 :(得分:0)
?并不意味着被忽略。
这只是意味着mercurial没有跟踪文件。
如果你不想看到它们,那就
hg status -mard
即。仅显示修改,添加,删除,删除
答案 5 :(得分:0)
您的.hgignore文件显示“^ target”被忽略,但文件位于Core / target中。所以忽略线应该是“目标”(没有^)或“^核心/目标”。
或者我错过了吗?
(注意:^意味着正则表达式匹配从路径的开头开始,即只有匹配目标的路径 匹配!)
答案 6 :(得分:0)
有同样的问题,鲍勃的回答对我有用。
如果您使用的是TortoiseHg,可以在上下文菜单(窗口)中选择“编辑忽略过滤器”,以验证并更改.hgignore设置。