2010-09-03 116 views
13

我正在使用Mercurial管理$ HOME,以保持我的点文件的完整性和跟踪性,或至少对我来说很重要。如何忽略除使用.hgignore之外的所有目录?

然而,有很多文件和目录在〜不需要跟踪,而且这个设置是不断变化和不断增长的。

从历史上看,我已经有这个.hgignore处理这个:

syntax: glob 
* 

这使我的状态干净,尽可能去,使得只有先前跟踪的可视文件。但是,我有一些目录(在我的例子中,scripts.emacs.d),我希望看到未跟踪的文件;我几乎总是想跟踪这些目录的新增加。

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

有没有办法做到这一点?

回答

17

.hgignore代替试试这个:

syntax: regexp 

^(?!(scripts|foo|bar)/)[^/]+/ 
  • ^比赛开始路径的
  • (?!(scripts|foo|bar)使用负先行忽略,除了那些在目录中scriptsfoobar
  • /)确保所有文件以追踪目录作为前缀的目录被忽略
  • [^/]+/后来居然匹配任何目录(不包括那些由先行排除了),所以在~文件不会被忽略

信用对该解决方案的中心思想(负前瞻)去拉迈克尔Voie的回答this question

+0

这是大部分解决方案,但〜中的所有文件仍然显示,这是至少是嘈杂的。我没有跟踪每个dotfile文件(其中最重要的是,因为有太多的软件包坚持把它们放在我的目录中)。 – 2010-09-07 14:12:58

+1

除非您可以使用文件名模式来区分目录中的点文件(无法忽略),否则我认为您运气不佳。 Mercurial文档说,如果一个路径'a/b/c'不能匹配'.hgignore'模式,那么对'a/b'和如果失败'a'都会尝试相同的模式。因此根目录中的文件和目录只能通过拼写方式来区分。如果只有少数被跟踪的目录以点开头,那么你可以手动添加这些目录和'.hgignore'开头的所有其他目录。 – shambulator 2010-09-08 10:35:59

8

这个问题在这里已经问过很多次了,你会用零宽度的负面预测断言,一个经常滥用的正则表达式技巧得到很多令人费解的答案,但更好的解决方案(a)仅在该目录中制作回购,或者(b)只在该目录中添加文件。对于选项(b),您只需在.hgignore文件中放入.*即可忽略所有内容,然后手动hg add要跟踪的文件。在mercurial中,与svn和cvs不同,您可以使用add来覆盖忽略。

+0

在该目录中创建回购不会跟踪根目录中的文件,也不会打开跟踪同一回购库中其他目录的选项。使用lookahead有什么问题? – shambulator 2010-09-03 21:01:08

+0

没什么不对,它很复杂,很少做。大多数人只是'hg add'异常,如果他们希望.hgignore是白名单而不是黑名单,那么就会忽略所有的异常。 – 2010-09-04 19:17:27

+0

够公平 - 我不否认花了几次尝试才得到正确的正则表达式,这就是假设我没有错过某个角落的情况下:)每一个你得到正确的帮助你与下一个,但!这样,你就可以使用'hg status'和'hg addremove'。 – shambulator 2010-09-05 21:51:57

相关问题