如何列出Mercurial(hg)仓库中的所有文件?

76

在Mercurial中,是否存在一个命令可以列出当前所有受源代码控制的文件?

我可以执行dir /s来列出我文件夹和子文件夹中的所有文件,但我不知道哪些文件已被添加到我的存储库中。我有各种被排除的文件类型和文件夹,并且我想验证在设置它们为我的.hgignore文件之前是否没有将它们添加。


你应该看一下这篇文章:http://mercurial.808500.n3.nabble.com/List-files-in-a-directory-td949176.html#a949176 - Pedro
5个回答

72

hg status --all 会列出树中的所有文件,并用一个字母表示它们的状态:M 表示已修改,C 表示干净(由 hg 拥有),I 表示被忽略的。

要查看被忽略的文件,请使用 hg status -i。要查看下一次提交时将添加的文件,请使用 hg status -a。这些选项只显示您需要了解的内容,不需要扫描长文件列表。


2
由于其他人可能在这里寻找信息,我想提一下我的新hglist扩展,它为Mercurial提供了一个“ls”命令:http://alastairs-place.net/projects/hglist/。 - al45tair
2
“hg st -A”是上述命令的缩写版本。 - Serge Stroobandt
11
回答很好,但并没有直接回答问题。在干净的工作状态下,“hg status -c”会列出所有被追踪的文件,且只有这些文件。有其他更改时,“hg status -carmd”可以解决问题。添加“-n”以排除状态标志。 - undefined
这个答案不正确,因为 hg st --all 命令会列出所有未跟踪的文件(前面带有问号)。 - bph

66
你也可以尝试使用 hg locate 命令,我通常在想限制文件到特定目录时会加上 -I 选项一起使用。
要列出仓库中的所有文件:
hg locate

从存储库("root")目录开始:

hg locate -I dir/sub_dir/dir_of_interest

根据您运行命令的目录,传递给 -I 的路径需要更改。例如,如果您从上面的 dir 目录中运行命令,则需要修改您的参数以定位:

hg locate -I sub_dir/dir_of_interest

输出文件列表将保持不变,显示每个文件在仓库中的完整路径。

尝试运行 hg help -v locate 获取更多信息。


2
正是我所需要的,谢谢。对于只需要列出已跟踪文件的人来说,这是更好的答案。 - Gringo Suave
2
“hg loc”是上述命令的缩写版本。 - Serge Stroobandt
4
这才是真正的答案。Ned的回答行不通。 - Neil Traft
2
如果你真的想像这样使用 hg locate,你可以通过 hg locate -I \pwd`` 自动获取当前目录。 - Benjohn
@NeilTraft我无法像你一样热衷于使用hg locatehg status -i将仅列出被忽略的文件。 hg status -a将仅列出将在提交时添加的文件。使用hg locate存在用户错误与期望列表不符的风险。hg locate非常有用的地方是在任何/所有修订版本中搜索特定文件名。同样,hg grep也会在任何/所有修订版本中搜索所有文件内容。 - Benjohn

23

hg manifest 会列出仓库中的所有文件,而 hg status --all 将列出存储库结构中的所有文件,并包括一个标记,用于标识哪些文件正在被跟踪,哪些不是。


2
这正好给了我想要的东西,尽管有一个小缺点,就是不能像楼主想要的那样按文件夹缩小范围。但它仍然比被接受的答案更好。 - Neil Traft

3

仅列出已忽略或已添加的文件

要仅列出已忽略的文件,请执行: hg status -i

要仅列出已添加的文件,请执行:hg status -a

如果您不想输入太多,可以将其缩短为hg sta -ihg sta -a

这两种使用statuslocate更简单,并且会给出您关心的特定文件状态,因此出错几率显著降低。

更多关于hg status的内容

要列出Mercurial仓库中的所有文件,请执行:hg status --all

当它们被列出时,文件名称前面会有一个前缀:

  M = modified
  A = added
  R = removed
  C = clean
  ! = missing (deleted by non-hg command, but still tracked)
  ? = not tracked
  I = ignored

如果您只想列出文件夹中的文件,可以提供路径:

  • hg st --all MyFolder - MyFolder 中的所有文件
  • hg sta -i MyFolder - 仅在 MyFolder 中忽略的文件。
除了用于仅列出具有特定状态的文件的 -i(表示“已忽略”)和 -a(表示“已添加”)之外,还有其他标志可用。

获取帮助

阅读此处的另一个非常有用的答案,以详细解释 status 命令。该答案因作者试图展示您可以通过像这样向 Mercurial “询问” status 命令来发现上述所有内容而受到负面评价。
hg help status

您可以通过以下方式向Mercurial询问其任何命令。如果您想获取Mercurial命令列表,请输入hg help


-6
C:\>hg help -v status hg status [OPTION]... [FILE]...
aliases: st
显示工作目录中已更改的文件
显示存储库中文件的状态。如果给出名称,则仅显示匹配的文件。除非使用-c / --clean,-i / --ignored, -C / --copies或-A / --all选项,否则不会列出干净或被忽略或是复制/移动操作的源文件。除非使用“仅显示…”描述的选项, 否则将使用-mardu选项。
选项-q / --quiet隐藏未跟踪(未知和被忽略)的文件,除非使用-u / --unknown或-i / --ignored显式请求。
注意:如果权限发生更改或合并发生,则状态可能与diff不一致。标准diff格式不报告权限更改, diff仅相对于一个合并父级报告更改。
如果给出一个修订版本,则将其用作基本修订版本。如果给出两个修订版本,则显示它们之间的差异。 --change选项也可以用作快捷方式,以列出修订版本从其第一个父级的更改文件。
用于显示文件状态的代码为:
M = 修改 A = 添加 R = 删除 C = 干净 ! = 缺失(由非hg命令删除,但仍被跟踪) ? = 未跟踪 I = 忽略 = 上一个文件的原始列表作为A(添加)
选项:
-A --all 显示所有文件的状态 -m --modified 仅显示已修改的文件 -a --added 仅显示已添加的文件 -r --removed 仅显示已删除的文件 -d --deleted 仅显示已删除(但已跟踪)的文件 -c --clean 仅显示没有更改的文件 -u --unknown 仅显示未知(未跟踪)的文件 -i --ignored 仅显示被忽略的文件 -n --no-status 隐藏状态前缀 -C --copies 显示复制文件的源 -0 --print0 结束文件名与NUL,用于xargs --rev 显示与修订版本的差异 --change 列出修订版本的更改文件 -I --include 包括与给定模式匹配的名称 -X --exclude 排除与给定模式匹配的名称
全局选项: -R --repository 存储库根目录或覆盖包文件的名称 --cwd 更改工作目录 -y --noninteractive 不提示,假设对任何必需的答案都是“是” -q --quiet 抑制输出 -v --verbose 启用附加输出 --config 设置/覆盖配置选项(使用“section.name=value”) --debug 启用调试输出 --debugger 启动调试器 --encoding 设置字符集编码(默认值:cp1252) --encodingmode 设置字符集编码模式(默认值:strict) --traceback 始终在异常上打印回溯 --time 计算命令所需的时间 --profile 打印命令执行概要 --version 输出版本信息并退出 -h --help 显示帮助并退出

5
很有趣,我的回答年复一年地被投下负票。但是告诉人们阅读手册真的那么糟糕吗?难道stackoverflow无效化了文档吗?人们是否停止使用--help//?/man和其他文档,因为在stackoverflow上问比阅读更快?我拒绝删除我的回答 :) - simendsjo
嘿,好吧,你可以为我投一票,因为这是这里最有用的答案。我不会再根据我从中发现的东西写另一个答案,看看是否能得到任何赞成票 :-) - Benjohn
1
就此而言,你的回答很棒。但是用户需要知道status作为hg命令之一,实际上首先会执行此操作。我每天都使用Mercurial,但我不知道它可以显示被忽略的文件。 - Benjohn
2
@simendsjo:StackOverflow不是关于重新粘贴文档的。你的“答案”是一堵文字墙,重要部分(--all)甚至没有显示在屏幕上(你必须滚动才能看到它);而且你根本没有提供实现目标的实际措辞。总体而言,帮助程度不高。相比之下,Benjohn首先给出所需命令,然后提供解释。 - Ethan Furman
这不是一个答案。RTFM不是SO的宗旨。我们需要假设他们已经尝试过阅读手册,或者他们不知道在手册中该去哪里查找。 - cwallenpoole

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接