带有Windows中央代码库的分布式版本控制系统

24

我们目前使用VSS进行版本控制。有几位开发人员对分布式模型感兴趣(并想摆脱VSS)。我们的网络中充满了Windows机器,尽管我们的IT部门有维护Linux机器的经验,但他们宁愿不这样做。

哪些DVCS系统可以在Windows上托管其中央仓库,并提供:

  1. 推送对仓库的访问权限
  2. 基本身份验证。主要是一种允许或拒绝对整个仓库进行访问的方式。无需精细访问。
  3. 服务器进程,因此用户不需要写入仓库,降低了意外搞乱仓库的风险。

在客户端方面,如Tortoise之类的GUI基本上是必需的(很抱歉,Windows shell太烂了 : |)。安装的便利性对我们的IT部门来说将是一个巨大的优势。使用Windows凭据进行身份验证将是一个优势,但不是必需的,只要客户端能够存储凭据即可。

我快速浏览了Git、Mercurial和Bazaar。

  • Git似乎使用ssh或简单的WebDAV进行仓库访问,需要用户的写入权限。
  • Mercurial有一个内置的http服务器,但这似乎只是用于拉取目的。更新:Mercurial也支持推送。
  • Bazaar似乎使用sftp进行仓库访问,同样需要用户的写入权限。

是否有任何DVCS系统的Windows服务器进程,并且是否有人在Windows上设置过?

如果这是重复的问题,则表示抱歉。我找不到它。

更新

已通过Mercurial实现了推送!可以在下面的答案中找到所需的详细列表。


既然你已经看到了如何让"hg serve"接受推送,你可能想要现在更新一下问题。 - Martin Geisler
太棒了。感谢详细的说明! - mmacaulay
7个回答

17

在Windows系统上,Mercurial几乎肯定是您最简单的选择。

如果您不关心身份验证,您实际上可以轻松地允许hg serve进行推送。要这样做,您只需要将以下内容添加到要提供服务的存储库中的.hg/hgrc文件中:

[web]
allow_push = *
push_ssl = false

第一行表示任何人都可以将内容提交到这个仓库。第二行告诉Mercurial允许在没有SSL的情况下进行推送,因为hg serve目前不支持HTTPS。此时,用户可以在没有任何账户的情况下向您的仓库推送。如果您只是一个小商店,那么这可能还好——特别是因为您可以使用Mercurial的签名变更集功能来保证比HTTP基本认证提供更高的可验证性水平。
但对于一个更大的商店,你肯定希望有至少一个简单的提交屏障。要做到这一点,需要进行两个更改。首先,您需要将Mercurial放在一个具有反向代理支持或CGI支持的Web服务器后面。值得庆幸的是,最近的IIS版本都支持这两种方式。您可以查阅Mercurial Redbook中的CGI指南获取Mercurial特定的步骤,以及Microsoft在IIS 6中设置CGI应用程序的指南获取IIS方面的帮助。
接下来,您需要设置一些基本的身份验证。IIS提供了HTTP Basic身份验证,作为额外的奖励,它可以直接对您的域进行身份验证,从而将管理开销降至最低。

最后,您需要更改allow_push行,通过指定逗号分隔的用户名称列表来仅支持特定用户。例如:

allow_push = benjamin, ted, the_cow

就这样,Mercurial现在将允许那些可以通过HTTP基本身份验证进行身份验证的用户进行推送,并允许其他所有人进行拉取。


目前正在尝试这个。目前在设置方面遇到了一些困难,但看起来非常有前途!我不知道Mercurial提供了一个用于Web服务的CGI脚本。 - Mikko Rantanen
我觉得我快成功了。CGI脚本在shell中执行,但在IIS上出错了。 - Mikko Rantanen
如果您能告诉我哪里出了问题,我很乐意向Mercurial Redbook提交更正并更新此问题。 - Benjamin Pollack
我本来正在写回答,但决定先测试推送 - 结果没有成功。现在终于搞定了。 :) 我会发布更详细的帖子。 - Mikko Rantanen
完成了这篇文章。仍然需要查看是否可以在某些时候使用NTFS目录安全性进行访问控制,而不是仓库配置,但这并不是很重要。主要的是我终于让它工作了!\o/ 非常感谢! - Mikko Rantanen

12

在Benjamin指出使用HTTP服务CGI脚本后,我决定尝试一下并成功地将代码库托管到了HTTP上。 Benjamin提供的链接“The Redbook”非常有帮助,还有两篇Mercurial Wiki文章。其中一篇介绍了Mercurial发布的基本知识,另外一篇包含了HgWebDir CGI脚本的逐步说明

不过这些说明并不是完全傻瓜式的,所以我不得不花时间探索。很可能是因为我使用的是64位Vista。下面的说明记录了我所做的事情。现在我已经完成了一次,我可能会按照另一种顺序操作,所以不要把这些视为详细步骤。

Mercurial

首先,我从http://mercurial.berkwood.com/获取了Mercurial二进制文件,并将其安装到d:\dev\Mercurial。我使用hg initd:\dev\testRepo下创建了一个测试代码库。 d:\dev\Mercurial\library.zip包含CGI脚本所需的Mercurial库文件,因此它们被提取到d:\dev\Mercurial\library中。一开始让我困惑的是,当我打开zip文件时,我收到了错误消息并且看不到任何内容。但是,将文件提取到目录中就可以工作。

对于网络脚本,我下载了Mercurial源代码,其中包括hgwebdir.cgi,将其移动并重命名为d:\dev\Mercurial\webroot\hgwebdir.py。逐步说明包含了修改Windows下hgwebdir脚本的良好说明。他们还包含了关于hgweb.config的说明,在我的情况下看起来像这样:

[paths]
/hg/hgwebdir.py/test = D:\dev\Mercurial\testRepo

此外,仓库需要以下配置,以便我可以在没有SSL的情况下推送。请注意,我目前正在使用基本身份验证来验证用户。我不得不在D:\dev\Mercurial\testRepo\.hg\hgrc创建配置文件,并添加以下行:

[web]
allow_push = *
push_ssl = false

Python

这个CGI脚本是一个Python脚本,因此需要安装Python。它对执行它的Python版本非常挑剔。其中一篇文章提到运行它需要与构建Mercurial所使用的相同版本。最终,在尝试了Python 2.6 x64、Python 2.4、Python 2.5 x64之后,我在Python 2.5 x86上使其工作。

IIS

我错过的两件事是需要安装CGI支持和基本身份验证。这两者可以通过控制面板中的程序和功能进行安装。完成安装后,我在IIS中创建了一个虚拟目录(后来将其更改为应用程序),指向D:\dev\Mercurial\webroot。虚拟目录需要 *.py 文件的 CGI 处理程序,可以从处理程序映射中添加。可执行文件是D:\dev\SDKs\Python25_x86\Python.exe %s。一旦IIS有权限访问webroot目录,就可以导航到http://localhost/hg/hgwebdir.py/test查看存储库。

现在读取访问已经生效。当我尝试向仓库推送时,我收到了奇怪的错误消息,告诉我它不是真正的仓库。

经过一个小时的调试,我最终将整个D:\dev\Mercurial\library\mercurial树复制到webroot下,以便Python可以找到D:\dev\Mercurial\webroot\mercurial\hgweb\hgwebdir_mod.pyc。此后,Wireshark在堆栈跟踪中报告访问被拒绝错误。我不知道真正的原因是什么,但是将虚拟目录转换为IIS中的应用程序并将其移动到使用本地系统帐户运行的应用程序池的顶部后,拒绝访问错误消失了。

还有一次,我给HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WinSock2\Parameters注册表键赋予了更多权限,以便IIS可以访问它。使用本地系统帐户后,这些键可能不需要这些权限。

完成所有这些操作后,使用hg push http://localhost/hg/hgwebdir.cgi/test 就能够成功向存储库推送内容了!

问题和解决方案

  • 如何找到库文件。
    • 它们在Mercurial安装文件夹下的library.dll中。即使我的解压程序拒绝查看其内容,我也必须提取它们。
  • 如何运行Python脚本
    • 下载x86架构的正确Python版本,因为该脚本使用了一些x86库。正确的Python版本取决于Mercurial版本。对于1.2.1版本,它是Python 2.5 x86。
    • 或者,您可以尝试使用任何想要的Python版本从源代码构建Mercurial,但在我的情况下,当构建扩展时,这种方法失败了。
  • 如何在IIS中设置CGI
    • 首先确保在IIS中安装了CGI。这不是Benjamin发布的IIS说明中假定的。
    • 在IIS处理程序映射中

1
非常感谢您提供了详细的操作步骤!我会将您的建议合并到书中,并提交给作者进行包含。 - Benjamin Pollack

7

阅读了Mikko的答案后,我为自己安装写下了一些笔记。我的设置是一个“非保护和开放”的仓库,我的团队成员可以在Windows 2008服务器上使用。

1. 安装Python。

我使用的Python版本是Python 2.6.2,使用了Windows x86 MSI Installer。

  • 为所有用户安装。
  • 安装到C:\Mercurial\Python。
  • 使用默认功能选项。

2. 安装MinGW。
我使用的是MinGW 5.1.4版的Minimalist GNU for Windows。

  • 安装MinGW-5.1.4.exe。
  • 选择下载和安装选项。
  • 选择当前软件包选项以进行安装。
  • 对于要安装的组件,请选择“Minimal”选项。
  • 安装到C:\Mercurial\MinGW。

3. 修改您的路径。

此时,您需要添加环境路径的位置。

  • 将'C:\Mercurial\Python26;C:\Mercurial\MinGW\bin'添加到路径中(顺序很重要)。

4. 安装Mercurial。

我使用的是稳定分支中最新版本的mercurial,没有使用二进制文件,而是使用了源代码。我想自己编译mercurial,以便它可以与我安装的任何Python版本一起工作,因此我不必担心任何兼容性问题,这是我发现其他安装方法最大的挑战。获取源代码的最简单方法是通过下载“zip”文件。 Mercurial稳定版发布

  • 将Zip文件提取到C:\Mercurial\Source。
  • 在命令提示符下构建源代码。
python setup.py build --force -c mingw32
python setup.py install --force --skip-build

5. 修改您的路径。

您需要在环境路径中插入另一个位置以进行'hg'命令。

  • 将'C:\Mercurial\Python26\Scripts;C:\Mercurial\Python26;C:\Mercurial\MinGW\bin'添加到路径中(顺序很重要)。

6. 创建您的配置文件。

如果您要在此服务器上本地提交任何内容,需要设置默认用户名。
  • 创建文件'"C:\Documents and Settings{username}.hgrc"'
[ui]  
editor = Notepad  
username = your_name 

6. 测试安装。

打开一个新的命令窗口,并使用 'hg debuginstall' 进行验证。您应该会看到以下信息。

Checking encoding (cp1252)...  
Checking extensions...  
Checking templates...  
Checking patch...  
Checking commit editor...  
Checking username...  
No problems detected  

7. 设置Web目录。

  • 创建目录'C:\Mercurial\Web'
  • 将hgwebdir.cgi文件从'C:\Mercurial\Source'复制到'C:\Mercurial\Web'

8. 为集中式存储库配置IIS7。

我使用了DefaultAppPool,它使用.Net 2.0、Pipeline=Integrated、Identity = ApplicationPoolIdentity。

  • 确保在IIS7中可用CGI功能。
  • 控制面板/程序/Windows功能/IIS/App开发功能/CGI
  • 在所需的网站上添加应用程序。
  • 别名=Mercurial -- 物理路径=C:\Mercurial\Web
  • 在应用程序上选择HTTP模块并添加一个新的模块映射。
    • 请求路径=*.cgi,模块=CgiModule,可执行文件=C:\Mercurial\Python26\python.exe %s,名称=Mercurial。
    • 当提示添加条目到ISAPI和CGI限制列表时,选择是。

9. 测试您的Web设置。

现在,您应该能够浏览http://localhost/Mercurial/hgwebdir.cgi并查看空的存储库列表。

10. 为友好的URL配置IIS7

我不喜欢不友好的URL,这一步允许我们将URL重定向到更友好的内容。安装IIS的URL Rewrite Moduel 1.1扩展程序。

  • 在IIS管理器功能视图中对Mercurial IIS应用程序进行选择,并选择URL Rewrite组件,然后安装一个新规则。
  • 选择添加规则,然后选择模板“带有重写映射的规则”。规则操作=重写,指定重写映射=Mercurial
  • 添加映射条目。原始值='/Mercurial/Repo',新值='/Mercurial/hgwebdir.cgi'

11. 创建Mercurial存储库

您现在可以创建一个测试仓库。
  • 创建目录C:\Mercurial\Repository并确保IUSR帐户具有写入该目录的权限。(如果是域帐户,则更像是IUSR_{计算机名称}。)
  • 创建文件C:\Mercurial\Web\hgweb.config以列出存储库。
[paths]
/ = C:\Mercurial\Repository\**
  • 添加目录C:\Mercurial\Repository\Test并使用'hg init'初始化存储库

** 如果您现在想要能够无需ssl进行推送,请在存储库的.hg目录中创建一个名为hgrc的文件,并添加以下行。

[web]
allow_push = *
push_ssl = false

参考资料:

Mercurial Wiki Windows Install
HG Book
Step by Step
Publishing Mercurial Repositories


1
很棒的指南!我建议使用“hg debuginstall”来验证安装。Bryan的书通常被称为“HG Book” :-) - Martin Geisler
很好!我很好奇你需要MinGW做什么?我想我的所有电脑上都已经安装了它,但是我没有想到Mercurial或Python会使用它。我也打算进入一个开放的代码库。在使用Mercurial时,我遇到过用户认证问题,无法通过Mercurial客户端使用集成Windows身份验证,而基本认证方式下,Mercurial不能像Subversion那样记住凭据。 - Mikko Rantanen
我使用MinGW进行编译。你可以选择其他编译器,并在编译命令中指定它。 python setup.py build --force -c mingw32 - degnome
我错过了“从源代码安装”的部分。我的错误! - Mikko Rantanen

2

对于第一次远离VSS的团队,我建议使用SubVersion进行源代码控制,并使用TortoiseSVNVisualSVN作为客户端。

但是,如果团队已经决定切换到分布式版本控制系统,则我建议使用Mercurial,因为它通过TortoiseHg在客户端上具有更好的HTTP和Windows支持


我相信我们的大多数开发人员都熟悉像Subversion这样的非VSS源代码控制。其中最大的需求之一是本地提交,而Subversion不支持此功能。根据SO上其他DVCS答案,我得出结论Mercurial可能是最好的选择,但我无法通过快速搜索找到在Windows下托管中央仓库的方法。感谢您的意见! - Mikko Rantanen

0

抱歉我要挖坟并且自我推销,但是我刚发布了HgLab的alpha版本,它是一个Mercurial服务器,支持完整的拉取-推送功能和Active Directory集成,适用于Windows系统。


在我的观点中,IIS和SQL Server以及Windows Server 2003或更高版本的要求列表是过度的。 - Lazy Badger
仅仅是个人意见 - 我更喜欢尽可能少依赖于其他库的解决方案,过多的依赖对我来说就像是一个停止标志。 - Lazy Badger
与在Windows上安装“本地”Mercurial所需的内容(Apache和Python或IIS和Python),更不用说需要将其与Active Directory集成所需的内容相比,这算不了什么。 - Anton Gogolev
在Windows上使用本地Mercurial,工作场所只需要TortoiseHG。对于a)中央和b)托管存储库,SCM-Manager甚至需要更少的努力。 - Lazy Badger

0

SCM-不受限制(在某种程度上)的Windows解决方案,具有存储库前端和管理功能,今天可能是SCM-Manager(Git、Mercurial、SVN repo开箱即用,仅需要JVM)


0

如果您正在寻找以下内容:

  1. 分布式开发支持
  2. 无缝运行Windows服务器
  3. 以及出色的GUI界面

那么您完全可以选择Plastic SCM


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