Subversion 版本控制
一个差劲的常见问题列表 (Frequently Asked Questions, FAQ) 总是充斥着 作者希望听到的问题, 而不是人们真正想问的问题. 读者可能遇到过下面这种类型 的问题:
Q: 如何使用 Glorbosoft XYZ 才能最大程度地提高团队效率?
A: 很多客户想知道如何利用我们的革命性办公套件最大程度地提高 效率, 答案非常简单, 首先, 点击菜单项 File, 滚动到 Increase Productivity, 然后 …
这种问题完全不符合 FAQ 的精神. 没人会打电话给技术支持中心询问 “ 如何提高生产效率”, 相反, 人们经常问一些非常具体的问题, 例如 “怎样做才能让日历系统提前两天—而不是一天—提醒相关用户 ”, 但是编撰 FAQ 比发现真正的问题要容易得多. 构建一张真实的 FAQ 列 表需要持之以恒的辛勤工作: 在软件的整个生命周期, 需要跟踪每一个收到的 问题, 监控反馈信息, 所有的问题要整理成一个统一的, 可查询的整体, 并且能 够真实地反映出用户的感受. 这个过程非常需要耐心, 如自然学家一样严谨的态度, 没有浮华的假设, 没有虚幻的断言—最重要的是要有开放的视野和精确的记录.
我喜欢这本书的原因是它正是按照这种过程写出来的. 本书是作者和用户直接 交互的结果, 而这一切是源于 Ben Collins-Sussman 对于 Subversion 邮件列表 中常见问题的研究, 他发现人们总是在邮件列表中询问同样的基本问题: 使用 Subversion 的标准流程是什么? 分支 (branch) 与标签 (tag) 的工作方式同其他 版本控制系统一样吗? 我怎么才能知道某处修改是谁做的?
日复一日看到相同问题的烦闷, 促使 Ben 在 2002 年的夏天努力了一个月, 写了一本 The Subversion Handbook, 这是一本 60 页 厚的手册, 涵盖了 Subversion 所有的基础使用知识. 手册没有说明定稿的最终时间, 但它随着 Subversion 的每个版本一起发布, 帮助过很多用户跨过学习之初的艰难. 当 O'Reilly 决定出版一本详尽的 Subversion 图书时, 扩充手册是最快的捷径.
新书的三位作者面临着一个不寻常的机会, 从职责上讲, 他们的任务是以目录 和草稿为基础, 自上而下地写出一部著作. 但事实上, 他们的灵感来自一些非常具体 的内容, 稳定却难以组织—Subversion 被数以千计的早期用户使用, 他们提供 了大量的反馈, 这些反馈不仅仅针对 Subversion, 还包括它的文档.
在本书的写作过程中, Ben, Mike 和 Brian 像鬼魂一样游荡在 Subversion 的邮件列表和聊天室里, 仔细研究用户遇到的实际问题, 监控反馈信息也是他 们在 CollabNet 的工作内容之一, 这给他们撰写 Subversion 文档提供了巨大的便 利. 本书建立在丰富的使用经验上, 而不是流水般脆弱的想像, 它结合了用户手册 和 FAQ 的优点, 初次阅读时, 这种二元性的优势可能并不明显. 从表面上看, 本书只是从头到尾地描述了软件的细节, 书中的内容包括一章概述, 一章不可或缺 的快速指南, 一章关于管理配置, 一些高级主题, 当然还包括命令参考手册和故障 排除指南. 一段时间后, 当你再次翻开本书查找一些特定问题的答案时, 这种二 元性才得以显现: 书中生动的细节一定是来自不可预测的实际用例的提炼, 大多数 内容是源于用户的需求和视角.
当然, 没人可以承诺本书可以回答你的所有问题. 尽管有时候一些前人提问 的惊人一致性让你感觉是心灵感应, 你仍有可能在社区的知识库里摔跤, 空手而 归. 如果有这种情况发生, 最好的办法是把问题发送到 users@subversion.apache.org, 作者还在那里关注着社区, 不 仅仅是本书的三位作者, 还包括许多曾经做出修正与提供原始材料的人. 从社区 的角度看, 帮你解决问题也是为了改进本书和 Subversion. 他们渴望你的信息, 不仅仅可以帮助你, 也可以帮助他们. 与 Subversion 这样活跃的自由软件项目 在一起, 你不会孤军奋战.
希望本书能成为你的好伙伴.
目录
- 写在前面
- 前言
- I. 初识 Subversion
- 1. 基本概念
- 2. 基本用法
- 帮助!
- 往仓库中添加数据
- 导入文件和目录
- 推荐的仓库布局
- 名字中有什么
- 创建工作副本
- 基本工作周期
- 更新工作副本
- 修改
- 审查修改
- 查看修改的整体概述
- 查看修改的细节
- 修正错误
- 解决冲突
- 交互式地查看冲突差异
- 交互式地解决冲突差异
- 推迟解决冲突
- 手动地解决冲突
- 只使用从服务器收到的更新
- 使用 svn revert
- 提交修改
- 检查历史
- 查看历史修订的细节
- 查看本地修改
- 比较工作副本和仓库
- 比较仓库的版本号
- 生成历史修改列表
- 浏览仓库
- 显示文件的内容
- 显示每一行的修改属性
- 列出被版本控制的文件
- 获取老的仓库快照
- 有时候你需要的只是清理一下
- 删除工作副本
- 从中断中恢复
- 处理目录冲突
- 目录冲突示例
- 小结
- 3. 高级主题
- 版本号指示器
- 版本号关键字
- 版本号日期
- 限定版本号与实施版本号
- 属性
- 为什么需要属性?
- 操作属性
- 属性和 Subversion 工作流程
- 继承的属性
- 自动属性设置
- Subversion 的保留属性
- 版本化的属性
- 未版本化的属性
- 文件的可移植性
- 文件内容类型
- 文件的可执行性
- 行结束标记
- 忽略未被版本控制的项
- 关键字替换
- 稀疏目录
- 锁
- 创建锁
- 发现锁
- 破坏与窃取锁
- 锁通信
- 外部定义
- 变更列表
- 创建与修改变更列表
- 变更列表用作操作过滤器
- 变更列表的限制
- 网络模型
- 请求与响应
- 客户端证书
- 缓存证书
- 禁止密码缓存
- 删除已缓存的证书
- 命令行认证
- 认证小结
- 在没有工作副本的情况下工作
- 远程客户端命令行操作
- 使用 svnmucc
- 小结
- 4. 分支与合并
- 5. 仓库管理
- 仓库的定义
- 仓库部署策略
- 规划仓库的组织方式
- 确定仓库的托管方式和位置
- 仓库的访问控制
- 创建与配置仓库
- 创建仓库
- 实现仓库钩子
- 钩子脚本环境配置
- 钩子脚本的常见用法
- 搜索或自己编写钩子脚本
- FSFS 配置
- 仓库维护
- 管理员工具箱
- svnadmin
- svnlook
- svndumpfilter
- svnrdump
- svnsync
- fsfs-reshard.py
- 修正提交日志消息
- 管理磁盘空间
- Subversion 如何节约磁盘空间
- 删除僵死的事务
- FSFS 文件系统压缩
- 迁移仓库数据
- 使用 svnadmin 迁移仓库数据
- 使用 svnrdump 迁移仓库数据
- 过滤仓库历史
- 仓库复制
- 使用 svnsync 复制仓库
- 使用 svnsync 进行部分复制
- 创建镜像的小窍门
- 复制小结
- 仓库备份
- 管理仓库的 UUID
- 移动与删除仓库
- 小结
- 6. 服务器配置
- 概览
- 选择一种服务器配置
- svnserve 服务器
- svnserve + SSH
- Apache HTTP 服务器
- 建议
- svnserve, 一个定制化的服务器
- 调用服务器
- svnserve 作为守护进程
- 由 inetd 调用 svnserve
- 由 xinetd 调用 svnserve
- 基于隧道的 svnserve
- svnserve 作为 Windows 服务
- svnserve 作为 launchd 作业
- 内建的认证与授权
- 创建一个用户文件和认证域
- 设置访问控制
- svnserve 使用 SASL
- 使用 SASL 进行认证
- SASL 加密
- SSH 隧道
- SSH 配置技巧
- 初始化设置
- 控制被调用的命令
- svnserve 配置参考
- 通用配置
- Cyrus SASL 配置
- httpd, Apache HTTP 服务器
- 先决条件
- Apache 基本配置
- 认证选项
- Basic 认证
- Digest 认证
- 授权选项
- 完全访问控制
- 每个目录的访问控制
- 禁止基于路径的检查
- 存放在仓库内的访问权限配置文件
- 使用 SSL 保护网络流量
- Subversion 服务器 SSL 证书配置
- Subversion 客户端 SSL 证书管理
- 优化性能
- KeepAlive
- 批量更新
- 其他好处
- 仓库浏览
- Apache 日志
- 直写代理
- Apache 的其他特性
- Subversion Apache HTTP 服务器配置参考
- moddavsvn 配置指令
- modauthzsvn 配置指令
- 基于路径的授权
- 基于路径的访问控制
- 用户组
- 用户别名
- 访问权限控制的高级特性
- 访问权限控制的一些陷阱
- 高层日志记录
- 服务器优化
- 数据缓存
- 网络数据压缩
- 支持多种仓库访问方法
- 7. 定制自己的 Subversion 体验
- 8. 嵌入 Subversion
- II. Subversion 命令行参考手册
- III. 附录