添加文件时为什么mercurial文件集不起作用?

时间:2017-07-14 14:40:52

标签: mercurial

我正在尝试使用mercurial文件集来添加目录树中的所有文件,不包括非常大的文件和任何二进制文件。从mercurial文档中抄袭,这个命令应该这样做:

hg init
hg add 'set: size("<1M") and not binary()'

然而,这会返回状态代码0,并且没有向我的新空库添加任何内容。我试过'set:not binary()',但也没用。 令人沮丧的是,虽然我可以谷歌搜索mercurial文件集,并找到很多例子,但是当它不起作用时我找不到任何帮助排除故障的东西! 我没有.hgignore文件,它是一个新的空回购。 Mercurial 4.2.2。 我正在测试它的目录有几个人工创建的文件用于测试。在我的实际用例中,我继承了来自客户端的各种源和二进制文件的多千兆字节tarball,我希望在开始黑客攻击以解决问题之前将所有源代码都变为mercurial,因此需要排除二进制文件和大型文件否则会阻止mercurial的文件。

这是我的小测试脚本:

#!/bin/sh -ex
dd if=/dev/urandom of=binary_1k bs=1 count=1024
dd if=/dev/urandom of=binary_2M bs=1 count=2097152
echo "This. Is, a SMALL text file." > text_small
hexdump binary_1k > text_1k
hexdump binary_2M > text_2M
ls -lh
file binary_1k
file binary_2M
file text_1k
file text_2M
hg init
hg add 'set: size("<1M") and not binary()'
hg status -a
hg add 'set: not binary()'
hg status -a
hg add 'set: size("<1M")'
hg status -a

最后,每个status命令都不会报告repo中的文件,add命令也不会报告错误。

1 个答案:

答案 0 :(得分:4)

问题是文件集会查询Mercurial的存储库数据库,该数据库只知道属于存储库或已添加的文件。

一种解决方案是添加所有内容,然后删除您不喜欢的文件,例如:

hg forget 'set:size(">1M") or binary()'

这很有效,因为查询还需要最近添加的文件,即使它们尚未提交。