开发者

Mercurial, stop versioning cache directory but keep directory

I have a CakePHP project under Mercurial version control. Right now all the files in the app/tmp开发者_如何学JAVA directory are being versioned, which are always changing.

I do not want to version control these files.

I know I can stop by running hg forget app/tmp/*

But this will also forget the file structure. Which I want to keep.

Now I know that Mercurial doesn't version directories, just files, but the CakePHP folks were also smart enough to put an empty file called empty in every empty directory (I am guessing for this reason).

So what I want to do is tell Mercurial to forget every file under app/tmp except files whos name is exactly empty.

What would the command be for this?


Well, if nothing else works, you can always just ask Mercurial to forget everything, and then revert empty before committing:

Here's how I reproduced it, first create initial repo:

hg init
md app
md app\tmp
echo a>app\empty
echo a>app\tmp\empty
hg commit -m "initial" -A

Then add some files we later want to get rid of:

echo a >app\tmp\test1.txt
echo a >app\tmp\test2.txt
hg commit -m "adding" -A

Then forget the files we don't want:

hg forget app\tmp\*
hg status                     <-- will show all 3 files
hg revert app\tmp\empty
hg status                     <-- now empty is gone
echo glob:app/tmp>.hgignore
hg commit -m "ignored" -A

Note that all .hgignore does is to prevent Mercurial from discovering new files during addremove or commit -A, if you have explicitly tracked files that match your ignore filter, Mercurial will still track changes to those files.

In other words, even though I asked Mercurial to ignore app/tmp above, the file empty inside will not be ignored, or removed, since I have explicitly asked Mercurial to track it.


At least theoretically (I don't have time to try it right now), pattern matching should work with the hg forget command. So, you could do something like hg forget -X empty while in the directory (-X means "exclude").

You may want to consider using .hgignore, of course.


Since you only need to do it once I'd just do this:

find app/tmp -type f | grep -v empty | xargs hg forget
hg commit

from then on just put this in your `.hgignore'

^app/tmp


Mercurial has built-in support for globbing and regexes, as explained in the relevant chapter in the mercurial book. The python regex implementation is used.

This should work for you:

hg forget "re:app/tmp/.*(?<!/empty)$"
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜