我在Mercurial版本控制下有一个CakePHP项目。现在,app/tmp
目录中的所有文件都正在进行版本化,这些文件总是在变化。
我不想版本控制这些文件。
我知道我可以通过运行hg forget app/tmp/*
但这也会忘记文件结构。我想保留。
现在我知道Mercurial不是版本目录,只是文件,但CakePHP人员也非常聪明,可以在每个空目录中放置一个名为empty
的空文件(我猜是因为这个原因)。 / p>
所以我想要做的就是告诉Mercurial忘记app/tmp
下的每个文件,除了名字正好为空的的文件。
这个命令会是什么?
答案 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在addremove
或commit -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)$"