Version Control with Subversion

针对 Subversion 1.6

(编译自 r3821/r5091)

Ben Collins-Sussman

Brian W. Fitzpatrick

C. Michael Pilato

本书使用创作共用许可证。可以访问 http://creativecommons.org/licenses/by/2.0/ 或发送邮件到 Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA,以查看本许可证。

(TBA)


目录

前言
序言
1. Subversion 是什么?
1.1. Subversion 是正确的工具吗?
1.2. Subversion 的历史
1.3. Subversion 的架构
1.4. Subversion 的组件
1.5. Subversion 有什么新东西?
2. 读者
3. 怎样阅读本书
4. 本书的结构
5. 本书是免费的
6. 致谢
1. 基本概念
1. 版本控制基础概念
1.1. 版本库
1.2. 工作副本
1.3. 版本模型
1.3.1. 文件共享的问题
1.3.2. “锁定-修改-解锁”方案
1.3.3. “拷贝-修改-合并”方案
2. Subversion 的版本控制
2.1. Subversion 版本库
2.2. 修订版本
2.3. 版本库的地址
2.4. Subversion 的工作副本
2.4.1. 工作副本的工作方式
2.4.2. 工作副本基本交互操作
2.4.3. 混合版本的工作副本
3. 总结
2. 基本使用
1. 求助!
2. 导入数据到你的版本库
2.1. 导入文件和目录
2.2. 推荐的版本库布局
2.3. 名称中有什么?
3. 创建工作副本
4. 基本的工作循环
4.1. 更新你的工作副本
4.2. 开始修改
4.3. 检查你的修改
4.3.1. 查看你的修改概况
4.3.2. 检查你的本地修改的详情
4.4. 修正错误
4.5. 解决冲突
4.5.1. 交互式的查看冲突区别
4.5.2. 交互式的解决冲突区别
4.5.3. 延后解决冲突
4.5.4. 手工合并冲突
4.5.5. 丢弃你的修改而接收新获取的修订版本
4.5.6. Punting: using svn revert
4.6. 提交你的修改
5. 检验历史
5.1. 检查历史修改详情
5.1.1. 检查本地修改
5.1.2. 比较工作副本和版本库
5.1.3. 比较版本库中的版本
5.2. 产生历史修改列表
5.3. 浏览版本库
5.3.1. svn cat
5.3.2. svn list
5.4. 获得旧的版本库快照
6. 有时你只需要清理
6.1. 处理你的工作副本
6.2. 从中断中恢复
7. 处理结构性冲突
7.1. An Example Tree Conflict
8. 总结
3. 高级主题
1. 版本清单
1.1. 修订版本关键字
1.2. 版本日期
2. Peg 和实施修订版本
3. 属性
3.1. 为什么需要属性?
3.2. 操作属性
3.3. 属性和 Subversion 工作流程
3.4. 自动设置属性
4. 文件移植性
4.1. 文件内容类型
4.2. 文件的可执行性
4.3. 行结束字符序列
5. 忽略未版本控制的条目
6. 关键字替换
7. 稀疏目录
8. 锁定
8.1. 创建锁定
8.2. 发现锁定
8.3. 解除和偷窃锁定
8.4. 锁定交流
9. 外部定义
10. 修改列表
10.1. 创建和更新修改列表
10.2. 用修改列表作为操作过滤器
10.3. 修改列表的限制
11. 网络模型
11.1. 请求和响应
11.2. 客户端凭证
11.2.1. 缓存凭证
11.2.2. 禁用密码缓存
11.2.3. 删除缓存的凭证
11.2.4. 命令行认证
11.2.5. 认证总结
12. 总结
4. 分支与合并
1. 什么是分支?
2. 使用分支
2.1. 创建分支
2.2. 在分支上工作
2.3. 分支背后的关键概念
3. 基本合并
3.1. 变更集
3.2. 保持分支同步
3.3. 重新集成分支
3.4. 合并信息和预览
3.5. 取消修改
3.6. 找回删除的项目
4. 高级合并
4.1. 摘录合并
4.2. 合并的语法:完整的描述
4.3. 不使用合并信息的合并
4.4. 合并冲突
4.5. 阻塞修改
4.6. Keeping a Reintegrated Branch Alive
4.7. 感知合并的日志和注解
4.8. 关注还是忽视祖先
4.9. 合并和移动
4.10. 阻塞不知道合并的客户端
4.11. 合并跟踪的最终信息
5. 使用分支
6. 标签
6.1. 建立简单标签
6.2. 建立复杂标签
7. 维护分支
7.1. 版本库布局
7.2. 数据的生命周期
8. 常用分支模式
8.1. 发布分支
8.2. 特性分支
9. 供方分支
9.1. 常规的供方分支管理过程
9.2. svn_load_dirs.pl
10. 总结
5. 版本库管理
1. Subversion 版本库的定义
2. 版本库开发策略
2.1. 规划你的版本库结构
2.2. 决定在哪里与如何部署你的版本库
2.3. 选择数据存储格式
2.3.1. Berkeley DB
2.3.2. FSFS
3. 创建和配置你的版本库
3.1. 创建版本库
3.2. 实现版本库钩子
3.3. Berkeley DB 配置
3.4. FSFS 配置
4. 版本库维护
4.1. 管理员的工具箱
4.1.1. svnadmin
4.1.2. svnlook
4.1.3. svndumpfilter
4.1.4. svnsync
4.1.5. fsfs-reshard.py
4.1.6. Berkeley DB 工具
4.2. 修正提交消息
4.3. 管理磁盘空间
4.3.1. 让 Subversion 节约磁盘空间
4.3.2. 删除终止的事务
4.3.3. 删除不使用的 Berkeley DB 日志文件
4.3.4. 打包 FSFS 文件系统
4.4. Berkeley DB 恢复
4.5. 版本库数据的移植
4.6. 过滤版本库历史
4.7. 版本库复制
4.8. 版本库备份
4.9. 管理版本库的 UUID
5. 移动和删除版本库
6. 总结
6. 服务配置
1. 概述
2. 选择一个服务器配置
2.1. svnserve 服务器
2.2. 穿越 SSH 隧道的 svnserve 服务器
2.3. Apache 的 HTTP 服务器
2.4. 推荐
3. svnserve - 定制的服务器
3.1. 调用服务器
3.1.1. svnserve 与守护进程
3.1.2. 通过 inetd 调用 svnserve
3.1.3. 通过隧道调用 svnserve
3.1.4. svnserve as a Windows service
3.1.5. svnserve as a launchd job
3.2. 内置的认证和授权
3.2.1. 创建一个用户文件和认证域
3.2.2. 设置访问控制
3.3. 让 svnserve 使用 SASL
3.3.1. 使用 SASL 认证
3.3.2. SASL 加密
3.4. 穿越 SSH 隧道
3.5. SSH Configuration Tricks
3.5.1. 初始设置
3.5.2. 控制调用的命令
4. httpd - Apache 的 HTTP 服务器
4.1. 先决条件
4.2. 基本的 Apache 配置
4.3. 认证选项
4.3.1. Basic authentication
4.3.2. Digest authentication
4.4. 授权选项
4.4.1. 整体访问控制
4.4.2. 每目录访问控制
4.4.3. 禁用基于路径的检查
4.5. Protecting network traffic with SSL
4.5.1. Subversion server SSL certificate configuration
4.5.2. Subversion client SSL certificate management
4.6. 额外的糖果
4.6.1. 版本库浏览
4.6.2. Apache 日志
4.6.3. 通过代理写
4.6.4. 其它的 Apache 特性
5. 基于路径的授权
6. High-level Logging
7. 支持多种版本库访问方法
7. 定制你的 Subversion 体验
1. 运行配置区
1.1. 配置区布局
1.2. 配置和 Windows 注册表
1.3. 配置选项
1.3.1. 服务器
1.3.2. 配置
2. 本地化
2.1. 理解区域设置
2.2. Subversion 对区域设置的使用
3. 使用外置编辑器
4. 使用外置比较与合并工具
4.1. 外置 diff
4.2. 外置 diff3
4.3. External merge
5. 总结
8. 嵌入 Subversion
1. 分层的库设计
1.1. 版本库层
1.2. 版本库访问层
1.3. 客户端层
2. 进入工作副本的管理区
2.1. 条目文件
2.2. 原始副本和属性文件
3. 使用 API
3.1. Apache 可移植运行库
3.2. Functions and Batons
3.3. URL 和路径需求
3.4. 使用 C 和 C++ 以外的语言
3.5. 代码样例
4. 总结
9. Subversion 完全参考
1. svn—Subversion Command-Line Client
1.1. svn 选项
1.2. svn 子命令
svn add
svn blame (praise, annotate, ann)
svn cat
svn changelist (cl)
svn checkout (co)
svn cleanup
svn commit (ci)
svn copy (cp)
svn delete (del, remove, rm)
svn diff (di)
svn export
svn help (h, ?)
svn import
svn info
svn list (ls)
svn lock
svn log
svn merge
svn mergeinfo
svn mkdir
svn move (mv)
svn propdel (pdel, pd)
svn propedit (pedit, pe)
svn propget (pget, pg)
svn proplist (plist, pl)
svn propset (pset, ps)
svn resolve
svn resolved
svn revert
svn status (stat, st)
svn switch (sw)
svn unlock
svn update (up)
2. svnadmin—Subversion Repository Administration
2.1. svnadmin 选项
2.2. svnadmin 子命令
svnadmin crashtest
svnadmin create
svnadmin deltify
svnadmin dump
svnadmin help (h, ?)
svnadmin hotcopy
svnadmin list-dblogs
svnadmin list-unused-dblogs
svnadmin load
svnadmin lslocks
svnadmin lstxns
svnadmin pack
svnadmin recover
svnadmin rmlocks
svnadmin rmtxns
svnadmin setlog
svnadmin setrevprop
svnadmin setuuid
svnadmin upgrade
svnadmin verify
3. svnlook—Subversion Repository Examination
3.1. svnlook 选项
3.2. svnlook 子命令
svnlook author
svnlook cat
svnlook changed
svnlook date
svnlook diff
svnlook dirs-changed
svnlook help (h, ?)
svnlook history
svnlook info
svnlook lock
svnlook log
svnlook propget (pget, pg)
svnlook proplist (plist, pl)
svnlook tree
svnlook uuid
svnlook youngest
4. svnsync—Subversion Repository Mirroring
4.1. svnsync 选项
4.2. svnsync 子命令
svnsync copy-revprops
svnsync help
svnsync info
svnsync initialize (init)
svnsync synchronize (sync)
5. svnserve—Custom Subversion Server
5.1. svnserve 选项
6. svndumpfilter—Subversion History Filtering
6.1. svndumpfilter 选项
6.2. svndumpfilter 子命令
svndumpfilter exclude
svndumpfilter include
svndumpfilter help
7. svnversion—Subversion Working Copy Version Info
svnversion
8. mod_dav_svn—Subversion Apache HTTP Server Module
mod_dav_svn 配置指令
9. mod_authz_svn—Subversion Apache HTTP Authorization Module
mod_authz_svn 配置指令
10. Subversion 属性
10.1. 版本控制的属性
10.2. 未版本控制的属性
11. 版本库钩子
start-commit
pre-commit
post-commit
pre-revprop-change
post-revprop-change
pre-lock
post-lock
pre-unlock
post-unlock
A. Subversion 快速入门指南
1. 安装 Subversion
2. 快速指南
B. CVS 用户的 Subversion 指南
1. 版本号现在不同了
2. 目录的版本
3. 更多离线操作
4. 区分状态和更新
4.1. 状态
4.2. 更新
5. 分支和标签
6. 元数据属性
7. 解决冲突
8. 二进制文件和行结束标记转换
9. 版本化的模块
10. 认证
11. 迁移 CVS 版本库到 Subversion
C. WebDAV 和自动版本
1. 什么是 WebDAV?
2. 自动版本化
3. 客户端交互性
3.1. 独立的 WebDAV 应用程序
3.1.1. Microsoft Office,Dreamweaver,Photoshop
3.1.2. Cadaver,DAV 浏览器
3.2. 文件浏览器的 WebDAV 扩展
3.2.1. Microsoft Web 文件夹
3.2.2. Nautilus,Konqueror
3.3. WebDAV 的文件系统实现
3.3.1. WebDrive,NetDrive
3.3.2. Mac OS X
3.3.3. Linux davfs2
D. 版权
索引

插图清单

1. Subversion 的架构
1.1. 一个典型的客户/服务器系统
1.2. 需要避免的问题
1.3. “锁定-修改-解锁”方案
1.4. “拷贝-修改-合并”方案
1.5. “拷贝-修改-合并”方案(续)
1.6. Tree changes over time
1.7. 版本库的文件系统
4.1. 分支与开发
4.2. 开始规划版本库
4.3. 版本库与复制
4.4. 一个文件的分支历史
8.1. 二维的文件和目录
8.2. 版本时间 - 第三维!

表格清单

1.1. 版本库访问 URL
2.1. 常用日志操作
4.1. 分支与合并命令
5.1. 版本库数据存储对照表
6.1. Subversion 服务器选项比较
C.1. 常用的 WebDAV 客户端

范例清单

4.1. Merge-tracking gatekeeper start-commit hook script
5.1. txn-info.sh (报告异常事务)
5.2. 镜像版本库的 pre-revprop-change 钩子
5.3. 镜像版本库的 start-commit 钩子
6.1. A sample svnserve launchd job definition
6.2. 匿名访问的配置样例
6.3. 认证访问的配置样例
6.4. 混合认证/匿名访问的配置样例
6.5. 禁用所有的路径检查
7.1. 注册表条目(.reg)文件样例
7.2. diffwrap.py
7.3. diffwrap.bat
7.4. diff3wrap.py
7.5. diff3wrap.bat
7.6. mergewrap.py
7.7. mergewrap.bat
8.1. Using the repository layer
8.2. Using the repository layer with Python
8.3. 一个 Python 状态爬虫

前言

Karl Fogel

芝加哥,2004 年 3 月 14 日。

一个差劲的常见问题列表(FAQ)总是充斥着作者渴望被问到的问题,而不是人们真正想要了解的问题。也许你曾经见过下面这样的问题:

Q:怎样使用 Glorbosoft XYZ 最大程度的提高团队生产率?

A:许多客户希望知道怎样利用我们革命性的专利办公套件最大程度的提高生产率。答案非常简单:首先,点击文件菜单,找到提高生产率条目,然后 …

类似的问题完全不符合 FAQ 的精神。没人会打电话给技术支持中心,询问怎样提高生产率?相反,人们经常询问一些非常具体的问题,像怎样让日程系统提前两天,而不是一天提醒相关用户?等等。但是想象比发现真正的问题更容易。构建一个真实的问题列表需要持之以恒的, 有组织的辛勤工作:跨越整个软件生命周期,追踪新提出的问题,监控反馈信息,所有的问题要整理成一个统一的, 可查询的整体,并且能够真实的反映所有用户的感受。这需要耐心,如自然学家一样严谨的态度,没有浮华的假设,没有虚幻的断言—相反的,需要开放的视野和精确的记录。

我很喜欢这本书,因为它正是按照这种精神建立起来的,这种精神体现在本书的每一页中。这是作者与用户直接交流的结果。而这一切是源于 Ben Collins-Sussman 对于 Subversion 邮件列表中常见问题的研究。他发现人们总是在邮件列表中重复询问一些基本问题:使用 Subversion 的标准流程是怎样的?分支与标签同其它版本控制系统的工作方式一样吗?我怎样知道某处的修改是谁做的?

日复一日看到相同问题的烦闷,促使 Ben 在 2002 年的夏天努力工作了一个月,撰写了一本 Subversion 手册,一本六十页厚的, 涵盖了所有 Subversion 使用基础知识的手册。这本手册没有说明最终定稿的时间,但它随着 Subversion 的每个版本一起发布,帮助许多用户跨过学习之初的艰难。当 O'Reilly 决定出版一本完备的 Subversion 图书的时候,一条捷径浮出水面:扩充 Subversion 手册。

新书的三位合著者因而面临着一个不寻常的机会。从职责上讲,他们的任务是从一个目录和一些草稿为基础,自上而下的写一部专著。但事实上,他们的灵感源泉则来自一些具体的内容,稳定却难以组织。Subversion 被数以千计的早期用户采用,这些用户提供了大量的反馈,不仅仅针对 Subversion,还包括业已存在的文档。

在写这本书的过程里,Ben,Mike 和 Brian 一直像鬼魂一样游荡在 Subversion 邮件列表和聊天室中,仔细的研究用户实际遇到的问题。监视这些反馈也是他们在 CollabNet 工作的一部分,这给他们撰写 Subversion 文档提供了巨大的便利。这本书建立在丰富的使用经验,而非在流沙般脆弱的想象之上,它结合了用户手册和 FAQ 的优点。初次阅读时,这种二元性的优势并不明显,按照顺序,从前到后,这本书只是简单的从头到尾描述了软件的细节。书中的内容包括一章概述,一章必不可少的快速指南,一章关于管理配置,一些高级主题,当然还包括命令参考手册和故障排除指南。而当你过一段时间之后,再次翻开本书查找一些特定问题的解决方案时,这种二元性才得以显现:这些生动的细节一定来自不可预测的实际用例的提炼,大多是源于用户的需要和视点。

Of course, no one can promise that this book will answer every question you have about Subversion. Sometimes the precision with which it anticipates your questions will seem eerily telepathic; yet occasionally, you will stumble into a hole in the community's knowledge and come away empty-handed. When this happens, the best thing you can do is email and present your problem. The authors are still there and still watching, and the authors include not just the three listed on the cover, but many others who contributed corrections and original material. From the community's point of view, solving your problem is merely a pleasant side effect of a much larger project—namely, slowly adjusting this book, and ultimately Subversion itself, to more closely match the way people actually use it. They are eager to hear from you, not only because they can help you, but because you can help them. With Subversion, as with all active free software projects, you are not alone.

让这本书将成为你的第一个伙伴。

序言