Mercurial 权威指南

编译自 bc143583eaa1 (2011-03-17)

Bryan O'Sullivan


目录

序言
1. 技术背景
2. 谢谢你支持 Mercurial
3. 致谢
4. 本书的约定
5. 使用样例代码
6. Safari® 在线书库
7. 联系我们
1. 写在前面
1.1. 为什么使用版本控制? 为什么使用 Mercurial?
1.1.1. 为什么使用版本控制?
1.1.2. 版本控制的别名
1.2. 本书的例子
1.3. 版本控制的发展趋势
1.4. 分布版本控制的优点
1.4.1. 开源项目的优点
1.4.2. 商业项目的优点
1.5. 为什么选择 Mercurial?
1.6. Mercurial 与其它工具的比较
1.6.1. Subversion
1.6.2. Git
1.6.3. CVS
1.6.4. 商业工具
1.6.5. 选择版本控制工具
1.7. 从其它工具切换到 Mercurial
1.8. 版本控制简史
2. Mercurial 教程: 基础知识
2.1. 安装 Mercurial
2.1.1. Windows
2.1.2. Mac OS X
2.1.3. Linux
2.1.4. Solaris
2.2. 开始
2.2.1. 内置帮助
2.3. 使用版本库
2.3.1. 创建版本库的工作副本
2.3.2. 什么是版本库?
2.4. 回溯历史
2.4.1. 变更集,版本,与其它用户交互
2.4.2. 查看指定版本
2.4.3. 更详细的信息
2.5. 命令选项
2.6. 创建和复审变更
2.7. 在新修改集中记录修改
2.7.1. 配置用户名称
2.7.2. 写提交日志
2.7.3. 写高质量的提交日志
2.7.4. 终止提交
2.7.5. 欣赏我们的成果
2.8. 分享修改
2.8.1. 从其它版本库取得变更
2.8.2. 更新工作目录
2.8.3. 发布修改到其它版本库
2.8.4. 默认位置
2.8.5. 通过网络共享修改
2.9. 开始新项目
3. Mercurial 教程: 合并工作
3.1. 合并的流程
3.1.1. 顶点修改集
3.1.2. 执行合并
3.1.3. 提交合并结果
3.2. 合并有冲突的变更
3.2.1. 使用图形合并工具
3.2.2. 合并实例
3.3. 简化拉-合并-提交程序
3.4. 重命名,复制与合并
4. Mercurial 内幕
4.1. Mercurial 的历史记录
4.1.1. 跟踪单一文件的历史
4.1.2. 管理跟踪的文件
4.1.3. 记录修改集信息
4.1.4. 版本之间的关系
4.2. 安全,高效的存储
4.2.1. 高效存储
4.2.2. 安全操作
4.2.3. 快速检索
4.2.4. 鉴别和强完整性
4.3. 修订历史,分支与合并
4.4. 工作目录
4.4.1. 当你提交时发生的事情
4.4.2. 创建新顶点
4.4.3. 合并修改
4.4.4. 合并与重命名
4.5. 其它有趣的设计特性
4.5.1. 智能压缩
4.5.2. 读写顺序与原子性
4.5.3. 并发访问
4.5.4. 避免查找
4.5.5. 目录状态的其它内容
5. Mercurial 的日常使用
5.1. 告诉 Mercurial 要跟踪哪些文件
5.1.1. 明确与隐含文件命名
5.1.2. Mercurial 只跟踪文件,不跟踪目录
5.2. 如何停止跟踪文件
5.2.1. 删除文件不影响历史
5.2.2. 丢失的文件
5.2.3. 旁白: 为什么要明确告诉 Mercurial 删除文件?
5.2.4. 有用的技巧—一个步骤添加和删除文件
5.3. 拷贝文件
5.3.1. 合并后拷贝文件的内容
5.3.2. 为什么要传递变更?
5.3.3. 如何禁止变更传递?
5.3.4. 命令hg copy的行为
5.4. 重命名文件
5.4.1. 重命名文件与合并变更
5.4.2. 分歧的更名与合并
5.4.3. 收敛重命名与合并
5.4.4. 其它名称相关的信息
5.5. 从错误恢复
5.6. 合并的技巧
5.6.1. 文件的解决状态
5.6.2. 解决文件合并
5.7. 差异的更多技巧
5.8. 哪些文件需要管理,那些不需要
5.9. 备份与镜像
6. 团体协作
6.1. Mercurial 的 web 接口
6.2. 协作模型
6.2.1. 要牢记的因素
6.2.2. 无政府状态
6.2.3. 单一中央版本库
6.2.4. 托管的中央版本库
6.2.5. 使用多个分支工作
6.2.6. 特性分支
6.2.7. 发布列车
6.2.8. Linux 内核模型
6.2.9. 只读与共享写协作
6.2.10. 协作与分支管理
6.3. 共享的技术因素
6.4. 使用 hg serve 进行非正式共享
6.4.1. 要牢记的几件事
6.5. 使用 ssh 协议
6.5.1. 如何读写 ssh 路径
6.5.2. 为你的系统寻找 ssh 客户端
6.5.3. 产生密钥对
6.5.4. 使用认证代理
6.5.5. 正确配置服务器端
6.5.6. 通过 ssh 使用压缩
6.6. 使用 CGI 通过 HTTP 提供服务
6.6.1. Web 服务器配置检查表
6.6.2. 基本 CGI 配置
6.6.3. 使用一个 CGI 脚本共享多个版本库
6.6.4. 下载源代码档案包
6.6.5. Web 配置选项
6.7. 全局配置
6.7.1. 让 Mercurial 更可信
7. 文件名称与模式匹配
7.1. 简单文件名称
7.2. 不提供文件名称的执行命令
7.3. 告诉你正在做什么
7.4. 使用模式标识文件
7.4.1. 外壳风格的 glob 模式
7.4.2. 使用 re 模式的正则表达式匹配
7.5. 过滤文件
7.6. 始终忽略不需要的文件和目录
7.7. 大小写敏感性
7.7.1. 安全,可移植的版本库存储
7.7.2. 检测大小写冲突
7.7.3. 修正大小写冲突
8. 发布管理与分支开发
8.1. 给版本指定一个永久的名称
8.1.1. 在合并期间处理标签冲突
8.1.2. 标签与克隆
8.1.3. 当永久标签太多的时候
8.2. 修改流程—宏观与微观
8.3. 在版本库中管理分支
8.4. 不要重复劳动:在分支间合并
8.5. 版本库中的命名分支
8.6. 在版本库中处理多个命名分支
8.7. 分支名称与合并
8.8. 分支名称通常都很有用
9. 查找和修改错误
9.1. 销毁本地历史
9.1.1. 意外的提交
9.1.2. 回滚一个事务
9.1.3. 错误的抓取
9.1.4. 当完成推送后,回滚是无效的
9.1.5. 你只能回滚一次
9.2. 撤销错误的修改
9.2.1. 文件管理错误
9.3. 处理已经提交的修改
9.3.1. 恢复一个修改集
9.3.2. 恢复顶点修改集
9.3.3. 恢复非顶点的修改
9.3.4. 在恢复处理中获得更多控制
9.3.5. hg backout 的内幕
9.4. 不该发生的修改
9.4.1. 撤销一个合并
9.4.2. 使用校验修改来保护你自己
9.4.3. 处理敏感信息泄漏的方法
9.5. 查找问题的根源
9.5.1. 使用命令 hg bisect
9.5.2. 搜索后的清理
9.6. 有效查找问题的技巧
9.6.1. 给出一致的输入
9.6.2. 尽量自动
9.6.3. 检查你的结果
9.6.4. 谨防问题之间的冲突
9.6.5. 减少你的查找工作
10. 使用钩子处理版本库事件
10.1. Mercurial 钩子概述
10.2. 钩子与安全性
10.2.1. 钩子以你的特权执行
10.2.2. 钩子不会传播
10.2.3. 钩子可以被覆盖
10.2.4. 确保关键钩子的执行
10.3. 使用钩子的简短指南
10.3.1. 每个事件执行多个操作
10.3.2. 控制处理的活动
10.4. 编写钩子
10.4.1. 选择钩子的执行方式
10.4.2. 钩子的参数
10.4.3. 钩子的返回值与活动控制
10.4.4. 编写外部钩子
10.4.5. 让 Mercurial 使用进程内钩子
10.4.6. 编写进程内钩子
10.5. 钩子样例
10.5.1. 编写有意义的提交日志
10.5.2. 检查行尾空格
10.6. 内置的钩子
10.6.1. acl—版本库的访问控制
10.6.2. bugzilla—与 Bugzilla 的集成
10.6.3. notify—邮件通知
10.7. 编写钩子的信息
10.7.1. 进程内钩子的执行
10.7.2. 外部钩子的执行
10.7.3. 检查修改集来自何处
10.8. 钩子参考
10.8.1. changegroup—增加远程修改集之后
10.8.2. commit—创建新修改集之后
10.8.3. incoming—增加远程修改集之后
10.8.4. outgoing—传播修改集之后
10.8.5. prechangegroup—增加远程修改集之前
10.8.6. precommit—提交修改集之前
10.8.7. preoutgoing—传播修改集之前
10.8.8. pretag—创建标签之前
10.8.9. pretxnchangegroup—完成增加远程修改集之前
10.8.10. pretxncommit—完成提交之前
10.8.11. preupdate—更新或合并工作目录之前
10.8.12. tag—创建标签之后
10.8.13. update—更新或合并工作目录之后
11. 定制 Mercurial 的输出
11.1. 使用预定义的输出样式
11.1.1. 设置默认样式
11.2. 支持样式和模版的命令
11.3. 模版基础
11.4. 模版关键字
11.5. 转义序列
11.6. 通过过滤关键字来修改输出结果
11.6.1. 组合过滤器
11.7. 从模版到样式
11.7.1. 最简单的样式文件
11.7.2. 样式文件语法
11.8. 样式文件例子
11.8.1. 在样式文件中定位错误
11.8.2. 版本库的唯一标识
11.8.3. 每行列出一个文件
11.8.4. 模仿 Subversion 的输出
12. 使用 MQ 管理修改
12.1. 补丁的管理问题
12.2. MQ 的历史
12.2.1. A patchwork quilt
12.2.2. 从 patchwork quilt 到 MQ
12.3. MQ 的巨大优势
12.4. 理解补丁
12.5. 开始使用 MQ
12.5.1. 创建新补丁
12.5.2. 刷新补丁
12.5.3. 堆叠和跟踪补丁
12.5.4. 操作补丁堆栈
12.5.5. 压入或弹出多个补丁
12.5.6. 安全的检查,然后覆盖它们
12.5.7. 同时处理多个补丁
12.6. 关于补丁的更多信息
12.6.1. 修剪计数
12.6.2. 应用补丁的策略
12.6.3. 补丁的一些特性
12.6.4. 当心毛刺
12.6.5. 处理拒绝
12.7. 补丁管理进阶
12.7.1. 删除不需要的补丁
12.7.2. 与持久版本的相互转换
12.8. MQ 的性能
12.9. 当基础代码改变时,更新补丁的方法
12.10. 标识补丁
12.11. 其它需要了解的东西
12.12. 在版本库管理补丁
12.12.1. MQ 支持补丁版本库
12.12.2. 需要注意的事情
12.13. 操作补丁的第三方工具
12.14. 操作补丁的好习惯
12.15. MQ 手册
12.15.1. 管理琐碎的补丁
12.15.2. 组合全部的补丁
12.15.3. 合并补丁的部分内容到其它补丁
12.16. MQ 与 quilt 的区别
13. MQ 的高级用法
13.1. 多个目标的问题
13.1.1. 工作不好的诱人方法
13.2. 有条件的应用补丁
13.3. 控制补丁的应用条件
13.4. 选择使用的条件
13.5. MQ 应用补丁的规则
13.6. 修剪工作环境
13.7. 分类补丁系列
13.8. 维护补丁系列
13.8.1. 编写向后移植补丁的艺术
13.9. 使用 MQ 开发的技巧
13.9.1. 将补丁放到几个目录中
13.9.2. 察看补丁的历史
14. 使用扩展增加功能
14.1. 使用扩展 inotify 以提高性能
14.2. 使用扩展 extdiff 以扩展差异支持
14.2.1. 定义命令的别名
14.3. 使用扩展 transplant 以挑选修改
14.4. 使用扩展 patchbomb 通过 email 发送修改
14.4.1. 修改 patchbomb 的行为
A. 迁移到 Mercurial
A.1. 从其它版本控制系统导入历史
A.1.1. 转换多个分支
A.1.2. 映射用户名称
A.1.3. 清理目录树
A.1.4. 改进 Subversion 的转换性能
A.2. 从 Subversion 迁移
A.2.1. 哲学的差别
A.2.2. 快速参考
A.3. 新手需要了解的技巧
B. Mercurial 队列参考
B.1. MQ 命令参考
B.1.1. qapplied—显示已应用的补丁
B.1.2. qcommit—提交队列中的修改
B.1.3. qdelete—从文件 series 中删除补丁
B.1.4. qdiff—显示最新应用补丁的差异
B.1.5. qfold—将已应用的补丁提交到版本库
B.1.6. qfold—将多个补丁合并(折叠)成一个
B.1.7. qheader—显示补丁头部描述
B.1.8. qimport—将第三方补丁导入队列
B.1.9. qinit—为使用 MQ 配置版本库
B.1.10. qnew—创建新补丁
B.1.11. qnext—显示下个补丁的名称
B.1.12. qpop—删除堆栈顶部的补丁
B.1.13. qprev—显示上个补丁的名称
B.1.14. qpush—增加补丁到堆栈
B.1.15. qrefresh—更新最新的补丁
B.1.16. qrename—改名补丁
B.1.17. qseries—显示补丁序列
B.1.18. qtop—显示当前补丁的名称
B.1.19. qunapplied—显示尚未应用的补丁
B.1.20. hg strip—删除一个版本及其后继
B.2. MQ 文件参考
B.2.1. 序列文件
B.2.2. 状态文件
C. 从源代码安装 Mercurial
C.1. 类 Unix 系统
C.2. Windows 系统
D. 开放出版协议
D.1. Requirements on both unmodified and modified versions
D.2. Copyright
D.3. Scope of license
D.4. Requirements on modified works
D.5. Good-practice recommendations
D.6. License options

插图清单

2.1. 版本库 hello 的历史图
3.1. my-hellomy-new-hello 最新的历史分叉
3.2. my-hello 拉到 my-new-hello 之后版本库的内容
3.3. 在合并期间,以及提交之后的工作目录与版本库
3.4. 冲突的修改
3.5. 使用 kdiff3 合并文件的不同版本
4.1. 工作目录中的文件与版本库中的文件日志之间的关系
4.2. 元数据之间的关系
4.3. 版本日志的快照,以及增量差异
4.4. 版本日志的设计结构
4.5. 工作目录可以有两个父亲
4.6. 提交之后,工作目录的父亲就改变了
4.7. 同步到旧修改集的工作目录
4.8. 对同步到旧修改集的工作目录提交之后
4.9. 合并两个顶点
6.1. 特性分支
9.1. 使用 hg backout 恢复一个修改
9.2. 使用 hg backout 自动恢复非顶点的修改
9.3. 使用 hg backout 恢复一个修改
9.4. 手工合并恢复修改
9.5. 错误的合并
9.6. 拆除合并,关注一个父亲
9.7. 拆除合并,关注其它父亲
9.8. 合并拆除
9.9. 合并拆除
12.1. 在 MQ 补丁堆栈中应用和撤销补丁

表格清单

A.1. Subversion 命令与 Mercurial 对照表