【问题标题】:Why doesn't Mercurial support remote repository creations over HTTP?为什么 Mercurial 不支持通过 HTTP 创建远程存储库?
【发布时间】:2011-02-08 13:24:01
【问题描述】:

我知道使用 HTTP(S) 远程创建 Mercurial 存储库是 not possible,例如:

$ hg init https://host.org/repos/project

$ hg clone /path/to/local/project https://host.org/repos/project

但是,这是什么原因呢?安全问题?不需要吗?仅仅因为还没有人实现它?

这个问题的基本原理:在我的公司,我们通过 HTTPS 共享大部分资源,即访问权限仅由 Apache 管理,普通用户无法通过服务器上的 SSH 登录。只要只需要提供存储库,这就是完美的(为此,我们对hgwebdir.cgi 感到满意)。但是,我们还希望允许远程创建存储库,而无需在服务器上维护额外的/修补过的脚本以及在客户端上维护额外的工具。

明确一点:这个问题并不是要解决我们的特定问题,而是因为 Mercurial 本身不支持此功能。


更新

下面是对我正在考虑的情况的更技术性的描述。假设hgwebdir.cgi/path/to/repos https://.../repos 中的存储库集合提供服务(启用推送)。每个允许访问此 URL(如 Apache 中配置)的用户都可以拉取和推送变更集,这实际上意味着 hgwebdir.cgi(因此 hg)在 /path/to/repos 下编辑和创建文件。现在,让hgwebdir.cgi/path/to/repos 下创建新存储库的障碍是什么?

【问题讨论】:

  • 你自己不是已经给出答案了吗?整个网络设置(尤其是权限)由 apache 管理,Mecurial 不知道如何配置或扩展您的特定 apache 设置。
  • @Zarat: AFAIK hgwebdir.cgi 在服务器端运行 hg,然后在存储库中编辑/删除/创建文件(通常作为网络服务器用户,例如 www-data我>)。 hg 不应该能够类似地在config.web 指定的目录中创建新的存储库(当然也属于www-data)吗?
  • 好吧,我认为这是一个边缘案例,我昨天自己设置了一个多存储库服务器,你需要多个 cgis 来获得不同的权限。我想问题是服务器设置部分超出了 cgi/hg 的职责。
  • 我同意这将是一个有用的功能。目前,我们在主服务器上创建 repo 的当前工作流程是登录(通过 RDP)到我们的主服务器,然后手动克隆开发人员的 repo,他是 hg serve'ing。我承认这不会花很长时间,但如果 webdir 应用程序暴露某种方式来通过网页启动克隆操作会更好。这样我们就不必担心让开发人员直接 RDP 访问我们的主服务器。
  • @Zarat:是的,我知道我们需要多个 CGI 来获得不同的权限。但是假设hgwebdir.cgihttps://.../repos 提供/some/path 中的集合(启用推送),那么从技术上讲,允许访问此URL 的每个人也可以在/some/path 下面创建存储库应该不是一个大问题,对吧?

标签: mercurial hgweb


【解决方案1】:

我认为原因是添加对创建存储库的支持会带来相当多的包袱:

  • 如果您可以创建存储库,您希望能够删除它们。虽然这看起来很简单,但与 Mercurial 正常工作的安全方式相比,这将是一大步——标准 Mercurial 中没有破坏性命令。

  • 人们还想编辑 .hg/hgrc 文件来设置描述和联系信息——标准 Mercurial 从不更改配置文件,所以这又是一个新事物。

  • 人们还希望管理用户对新存储库的访问——这意味着编辑 .htaccess 文件或其他网络服务器的等效文件。

... 等等。实现这个“小”功能会带来很多额外的功能请求,而且我们只有少数 Mercurial 开发人员同时也是网络开发人员。

但是,现在有一个出色的开源解决方案:Kallithea 为您提供了一个“mini-Bitbucket”,您可以将其部署在您自己的服务器上。它将完成上述所有工作。如果我需要比普通的hgweb.cgi 更强大的东西,我会在我的服务器上安装它。它同时支持 Mercurial 和 Git。

【讨论】:

  • 我明白你的意思。尽管可以通过相对较少的努力来创建存储库,但几乎每个人都希望在此之上有更多 - 和不同的 - 功能。
  • 是的,在保持 Mercurial 核心的精简和可维护性与为人们提供他们需要的所有功能之间是一场永恒的斗争。我认为在这里将人们推荐给第三方来源是可以的,这样我们就可以专注于 Mercurial 的核心问题。
  • 那么,您可以轻松创建它们并轻松隐藏它们。谁说你永远需要删除它们?如果没有其他人先写,我将完全写出这样的功能。 (如果我这样做,用户会想要更多的东西,这不是让用户需要的工作流更容易的有效借口。)
【解决方案2】:

据我所知,没有任何 SCM 替代方案允许本地创建远程存储库。 SVN、CVS、Git 等。

这通常是托管服务提供商的工作:SourceForge、Google Code、BitBucket。他们都在其身份验证基础架构之上实现了存储库创建。

例如,Debian's Mercurial hosting 仅限于 Debian 开发人员,要创建新存储库,您需要通过 SSH 登录到服务器并在本地主文件夹中创建存储库,就像 Apache's public_html 目录一样。

【讨论】:

  • 虽然,可以使用 SSH 创建存储库:hg clone /path/to/local/repo ssh://host.org//absolute/path/repos/project,所以基本上远程创建存储库的想法似乎被接受了。
  • @Oben,通过 SSH 很容易,因为 Hg 拥有完整的 shell 访问权限,可以在 SSH shell 上远程执行 hg init 命令。在 HTTP 上做同样的事情意味着给协议增加额外的复杂性,需要实现自定义规则。用其他方法很容易解决的事情,太麻烦了。
  • 这与 HTTP 有何不同,其中hgwebdir.cgi 也只是运行hg(但作为 Web 服务器用户)?
  • @Oben,我明白你的意思。这听起来是一个错误/功能/增强功能,您可能想在 BTS 上提交一个:mercurial.selenic.com/bts
  • 你说得对,同时我也认为这个问题可能更适合 mercurial 邮件列表。
【解决方案3】:

各种答案(包括您自己的答案)给出了一些很好的理由说明为什么该功能不存在(主要是关注点分离),但如果您真的想添加它,您可以只用一两行 shell。这是我很久以前给出的一个非常不安全的示例,展示了如何在 高度信任 环境中添加该功能:Remote Repository Creation in Mercurial over HTTP

【讨论】:

  • 是的,我已经阅读了您的帖子(它与我的问题中提到的问题之一相关联)。事实上,我们目前使用自己的 CGI 脚本,但考虑到可维护性,集成解决方案会好得多。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多