Mercurial,停止版本化缓存目录但保留目录

时间:2011-02-08 14:51:25

标签: cakephp mercurial

我在Mercurial版本控制下有一个CakePHP项目。现在,app/tmp目录中的所有文件都正在进行版本化,这些文件总是在变化。

我不想版本控制这些文件。

我知道我可以通过运行hg forget app/tmp/*

来停止

但这也会忘记文件结构。我想保留。

现在我知道Mercurial不是版本目录,只是文件,但CakePHP人员也非常聪明,可以在每个空目录中放置一个名为empty的空文件(我猜是因为这个原因)。 / p>

所以我想要做的就是告诉Mercurial忘记app/tmp下的每个文件,除了名字正好为空的的文件。

这个命令会是什么?

4 个答案:

答案 0 :(得分:3)

至少在理论上(我现在没有时间尝试),pattern matching应该使用hg forget命令。因此,您可以在目录中执行hg forget -X empty之类的操作(-X表示“排除”)。

当然,您可能需要考虑使用.hgignore。

答案 1 :(得分:3)

好吧,如果没有别的办法,你总是可以让Mercurial忘记一切,然后在提交之前恢复empty

以下是我如何复制它,首先创建初始回购:

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

然后添加一些我们以后想要摆脱的文件:

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

然后忘记我们不想要的文件:

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

请注意,所有.hgignore都是为了防止Mercurial在addremovecommit -A期间发现新文件,如果您明确跟踪了与您的忽略过滤器匹配的文件,Mercurial仍会跟踪更改那些文件。

换句话说,即使我要求Mercurial忽略上面的app/tmp,也不会忽略或删除里面的文件empty,因为我已明确要求Mercurial跟踪它。

答案 2 :(得分:2)

因为你只需要这样做就可以了:

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

从那以后就把它放在你的`.hgignore'

^app/tmp

答案 3 :(得分:0)

Mercurial内置了对globbing和regex的支持,如mercurial书中的relevant chapter所述。使用python regex实现。

这应该适合你:

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