6

我正在使用 hgweb 提供对许多 mercurial 存储库的访问,并将它们作为一个集合提供:

[collections]
/home/me = /home/me/projects

这在 localhost/projects 为他们提供服务

我在那个位置有大约 30 个存储库,在一个源代码树中,还有相当数量的其他非 Mercurial 管理的项目。

hgweb 的响应速度真的很慢;http://localhost/提供一个列表大约需要 30 秒,打开一个项目大约需要 30 秒,这使得将其用于共享目的很痛苦。

我该如何调整它以使其更快?

我在 OSX 上运行,如果它有所作为。

4

4 回答 4

7

作为开源替代品,您可以使用 RhodeCode http://rhodecode.com,它是完全用 Python 编写的 hgweb 替代品。

  • 有自己的中间件来处理 mercurial 协议请求每个请求都可以被记录和验证 + 线程性能不太可能 hgweb
  • 每个项目的完全权限读/写/管理访问,即使在善变的请求下
  • mako 模板可让您自定义应用程序的外观。
  • diffs 注释和源代码都由 pygments 着色。
  • mercurial 分支图和 yui-flot 供电图
  • 用于执行用户/权限管理以及存储库管理的管理界面。
  • mercurial web 的附加设置,(可从管理面板编辑的挂钩!)还管理路径、存档、远程消息
  • 备份脚本可以备份整个应用程序并通过 scp 将其发送到所需位置
  • 在内置数据库中设置项目描述和信息,以实现简单的非文件系统操作
  • 存储库代码的完整搜索文本
  • 在推送/回购管理中添加了缓存和失效,以实现高性能并始终保持最新数据。
  • RSS / atom feed,gravatar 支持
  • 基于 pylons 1.0 / sqlalchemy
于 2010-08-20T19:37:42.297 回答
5

AFAIK,hgweb将扫描[collections]其配置文件中条目的所有子目录。由于那里有很多非 Mercurial 目录,因此它必须对每个目录的每个子目录进行扫描。相反,它可以在包含 Mercurial 存储库的目录树的顶层停止扫描,因为它会在.hg那里看到目录。

如果您使用的是较新的 Mercurial(看起来是 1.1 之后的版本),请尝试将 更改hgweb.config为使用一个[paths]部分,并为每个 Mercurial 存储库提供明确的条目。

于 2010-08-10T23:25:18.947 回答
1

问题可能是服务器在每个请求期间递归搜索 repos。听起来你在那里有一个相当大的目录,所以这是有道理的。

此表示法适用于首选[paths]属性,但我不确定它是否有助于该[collections]属性。尝试更改为

[collections]
/home/me = /home/me/projects/*

所以它只会向下搜索一级。

在此处查看有关此问题的更多信息: https ://www.mercurial-scm.org/wiki/HgWebDirStepByStep

如果这不起作用,那么如果您更改[paths]并使用该*符号,它肯定会起作用。

于 2010-08-10T23:25:46.747 回答
1

跟进上面 Niall 非常有用的答案,我意识到我需要一个工具来维护这个 [paths] 部分。我最终选择了这个(它使用了 M. Foord的 configobj。

#!/usr/bin/env python
from __future__ import print_function

import os

from configobj import ConfigObj

hgweb_path = os.path.join(os.path.expanduser("~"), "Library", "Preferences", "hgweb.config")
projects = os.path.join(os.path.expanduser("~"), "projects")

config = ConfigObj(hgweb_path)

paths = []

def add_mercurial(arg, dirname, names):
  if '.hg' in names:
    paths.append(dirname[len(projects) + 1:])

os.path.walk(projects, add_mercurial, None)

config['paths'] = {}

for path in paths:
  config['paths']["projects/" + path] = os.path.join(projects, path)

config.write()

该脚本由 OS X 相当于 cron 每 15 分钟运行一次,并确保我的 hgweb 永远不会过时。

于 2010-08-12T02:20:32.910 回答