除了使用.hgignore之外,我怎么能忽略所有目录?

Chr*_*s R 15 mercurial hgignore

我正在使用Mercurial管理$ HOME,以保持我的dotfiles好看和跟踪,或至少对我来说重要的.

但是,〜中的文件和目录数量很多,不需要跟踪,而且这个集合不断变化且不断增长.

从历史上看,我已经通过这个.hgignore解决了这个问题.

syntax: glob
*
Run Code Online (Sandbox Code Playgroud)

这样可以保持我的状态干净,只会使之前跟踪的文件可见.但是,我有一些目录(在我的情况下scripts,.emacs.d),我希望看到未跟踪的文件; 我几乎总是想跟踪那些目录的新增内容.

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

有没有办法做到这一点?

sha*_*tor 18

试试这个.hgignore:

syntax: regexp

^(?!(scripts|foo|bar)/)[^/]+/
Run Code Online (Sandbox Code Playgroud)
  • ^ 匹配路径的开头
  • (?!(scripts|foo|bar)使用负前瞻忽略,除了那些在目录中的所有文件scripts,foobar
  • /) 确保忽略具有跟踪目录作为前缀的目录
  • [^/]+/然后实际匹配任何目录(不包括由前瞻排除的那些目录),因此~不会忽略文件

对于这个解决方案中的中心思想(负向前瞻)的信用归功于Michael La Voie对这个问题的回答


Ry4*_*ase 10

这个问题已经在这里被问过很多次了,你会得到很多复杂的答案,使用零宽度负向前看断言,一个经常被滥用的正则表达式技巧,但更好的解决方案是(a)只是制作仅在该目录中的repo或(b)只添加该目录中的文件.对于选项(B)你只要把.*你的.hgignore文件到不顾一切,然后手动hg add你想跟踪的文件.在mercurial中,与svn和cvs不同,您可以使用add覆盖ignore.

  • “。*”是“一切”的正则表达式语法。*。*是glob语法,表示“其中至少包含句点的所有内容”,如果每个文件都有扩展名,则近似为“所有内容”。您可以控制每行或每块使用哪种语法(默认为正则表达式)。 (2认同)