7

谁能告诉我为什么 mercurial 会为“hg status”命令显示被忽略的文件?

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

$ hg addremove
$ hg commit 
nothing changed     

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

$ 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.*$

更新:

修改了一些正则表达式 * -> .*

4

7 回答 7

5

您的正则表达式语法错误。你有这个:

syntax:regexp
^target*$

这意味着“忽略以目标开头并以星号结尾的任何内容

没有忽略这些:

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

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

你的意思可能是这样的:

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

它匹配其中包含的任何/target/内容(注意它.*在正则表达式*中是针对 glob 样式的)。但是^and$仅用于根您的正则表达式并且您不希望它根 - 您想在字符串中的任何位置找到它,所以只需执行以下操作:

syntax:regexp
/target/

所有这一切的线索是文件被标记?not ignored 和 not added--ignored ,如果它们被忽略,如果不添加到 status 命令,您将根本看不到它们。

于 2011-03-22T14:27:20.973 回答
2

我遇到了类似的问题,因为我更改了某些文件的字母大小写。所以以前我得到了一个名为“sitenav.ext”的文件,将其重命名为“siteNav.ext”并开始遇到同样的问题 - 当我尝试“hg st”时,我得到了“?siteNav.ext”。修复很容易重命名为“_siteNav.ext”,添加删除,提交,重命名回“siteNav.ext”,添加删除,提交 -> 利润!

于 2011-09-22T02:06:17.163 回答
1

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

您的问题的一个(诚然奇怪)原因可能是.hgignore文件的权限问题与命令的排除默认值相结合addremove

我可以通过撤销忽略文件中的任何读取权限并-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这里会有所帮助。

此问题已根据 Jerome 的评论进行了更新。

于 2011-03-22T11:57:22.653 回答
1

非常感谢大家对此的帮助。我还没有找到问题的答案,但我确实找到了解决它的方法。所以我假设在修改 hgignore regexps mercurial 的某个时候会感到困惑并破坏了它的内部数据......或其他东西。我不知道足够的内部知识来知道这可能是什么。

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

  1. 确保您的 .hgignore 文件说明了您想要的内容,并且所有出现在 hg 状态的文件都是您要忽略的文件。
  2. 添加所有要忽略的文件。hg addremove 不起作用,因为它确实尊重 hgignore 内容,所以我使用了 Eclipse 的 hg 插件并手动完成了每个文件(好吧,我全部选择了它们,Eclipse 分别对它们应用了添加)。
  3. 还原所有添加的文件。我使用了以下内容,因为我在 linux 上。(感谢另一张关于 SO 的单独问题的海报——不幸的是,我现在找不到了)

    汞状态-an0 | xargs -0 hg 还原

  4. 重复上述步骤,直到它不再起作用。在我的情况下,这有时会连续多达 3 次还原!(虽然不知道它实际上在做什么:()

  5. 犯罪

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

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

再次感谢大家:)

于 2011-03-22T12:47:49.883 回答
0

? 不代表被忽视。

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

如果你不想看到他们就这样做

汞状态-mard

即只显示修改、添加、删除、删除

于 2011-03-22T11:10:42.053 回答
0

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

或者我在这里错过了什么?

(注意:^ 表示正则表达式匹配从路径的开头开始,即只匹配以 target 开头的路径

于 2011-04-12T12:05:52.030 回答
0

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

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

于 2012-01-22T23:33:16.407 回答