- 引言
- 本书涉及的内容
- 第 1 部分 Python 开发入门
- 第 1 章 Python 入门
- 第 2 章 开发 Web 应用
- 第 3 章 Python 项目的结构与包的创建
- 第 4 章 面向团队开发的工具
- 第 5 章 项目管理与审查
- 第 6 章 用 Mercurial 管理源码
- 第 7 章 完备文档的基础
- 第 8 章 模块分割设计与单元测试
- 第 9 章 Python 封装及其运用
- 第 10 章 用 Jenkins 持续集成
- 第 11 章 环境搭建与部署的自动化
- 第 12 章 应用的性能改善
- 第 13 章 让测试为我们服务
- 第 14 章 轻松使用 Django
- 第 15 章 方便好用的 Python 模块
- 附录 A VirtualBox 的设置
- 附录 B OS(Ubuntu)的设置
6.1 Mercurial 版本库的管理与设置
Mercurial 是分布式版本管理系统,所以原则上是不需要 Subversion 那种中央版本库的。但是,开发团队成员之间共享成果(变更集)时,如果仅凭对等(Peer To Peer)方式进行交流,效果是十分有限的。为解决这一问题,需要在所有开发成员都能随时访问的服务器上设置一个中央版本库,用它来共享成果。接下来将要介绍的,就是在服务器上设置中央版本库的步骤。
6.1.1 服务器上的 Uinx 用户群设置
要想对文件系统上的 Mercurial 版本库进行操作,必须能在对象版本库内的“.hg”目录下进行读写,这就需要相应的访问权限。因此,用版本库进行开发的 Unix 用户需要设置为同一用户群来集中管理。
我们创建名为 dev 的群作为本例的开发者群(LIST 6.1)。这需要以管理员权限执行 groupadd 命令。
LIST 6.1 创建 dev 群
$ sudo groupadd dev
然后用 useradd 命令给 dev 群新建用户,用户名指定方法如 LIST 6.2 所示。
LIST 6.2 新建 dev 群的用户
$ sudo useradd -g dev <username>
即通过 <username> 指定用户名。
NOTE
指定 -m 选项可以创建主目录。
指定 -s 选项可以设置登录时使用的shell。
另外,向群中添加已有用户时要用 usermod 命令(LIST 6.3)。
LIST 6.3 向 dev 群添加已有用户
$ sudo usermod -a -G dev <username>
NOTE
用户群的修改内容不会对已登录服务器的用户立刻生效。直到下次登录时才会应用新的群。
6.1.2 创建版本库
由于服务器上要放好几个版本库,所以我们新建一个统一存放版本库的目录。本例的路径为 /var/hg/(LIST 6.4)。各版本库要在这个目录下创建。
LIST 6.4 创建 /var/hg/ 目录
$ sudo mkdir /var/hg/
接下来我们在这个目录下新建一个版本库。执行 hg init 命令,新建名为 testrepo 的版本库(LIST 6.5)。
LIST 6.5 创建 testrepo 版本库
$ sudo hg init /var/hg/testrepo
然后把版本库内“.hg”目录的所有权交给 dev 群,让 dev 群的用户能够对该版本库进行写入操作(LIST 6.6)。
LIST 6.6 将版本库的群改为 dev
$ sudo chgrp -R dev /var/hg/testrepo/.hg
另外还需要设置 SGID(Set Group ID),保证向版本库写入时,文件的所有者是 dev 群(LIST 6.7)。
LIST 6.7 设置 SGID
$ sudo chmod g+sw -R /var/hg/testrepo/.hg
这样我们就有了一个可多用户共同使用的版本库。
6.1.3 hgrc 的设置
要想在服务器端执行钩子(Hook)脚本,必须使用可信群或可信用户(关于钩子脚本的相关知识将在 6.2 节学习)。我们在 hgrc 的 trusted 节的 groups 中添加 dev 群。如果该文件不存在,则直接新建。至于 hgrc 的路径,假如版本库路径为 /var/hg/testrepo/,则 hgrc 位于 /var/hg/testrepo/.hg/hgrc。clone 来的版本库会自动生成这个文件,而用 init 创建的版本库并不会自动生成,需要手动创建(LIST 6.8)。
LIST 6.8 在 hgrc 的 trusted 节的 groups 中添加 dev 群
[trusted] groups = dev
6.1.4 使用设置好的版本库
如果想通过 ssh 来 clone 我们刚创建的这个版本库,需要以“ssh:// 主机名 / 目录”的形式指定 clone 位置的路径。举个例子,假设服务器可通过 example.com 域名进行访问,现在我们想 clone 路径 /var/hg/testrepo 下的版本库,则命令如 LIST 6.9 所示。
LIST 6.9 对 example.com 上的 /var/hg/testrepo 版本库执行 clone 操作
$ hg clone ssh://example.com//var/hg/testrepo
指定路径时请注意斜杠数。协议部分 ssh:// 、域名 example.com 与目录 /var/hg/testrepo 的结合部分都是双斜杠。
NOTE
通过 ssh 连接时如果需要密钥,就需要在 ssh 客户端的设置文件 $HOME/.ssh/config 中预先设置好对连接对象使用的密钥文件。
6.1.5 使用 hgweb 建立简易中央版本库
Mercurial 具有 hgweb 功能,我们只需一个 hg serve 命令就能公开版本库浏览器的 Web 站点。
$ hg serve
启用 hgweb 功能的版本库默认允许 clone/pull,在 hgrc 中添加设置之后还可以进行 push 操作,所以对于一些仅需要在 LAN 内共享的版本库来说,启用 hgweb 功能后就可以当作中央版本库来用,能省去不少功夫。
我们在“.hg/hgrc”中添加以下设置。allow_push 是允许经由 hgweb 进行 push 操作的 user 列表,加上 * 表示不需认证即可 push。push_ssl 用来设置 push 时是否需要 SSL。
[web] allow_push = * push_ssl = False
这里不妨加上 -d 选项,让 hgweb 的 Web 服务器常驻。启动之后会显示 hgweb 的 URL。
$ hg serve -d listening at http://127.0.0.1:8000/ (bound to *:8000)
如果直接执行 hg clone 加 URL,本地版本库名会变成 domain:port,所以我们在 clone 时添加版本库名作为第二传值参数。
$ hg clone http://127.0.0.1:8000/ monjudoh
如下所示,我们在 clone 来的版本库中进行修改,然后提交并 push。
$ cd monjudoh $ touch monjudoh.txt $ hg ci -A -m "add monjudoh.txt" adding monjudoh.txt $ hg push pushing to http://127.0.0.1:8000/ searching for changes remote: adding changesets remote: adding manifests remote: adding file changes remote: added 1 changesets with 1 changes to 1 files
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论