哪个协议?svn:// 还是 http(s)://?

62

SVN的网络访问有四种常见协议。

svn://repos
svn+ssh://repos
https://repos
http://repos

维基百科页面对这四种协议的区别没有多少说明。我一直喜欢使用 svn://,因为它很容易设置,但它们之间有什么区别,哪一个更好呢?

6个回答

58

http:// 在处理成千上万个小文件时,存在严重的开销问题。我曾为一个包含大约 50,000 个图标的网站使用 svn。使用 HTTP 协议进行检出需要大约 20 分钟的时间。而一旦我切换到 svn://,检出时间只需要不到一分钟。这是因为使用 HTTP 协议时每个文件都需要新建一个 HTTP 请求。

然而,http:// 有以下一个很大的优势:通常能够穿过防火墙。例如,现在我已经切换到 svn://,就无法从我的大学访问我的代码库了,因为大学使用的是防火墙。

关于使用 SSL/TLS 或不使用的区别,显而易见:数据被加密,但是设置起来更加困难。


5
http(s)://的另一个优点是符合WebDAV标准,这意味着您可以在资源管理器或其他WebDAV客户端中挂载这些存储库。请参阅http://svnbook.red-bean.com/nightly/en/svn.webdav.html。 - Stefan
5
从1.7版本开始,Svn不再采用WebDAV标准,原因是涉及巨大的开销,并且缺乏WebDAV客户端。 - whitey04
2
因为这个答案已经过期所以被踩了。SVN 1.7及之后版本大大改进了HTTP(S)的使用,而svnserve和Apache上的HTTP(S)之间的速度差异并不是那么大。 - bahrep

22

svn+ssh 是在 SSH 隧道内运行的 svn 协议。客户端使用 SSH 登录远程服务器,并在该隧道中远程运行 svn 命令。在我看来,svn+ssh 是在远程系统上使用 Subversion 仓库的最简单方法,因为你不需要在该系统上启动任何服务器,假设你已经有一个运行 SSH 服务器的环境。

此外,svn+ssh 受到 SSH 的加密保护。不要在不受信任的网络上使用原始的 svn 协议。

svn+ssh 的主要问题是它需要远程机器上的 shell 访问权限。很难让某人访问仓库而不给他整个 shell 帐户的访问权限。为此,你需要 HTTP-based 方法之一,即 httphttps(最好选择 https,因为它包含了加密和认证层)。这些方法更复杂配置(你需要一个 HTTP/HTTPS 服务器,例如 Apache),但允许仓库管理员精确控制仓库访问权限。


使用svn+ssh,可以轻松限制对svn的访问。 - Johan Boulé
2
@JohanBoulé,请解释一下如何操作。 - Dwayne Towell
@DwayneTowell,我认为意思是通常只需管理运行SSH服务器的系统上的用户即可。 - zb226

7

https://svn+ssh://都是加密的,因此更安全。这些协议可用于传输安全数据(例如您的SVN密码)。

如果类似于Git,svn+ssh://https://更快,而svn://http://更快。


1
我其实对svn+ssh并不是很了解。这需要服务器上的什么样的支持?必须要有一个在服务器上拥有shell的ssh账户吗?不能匿名访问吗? - Earlz
SVN+SSH基本上与svn://相同,只是您通过SSH隧道进行操作。如果匿名访问对您很重要,那么这不是您想要追求的选项。 - Eric Kolb
@earlz:您需要一种具有文件系统访问权限的帐户来访问存储库,并且具有运行“svn”(或其他某些二进制文件)的权限。 - Thomas
@Eric:如果你愿意的话(虽然并不推荐或合理),你可以启用SSH以实现匿名访问。 - Andreas Bonini
@Andreas:确实如此。我默认人们打算基于合理的考虑设计安全协议,所以这个警告并没有想到我。:) 话虽如此,如果你的目标是使用子版本库进行公共、匿名、端到端安全的流量传输,那么HTTPS将是明智的选择。 - Eric Kolb

5
有人可能会说,当访问Subversion存储库时,svn://svn+ssh://比普通的HTTP或安全的HTTPS提供更好的性能和速度,但现在这并不是真的。虽然svn://svn+ssh://比HTTP(S)更快,但差异不像在SVN 1.6或早期版本中那样大。 使用最新的Subversion 1.7+客户端和服务器,HTTP(S)没有主要性能问题。

Subversion 1.7实现了HTTP(S)访问,由于使用了HTTPv2协议,在高延迟网络连接上表现得更加出色(不要与HTTP/2混淆!)Subversion 1.8从libneon切换到libserf以进行HTTP(S)访问,而libserflibneon提供更好的性能。

如果您认为HTTP(S)或Subversion在HTTP(S)上运行的性能存在问题,您应该调查是否有任何网络服务使HTTP(S)变慢。根本原因可能是杀毒软件、活动防火墙或代理。更不用说网络设置配置错误了。别忘了使用最新的Subversion客户端和服务器!

在考虑网络配置问题的例子时,似乎存在一个相当普遍的问题,影响了在没有访问Windows更新站点(http://ctldl.windowsupdate.com/)的断开网络上工作的客户端计算机。这是一个关键性问题,影响了广泛的系统服务,但仅在使用HTTPS的Subversion客户端时,最终用户才会注意到并报告此问题。该问题看起来与性能有关,但实际上并非如此。请查看此StackOverflow线程以获取更多信息:https://stackoverflow.com/a/38499619/761095


据我所知,一些操作(如果不是全部)通过 https 比 svn+ssh 更快。 - xmedeko

4

3

httphttps由Subversion支持的Web服务器模块处理,因此你可以使用基于HTTP的身份验证(通过.htaccess配置)来限制对你的仓库的访问。


2
嗯,你也可以在svnserve中进行身份验证。只是它的实现方式略有不同。 - Andreas Bonini
是的,如果您有100个存储库属于同一开发人员组,您需要在任何存储库之间传输配置文件。这样,您只需要一个文件即可让他们访问,并且对其进行的每个更改都将控制对任何存储库的访问。 - Vestel
您可以使用svnserve +符号链接来获得相同的效果。此外,为同一开发人员组创建多个存储库没有意义,并且官方svn书籍也不鼓励这样做。 - Andreas Bonini
我有一个由7人组成的开发团队,他们正在处理几个客户项目。他们必须能够访问存储库和“完整实时预览”,这些都位于一台计算机上。除此之外,没有其他人应该能够访问实时预览。 我可以配置我的Apache,只有他们才能访问多个文件夹和URL,并且当其中一名开发人员离开团队时,我只需要在一个地方更改访问权限即可。 - Vestel
2
使用HTTP,可以更轻松地使用Windows Active Directory进行身份验证。这在Windows环境中非常方便。 - myron-semack

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接