我有一个受版本控制的项目,比如/project
和位于.hgignore
的/project/.hgignore
。它的语法似乎是正确的,但是问题是,对于某些用户,此文件将被完全忽略,而对于其他用户,仍将对其进行分析。
说,运行
su -l dipsy -c 'cd /project; hg status'
显示正确的结果,忽略正确的文件,而
su -l laalaa -c 'cd /project; hg status'
还输出
/project/.hgignore
中列出的文件。我已经检查过的内容:
~/.hgrc
文件对于两个用户而言都是相同的,因此hg showconfig
的输出也是如此。 /project/.hgignore
并对其进行写入。 我想念什么?
(以防万一:Debian Lenny,Mercurial 1.6.3)
//很抱歉,如果用户名看起来很愚蠢,那么它们不是真实的(:
-添加2010-11-26-
PS。有什么方法可以启动hg并在处理
.hgignore
-s时获取调试输出吗? 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
调试
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
因此,在运行
/project/.hgignore
时会读取hg status --ignore
,而在仅运行hg status
时会跳过。 WTF? 最佳答案
答案1-Dirstate存储库损坏
昨晚我也遇到了这个问题,它使我无所适从,试图找出原因。我最终在dirstate repository corruption上找到了一个Wiki页面。涉及运行hg verify
的第一步无效。第二步,克隆存储库,成功了!然后,我删除了原始的.hg目录,并将克隆的.hg目录复制到原始位置。
我猜在您的答案中,涉及提交/推送的步骤可能已修复了存储库中的损坏。
答案2-使扩展程序错误化
在我最初解决问题并发布答案之后,问题继续出现,但是以另一种方式出现:Mercurial似乎部分遵守了.hgignore文件,但是我对此所做的任何更新都没有生效。我碰巧正在创建一个脚本来创建几个相关的存储库,不久后我发现我的机器内存不足。我运行了一个ps -e
,所有这些hg
进程都卡在内存中。所有这些进程都是inotify服务器。
Inotify是Mercurial随附的扩展,它可以订阅工作目录中的所有更改,以提高大型存储库上hg status
的性能。 inotify extension page提到“绝对必须将其视为实验性的”。看来inotify服务器中的某些错误阻止Mercurial意识到.hgignore文件已被更新,因此hg status
始终使用过时的.hgignore版本。
为了尝试我的理论并暂时让hg刷新.hgignore,我执行了以下命令:
killall -s 2 hg
此命令告诉所有驻留inotify服务器退出。 (
killall
类似于kill
,但是将信号发送给具有给定名称的所有进程。-s 2
参数发送INT信号,允许inotify正常关闭。)在那之后,一切开始很好地运行,但是在执行hg之后,inotify服务器不断弹出。为此,我在hgrc file中添加了以下代码段:
[extensions]
hgext.inotify = !
这将禁用inotify扩展名(
!
指示Mercurial禁用扩展名)。我的存储库非常小,以至于我现在不需要它。关于mercurial - .hgignore没有为特定用户解析,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4286430/