.hgignore没有为某个用户解析

hud*_*jev 9 mercurial hgignore

我有一个受版本控制的项目,例如,位于/project,.hgignore位于/project/.hgignore.它的语法似乎是正确的,但问题是某些用户完全忽略了这个文件,同时仍然为其他用户解析.

说,跑步

su -l dipsy -c 'cd /project; hg status'
Run Code Online (Sandbox Code Playgroud)

显示正确的结果,忽略适当的文件,而

su -l laalaa -c 'cd /project; hg status'
Run Code Online (Sandbox Code Playgroud)

还输出列出的文件/project/.hgignore.

我已经检查了什么:

  • ~/.hgrc两个用户的文件都是相同的,输出也是如此hg showconfig.
  • 两个用户都可以读取/project/.hgignore和写入.

我错过了什么?

(以防万一:Debian Lenny,Mercurial 1.6.3)

//很抱歉,如果用户名看起来很愚蠢,那么它们就不是真的(:

- 添加2010-11-26 -

PS.有没有办法在处理.hgignore-s 上启动hg并获得调试输出?hg --debug status并且hg status --debug不打印任何合理的东西.

- 增加2010-11026 -

调试hg status(结果各不相同):

# su -l dipsy -c 'cd /project; strace hg status 2>&1 >/dev/null | grep hgignore'
open("/project/.hgignore", O_RDONLY|O_LARGEFILE) = 4
fstatat64(4, ".hgignore", {st_mode=S_IFREG|0664, st_size=214, ...}, AT_SYMLINK_NOFOLLOW) = 0
write(1, "M .hgignore\nM foo/bar/baz"..., 4096) = 4096

# su -l laalaa -c 'cd /project; strace hg status 2>&1 >/dev/null | grep hgignore'
write(1, "M .hgignore\nM foo/bar/baz"..., 4096) = 4096
Run Code Online (Sandbox Code Playgroud)

调试hg status --ignore(结果是一样的):

# su -l dipsy -c 'cd /project; strace hg status --ignore 2>&1 >/dev/null | grep hgignore'
open("/project/.hgignore", O_RDONLY|O_LARGEFILE) = 3
fstatat64(3, ".hgignore", {st_mode=S_IFREG|0664, st_size=214, ...}, AT_SYMLINK_NOFOLLOW) = 0

# su -l laalaa -c 'cd /project; strace hg status --ignore 2>&1 >/dev/null | grep hgignore'
open("/project/.hgignore", O_RDONLY|O_LARGEFILE) = 3
fstatat64(3, ".hgignore", {st_mode=S_IFREG|0664, st_size=214, ...}, AT_SYMLINK_NOFOLLOW) = 0
Run Code Online (Sandbox Code Playgroud)

因此,/project/.hgignore在运行时读取,hg status --ignore如果正在运行则跳过hg status.WTF?

pyr*_*chi 6

答案1 - Dirstate Repository Corruption

我昨晚也遇到了这个问题,这让我一直试图找到原因.我最终找到了关于dirstate存储库损坏的wiki页面.涉及运行的第一步hg verify不起作用.第二步,克隆回购,确实有效!然后我删除了原始的.hg目录,并将克隆的.hg目录复制到原始位置.

我猜你在答案中,涉及提交/推送的步骤可能已经修复了存储库中的损坏.


答案2 - inotify扩展错误

在我最初解决问题并发布我的答案后,问题继续弹出,但以不同的方式:Mercurial似乎部分服从.hgignore文件,但我对它做的任何更新都没有生效.我碰巧正在玩创建一个脚本来创建几个相关的存储库,一段时间后我注意到我的机器内存不足.我跑了一个ps -e,所有这些hg进程都在内存中.所有这些过程都是inotify服务器.

Inotify是Mercurial附带的扩展,它订阅了工作目录中的任何更改,以提高hg status大型存储库的性能.该inotify的扩展页提到,"它绝对必须考虑的实验".似乎inotify服务器中的一些错误阻止了Mercurial意识到.hgignore文件已经更新,所以hg status总是使用过时版本的.hgignore.

试试我的理论并暂时让hg刷新.hgignore我执行了:

killall -s 2 hg
Run Code Online (Sandbox Code Playgroud)

此命令告诉所有驻留的inotify服务器退出.(killall就像kill,但是将信号发送到具有给定名称的所有进程.该-s 2参数发送INT信号,允许inotify正常关闭.)

之后,事情开始非常好,但是在执行hg后,inotify服务器不断弹出.为了阻止我将以下代码段放在我的hgrc文件中:

[extensions]
hgext.inotify = !
Run Code Online (Sandbox Code Playgroud)

这会禁用inotify扩展(!指示Mercurial禁用扩展).我的存储库足够小,我现在不需要它.