How can I ignore all directories except one using .hgignore?
I'm managing $HOME using Mercurial, 开发者_如何学JAVAto keep my dotfiles nice and tracked, or at least the ones that matter to me.
However, there's a profusion of files and directories in ~ that do not need to be tracked, and that set is ever-changing and ever-growing.
Historically, I've dealt with this by having this .hgignore:
syntax: glob
*
This keeps my status clean, as far as it goes, making only previously tracked files visible. However, I have some directories (in my case, scripts
, .emacs.d
) that I would like to see untracked files in; I almost always want to track new additions to those directories.
I know that I can run hg st -u scripts
to identify untracked files, but I want a means whereby I can achieve the same function using plain ole hg status.
Is there a way to do this?
Try this in .hgignore
instead:
syntax: regexp
^(?!(scripts|foo|bar)/)[^/]+/
^
matches start of path(?!(scripts|foo|bar)
uses negative lookahead to ignore all files except those in directoriesscripts
,foo
orbar
/)
ensures that directories which have a tracked directory as a prefix are ignored[^/]+/
then actually matches any directory (excluding those ruled out by the lookahead), so that files in~
aren't ignored
Credit for the central idea in this solution (the negative lookahead) goes to Michael La Voie's answer to this question
This question has been asked here on SO quite a few times, and you'll get a lot of convoluted answers using zero-width negative look ahead assertions, an oft abused regex trick, but the better solutions are to either (a) just make the repo in that directory alone or (b) just add the files in that directory. For option (b) you'd just put .*
in your .hgignore
file to ignore everything, and then manually hg add
the files you want tracked. In mercurial, unlike svn and cvs, you can override an ignore with an add.
精彩评论