【问题标题】:How can I ignore all directories except one using .hgignore?除了使用 .hgignore 的目录之外,我如何忽略所有目录?
【发布时间】:2011-04-07 22:33:57
【问题描述】:

我正在使用 Mercurial 管理 $HOME,以使我的 dotfiles 保持良好和跟踪,或者至少是对我重要的那些。

但是,~ 中有大量不需要跟踪的文件和目录,而且这些文件和目录是不断变化和不断增长的。

从历史上看,我通过这个 .hgignore 来处理这个问题:

syntax: glob
*

这让我的状态保持干净,就它而言,只显示以前跟踪的文件。但是,我有一些目录(在我的情况下,scripts.emacs.d)我想在其中查看未跟踪的文件;我几乎总是想跟踪这些目录的新增内容。

我知道我可以运行 hg st -u scripts 来识别未跟踪的文件,但我想要一种方法,我可以使用普通的 ole hg 状态来实现相同的功能。

有没有办法做到这一点?

【问题讨论】:

    标签: mercurial hgignore


    【解决方案1】:

    改用.hgignore 试试这个:

    syntax: regexp
    
    ^(?!(scripts|foo|bar)/)[^/]+/
    
    • ^ 匹配路径的开始
    • (?!(scripts|foo|bar) 使用负前瞻来忽略除目录 scriptsfoobar 中的文件之外的所有文件
    • /) 确保以跟踪目录为前缀的目录被忽略
    • [^/]+/ 然后实际上匹配任何目录(不包括那些被前瞻排除的目录),因此~ 中的文件不会被忽略

    此解决方案的中心思想(否定前瞻)归功于 Michael La Voie 对this question的回答

    【讨论】:

    • 这主要是一种解决方案,但 ~ 中的所有文件仍会显示,这 至少 是嘈杂的。我不会跟踪每个点文件(尤其是因为很多软件包坚持将它们放在我的 ~ 目录中)。
    • 除非你可以使用文件名模式来区分点文件(被忽略)和目录(不能被忽略),否则我认为你不走运。 Mercurial 文档说,如果路径 a/b/c 无法匹配 .hgignore 模式,则会对 a/ba 尝试相同的模式。因此,根目录中的文件和目录只能通过拼写方式来区分。如果只有几个被跟踪的目录以点开头,那么您可以手动添加这些目录和.hgignore 其他所有以点开头的目录。
    【解决方案2】:

    这个问题已经在这里问了很多次了,你会得到很多令人费解的答案,使用零宽度否定前瞻断言,一个经常被滥用的正则表达式技巧,但更好的解决方案是(a ) 只需在该目录中单独创建 repo 或 (b) 只需在该目录中添加文件。对于选项 (b),您只需将 .* 放入您的 .hgignore 文件以忽略所有内容,然后手动 hg add 要跟踪的文件。在 mercurial 中,与 svn 和 cvs 不同,您可以使用 add 覆盖忽略。

    【讨论】:

    • 在该目录中创建 repo 不会跟踪根目录中的文件,或者打开跟踪同一 repo 中其他目录的选项。使用前瞻有什么问题?
    • 没什么错,只是很复杂而且很少做。大多数人只是“添加”异常并忽略所有内容,如果他们希望 .hgignore 是白名单而不是黑名单。
    • 很公平 - 我不会否认它需要几次尝试才能使正则表达式正确,这是假设我没有错过一些极端情况:) 你做对的每一个都可以帮助你下一个,不过!这样,您就可以只使用hg statushg addremove
    • 是的,它是六个中的一个。我会被find scripts foo bar -type f | xargs hg add 卡住,这需要shell 别名或mercurial 中的[alias]addremove 仍然会捕获已删除的文件,因为添加它们会覆盖 .hgignore。
    • .* 是“一切”的正则表达式语法。 *.* 是“至少包含句点的所有内容”的全局语法,如果每个文件都有扩展名,则大约是“所有内容”。您可以控制每行或每块使用的语法,默认为正则表达式。
    猜你喜欢
    • 2011-07-19
    • 2012-02-10
    • 2010-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多