为什么';Mercurial是否支持通过HTTP创建远程存储库?
我知道使用HTTP远程创建Mercurial存储库是非常困难的,例如:为什么';Mercurial是否支持通过HTTP创建远程存储库?,mercurial,hgweb,Mercurial,Hgweb,我知道使用HTTP远程创建Mercurial存储库是非常困难的,例如: $ hg init https://host.org/repos/project 或 但是,原因是什么?安全问题?不需要吗?仅仅因为还没有人实施它 这个问题的理由:在我的公司,我们通过HTTPS共享大部分资源,即访问权限仅由Apache管理,普通用户不能通过SSH登录服务器。只要只需要为存储库提供服务(为此,我们很乐意使用hgwebdir.cgi)。但是,我们还希望允许远程创建repo,而无需在服务器上维护附加/修补脚本,
$ hg init https://host.org/repos/project
或
但是,原因是什么?安全问题?不需要吗?仅仅因为还没有人实施它
这个问题的理由:在我的公司,我们通过HTTPS共享大部分资源,即访问权限仅由Apache管理,普通用户不能通过SSH登录服务器。只要只需要为存储库提供服务(为此,我们很乐意使用hgwebdir.cgi
)。但是,我们还希望允许远程创建repo,而无需在服务器上维护附加/修补脚本,在客户端维护附加工具
需要明确的是:这个问题并不要求解决我们的特定问题,而是因为Mercurial本身不支持此功能的原因
更新
下面是对我所想到的情况的更技术性的描述。假定
hgwebdir.cgi
为/path/to/repos
中的存储库集合提供服务,位于https://.../repos
(已启用推送功能)。允许访问此URL(如Apache中配置的)的每个用户都可以拉入和推送更改集,这实际上意味着hgwebdir.cgi
(因此hg
)编辑并创建/path/to/repos
下面的文件。现在,让hgwebdir.cgi
也在/path/to/repos
下创建新存储库的障碍是什么?据我所知,没有一种SCM替代方案允许本地创建远程存储库。SVN、CVS、Git等
这通常是托管提供商的工作:SourceForge、Google代码、BitBucket。它们都在其授权基础设施之上实现了存储库的创建
例如,仅限于Debian开发人员,要创建一个新的存储库,您需要通过SSH登录到服务器,并在本地主文件夹上创建存储库,就像目录一样。各种答案(包括您自己的答案)给出了一些很好的理由,说明为什么功能不存在(主要是关注点分离),但是,如果您真的想添加它,您可以只使用一两行shell。这里有一个我不久前给出的非常不安全的例子,展示了如何在高度信任的环境中添加该功能:我认为原因是添加对创建存储库的支持将带来相当多的负担:
- 如果您可以创建存储库,那么您希望能够删除它们。虽然这看起来很简单,但它离Mercurial正常工作的安全方式还有一大步——标准Mercurial中没有破坏性命令
- 人们还希望编辑
文件来设置描述和联系信息——标准Mercurial从不更改配置文件,因此这又是一件新鲜事.hg/hgrc
- 人们还希望管理用户对新存储库的访问——这意味着编辑
文件或其他Web服务器的等效文件.htaccess
然而,现在有一个优秀的开源解决方案:为您提供一个“迷你Bitbucket”,您可以在自己的服务器上部署它。它将完成上述所有工作。如果我需要比普通
hgweb.cgi
更强大的东西,我会在我的服务器上安装它。它同时支持Mercurial和Git。您自己不是已经给出了答案吗?整个web设置(尤其是权限)由apache管理,Mecurial不知道如何配置或扩展特定的apache设置。@Zarat:AFAIKhgwebdir.cgi
在服务器端运行hg
,然后在存储库中编辑/删除/创建文件(通常作为web服务器用户,例如www.data)。难道hg
不应该在config.web
中指定的目录中创建新的存储库吗(当然,由www-data所有)?好吧,我认为这是一个边缘案例,我昨天自己刚刚设置了一个多存储库服务器,您需要多个CGI来获得不同的权限。我想问题是服务器设置部分不在cgi/hg的职责范围内。我同意这是一个有用的特性。目前,我们在主服务器上创建repo的当前工作流程是(通过RDP)登录到主服务器,然后手动克隆开发人员正在提供的repo。我承认,这并不需要很长时间,但如果webdir应用程序能够通过网页公开某种方式来启动克隆操作,那就更好了。这样我们就不必担心让开发人员直接RDP访问我们的主服务器了。@Zarat:是的,我知道我们需要多个CGI来获得不同的权限。但是假定hgwebdir.cgi
在/some/path
的https://.../repos
(启用推送),那么从技术上讲,允许每个有权访问此URL的人也在/some/path
下面创建回购协议应该不是什么大问题,对吧,可以使用SSH:hg clone/path/to/local/repo创建存储库ssh://host.org//absolute/path/repos/project
,因此远程创建repo的想法似乎被普遍接受。@Oben,通过SSH很容易,因为Hg具有完全的shell访问权限,在SSH shell上远程执行Hg init
命令。通过HTTP执行同样的操作意味着增加协议的复杂性,需要实现自定义规则。对于一些可以通过其他方式轻松解决的问题来说,这太麻烦了。这与HTTP有什么不同,HTTP中hgwebdir.cgi
也只运行hg
(但是作为
$ hg clone /path/to/local/project https://host.org/repos/project