svn使用

TortoiseSVN


• 你是否在一个团队中工作?
• 是否发生过这样的情况: 当你在修改一个文件时,其他人也在修改这个文件?而你是否因此丢失过自己所作的修改呢?
• 是否曾经保存完一个修改,然后又想把个文件恢复到修改以前的状态?是否曾经希望能够看到一个文件以前某个时间点的状态?
• 是否曾经在项目中发现了一个 BUG,然后想调查它是什么时候产生的?
如果这些问题中的任何一个回答“是”的话,那么 TortoiseSVN 就是为你准备的!请继续读下去,你就能知道怎样让 TortoiseSVN 对你的工作起到帮助,这其实并不困难。

致读者
本书面向这样的计算机用户: 希望使用 Subversion 管理数据,但又不愿意使用 Subversion 的命令行客户端。因为 TortoiseSVN 是 Windows 的外壳扩展应用,所以我们假设用户很熟悉 Windows 资源管理器的使用。
阅读指南
在前言里简单介绍了 TortoiseSVN 项目,以及其开发团体,还介绍了使用及分发该软件应遵循的许可证。
在第 1 章 简介一章里解释了 TortoiseSVN 是什么,能够做什么,它的开发过程以及在你的个人电脑中安装它的基础知识。
在第 2 章 Basic Version-Control Concepts一章里简短地介绍了 Subversion 版本控制系统,Subversion 是 TortoiseSVN 的基础。这一章借用了 Subversion 项目的文档,介绍了各种版本控制模式,以及 Subversion 的工作原理。
第 3 章 版本库这一章解释了如何设置一个本地版本库,本地版本库对于在一台 PC 上测试 Subversion 和 TortoiseSVN 非常有用,这一章也介绍了一点版本库管理,也就是如何管理服务器上的版本库。如果你需要一台服务器,这里还有一节介绍如何搭建服务器
第 4 章 日常使用指南是最重要的章节,介绍了 TortoiseSVN 最主要特性的使用。它以教程的形式,从检出一个工作副本开始,然后修改,提交你的修改,之后进入高级主题。
第 5 章 SubWCRev 程序 是 TortoiseSVN 的一个独立程序,可以从工作副本抽取信息并记录到一个文件,可以用来在项目中包含构建信息。
附录 B, 如何实现 …这一节回答了一些操作方面的常见问题。这些常见问题在其他章节没有被明确的提到过。
附录 D, TortoiseSVN 操作 这一节展示了如何使用命令行调用 TortoiseSVN 的 GUI 对话框,当你在使用脚本时仍希望用户交互时非常有用。
附录 E, 命令行交叉索引给出了 TortoiseSVN 命令与其对应的 Subversion 命令行工具 svn.exe 命令之间的关系。
TortoiseSVN 是完全免费的!
TortoiseSVN 是免费的,你不需要为使用它而付费,可以用任何你希望的方式使用它,它开发的许可证是 GNU General Public License (GPL)。
TortoiseSVN is an Open Source project. That means you have full read access to the source code of this program. You can browse it on this link http://code.google.com/p/tortoisesvn/source/browse/. You will be prompted to enter username and password. The username is guest, and the password must be left blank. The most recent version (where we're currently working) is located under /trunk/, and the released versions are located under /tags/.
社区
TortoiseSVN 和 Subversion 由工作在这些项目的社区成员开发。他们来自全世界不同的国家,联合起来创造美妙的程序。
Tim Kemp
TortoiseSVN 项目的发起者
Stefan Küng
TortoiseSVN 的主要开发者
Lübbe Onken
制作了漂亮的图标,Logo,跟踪错误,翻译并且维护翻译结果
Simon Large
帮助编写文档和跟踪错误
Subversion 手册
为了对 Subversion 大量介绍,我们复制了其第二章
Tigris 样式项目
我们在本文重用了一些样式
我们的贡献者
为了那些补丁,问题报告和新创意,以及在邮件列表里通过回答问题帮助别人。
我们的捐赠者
他们发送给我们的那些音乐带来了快乐

本文使用的术语
为了使文档更加易读,所有 TortoiseSVN 的窗口名和菜单名使用不同的字体,例如日志对话框。
菜单选择使用箭头显示。TortoiseSVN → 显示日志的含义是: 从TortoiseSVN右键菜单选择显示日志。
在 TortoiseSVN 对话框中出现的右键菜单,可能是这个样子: 右键菜单 → 另存为 ...
用户界面按钮的显示形式: 点击OK以继续。
User Actions are indicated using a bold font. Alt+A: press the Alt-Key on your keyboard and while holding it down press the A-Key as well. Right-drag: press the right mouse button and while holding it down drag the items to the new location.
系统输出和键盘输入也使用不同的字体显示。

重要
使用图标标记的重要提示。

提示
技巧让你的生活更加简单。

小心
操作时需要小心的地方。

警告
需要特别关注的地方,如果忽略这些警告,会导致数据损坏或其他令人讨厌的事情。



什么是 TortoiseSVN?
TortoiseSVN 是 Subversion 版本控制系统的一个免费开源客户端,可以超越时间的管理文件和目录。文件保存在中央版本库,除了能记住文件和目录的每次修改以外,版本库非常像普通的文件服务器。你可以将文件恢复到过去的版本,并且可以通过检查历史知道数据做了哪些修改,谁做的修改。这就是为什么许多人将 Subversion 和版本控制系统看作一种“时间机器”。
某些版本控制系统也是软件配置管理(SCM)系统,这种系统经过精巧的设计,专门用来管理源代码树,并且具备许多与软件开发有关的特性 - 比如,对编程语言的支持,或者提供程序构建工具。不过 Subversion 并不是这样的系统;它是一个通用系统,可以管理任何类型的文件集,包括源代码。
TortoiseSVN 的历史
在2002年,Tim Kemp 发现 Subversion 是一个很好的版本控制系统,但是没有好的图形化客户端,创建一个作为 Windows 外壳集成的 Subversion 客户端的创意来自 TortoiseCVS,一个非常类似的 CVS 客户端。
Tim 学习了 TortoiseCVS 的源代码,将其作为 TortoiseSVN 的基础,然后开始这个项目,注册了域名 tortoisesvn.org,并将源代码提交到网上。此时 Stefan Küng 正在寻找一个好的免费版本控制系统,他发现了 Subversion 和 TortoiseSVN,由于 TortoiseSVN 还不能够使用,他加入了这个项目并开始编程。很快他便重写了大多数代码,并且开始添加命令和特性,此时,最初的代码都已经不复存在了。
随着 Subversion 越来越稳定,吸引了越来越多的用户开始使用 TortoiseSVN 作为他们的 Subversion 客户端。用户群增长迅速(每天都持续增长)。Lübbe Onken 提供了许多漂亮图标和 TortoiseSVN 的 logo,细心照料网站并且管理翻译。
TortoiseSVN 的特性
是什么让 TortoiseSVN 成为一个好的 Subversion 客户端?下面是一个简短的特性列表。

外壳集成
TortoiseSVN 与Windows 外壳(例如资源管理器)无缝集成,你可以保持在熟悉的工具上工作,不需要在每次使用版本控制功能时切换应用程序。
并且你不一定必须使用 Windows 资源管理器,TortoiseSVN 的右键菜单可以工作在其他文件管理器,以及文件/打开对话框等标准的 Windows 应用程序中。你必须牢记,TortoiseSVN 是有意作为 Windows 资源管理器的扩展开发,因此在其他程序可能集成的并不完整,例如重载图标可能不会显示。
重载图标
每个版本控制的文件和目录的状态使用小的重载图标表示,可以让你立刻看出工作副本的状态。
Subversion 命令的简便访问
所有的 Subversion 命令存在于资源管理器的右键菜单,TortoiseSVN 在那里添加子菜单。
因为 TortoiseSVN 是一个 Subversion 客户端,我们也很愿意为你展示一些 Subversion 本身的特性:
目录版本控制
CVS 只能追踪单个文件的历史,但是 Subversion 实现了一个“虚拟”文件系统,可以追踪整个目录树的修改,文件和目录都是版本控制的,结果就是可以在客户端对文件和目录执行移动和复制命令。
原子提交
提交要么完全进入版本库,要么一点都没有,这允许开发者以一个逻辑块提交修改。
版本控制的元数据
每个文件和目录都有一组附加的“属性”,你可以发明和保存任意的键/值对,属性是版本控制的,就像文件内容。
可选的网络层
Subversion 在版本库访问方面有一个抽象概念,利于人们去实现新的网络机制,Subversion 的“高级”服务器是 Apache 网络服务器的一个模块,使用 HTTP 的变种协议 WebDAV/DeltaV 通讯,这给了 Subversion 在稳定性和交互性方面很大的好处,可以直接使用服务器的特性,例如认证、授权、传输压缩和版本库浏览等等。也有一个轻型的,单独运行的 Subversion 服务器,这个服务器使用自己的协议,可以轻松的用 SSH 封装。
一致的数据处理
Subversion 使用二进制文件差异算法展现文件的区别,对于文本(人类可读)和二进制(人类不可读)文件具备一致的操作方式,两种类型的文件都压缩存放在版本库中,差异在网络上双向传递。
高效的分支和标签
分支与标签的代价不与工程的大小成比例,Subversion 建立分支与标签时只是复制项目,使用了一种类似于硬链接的机制,因而这类操作通常只会花费很少并且相对固定的时间,以及很小的版本库空间。
良好的维护能力
Subversion 没有历史负担,它由一系列良好的共享 C 库实现,具有定义良好的 API,这使 Subversion 非常容易维护,可以轻易的被其他语言和程序使用。

系统要求
TortoiseSVN 可以运行在 Windows 2000 SP2,Windows XP 或更高的版本。TortoiseSVN 1.2.0 以后不再支持 Windows 98, Windows ME 和 Windows NT4,但是如果需要的话,你仍旧可以下载以前的版本。
如果在安装 TortoiseSVN 时发现了任何问题,请首先参考附录 A, 常见问题(FAQ)。
安装

TortoiseSVN 提供一个容易使用的安装程序。双击安装程序文件并按照提示操作。安装程序将会完成剩余的步骤。

重要
你需要管理员权限来安装 TortoiseSVN。

语言包

TortoiseSVN 的界面已经翻译成了许多种语言,所以你可以下载符合你要求的语言包。你可以在我们的翻译状态页里看到语言包。如果没有你需要的,为什么不加入我们的团队并且提交你的翻译呢?-)
每一种语言包都是一个 .exe 安装程序,只要根据向导运行安装程序,当你下一次启动程序时,翻译就会生效。
拼写检查器

TortoiseSVN 包括了一个拼写检查器,可以检查你的提交日志信息,当你的项目语言不是你的本地语言时尤其有用,拼写检查器使用 OpenOffice 和 Mozilla 相同的词典。
安装程序自动添加 US 和 UK 英语词典。如果你需要其他语言,最简单的方法是安装 TortoiseSVN 的语言包,这会安装合适的词典文件和 TortoiseSVN 的本地用户界面,当你下一次启动程序时,词典也将会生效。
或者你也可以自己安装词典。如果你安装了 OpenOffice 或 Mozilla,你可以复制这些词典,位于那些应用的安装目录。否则,你需要从 http://wiki.services.openoffice.org/wiki/Dictionaries 下载必要的词典文件。
一旦你得到了词典文件,你可能需要重命名文件,这样文件名只包含位置信息,例如:

• en_US.aff
• en_US.dic
然后把它们复制到TortoiseSVN 安装目录的 bin 子目录,通常情况下,可能是在 C:\Program Files\TortoiseSVN\bin。如果你不希望弄乱bin子目录,你可以将拼写检查文件放置在C:\Program Files\TortoiseSVN\Languages,如果那个目录不存在,你可以自己创建,当你下次启动TortoiseSVN 时,就可以使用拼写检查器。
如果你安装了多个词典,TortoiseSVN 使用下面的规则选择一个。
1. 检查 tsvn:projectlanguage 设置,关于设置项目属性可以参考“项目设置”一节。
2. 如果没有设置项目语言,或者那个语言没有安装,尝试使用对应 Windows 区域信息的语言。
3. 如果精确的 Windows 区域信息不起作用,可以试一下“基础”语言,例如将 de_CH(Swiss-German) 修改为 de_DE (German)。
4. 如果以上都没有效果,则缺省语言是英语,包含在标准安装中。
本章修改自《使用 Subversion 进行版本管理》的相同章节,它的在线版本位于: http://svnbook.red-bean.com/。
这一章是对 Subversion 一个简短随意的介绍,如果你对版本控制很陌生,这一章节完全是为你准备的,我们从讨论基本概念开始,深入理解 Subversion 的思想,然后展示许多简单的实例。
尽管我们的例子展示了人们如何分享程序源代码,仍然要记住 Subversion 可以控制所有类型的文件-它并没有限制只为程序员工作。
文件共享的问题
考虑这个情景,我们有两个共同工作者,Harry 和 Sally,他们想同时编辑版本库里的同一个文件,如果首先 Harry 保存它的修改,过了一会,Sally 可能凑巧用自己的版本覆盖了这些文件,Harry 的更改不会永远消失(因为系统记录了每次修改),Harry 所有的修改不会出现在 Sally 的文件中,所以 Harry 的工作还是丢失了—至少是从最新的版本中丢失了—而且是意外的,这就是我们要明确避免的情况!
锁定-修改-解锁 方案
Many version control systems use a lock-modify-unlock model to address this problem, which is a very simple solution. In such a system, the repository allows only one person to change a file at a time. First Harry must lock the file before he can begin making changes to it. Locking a file is a lot like borrowing a book from the library; if Harry has locked a file, then Sally cannot make any changes to it. If she tries to lock the file, the repository will deny the request. All she can do is read the file, and wait for Harry to finish his changes and release his lock. After Harry unlocks the file, his turn is over, and now Sally can take her turn by locking and editing.
• 锁定可能导致管理问题。有时候 Harry 会锁住文件然后忘了此事,这就是说 Sally 一直等待解锁来编辑这些文件,她在这里僵住了。然后 Harry 去旅行了,现在 Sally 只好去找管理员放开锁,这种情况会导致不必要的耽搁和时间浪费。
• 锁定可能导致不必要的线性化开发。如果 Harry 编辑一个文件的开始,Sally 想编辑同一个文件的结尾,这种修改不会冲突,设想修改可以正确的合并到一起,他们可以轻松的并行工作而没有太多的坏处,没有必要让他们轮流工作。
• 锁定可能导致错误的安全状态。假设 Harry 锁定和编辑一个文件 A,同时 Sally 锁定并编辑文件 B,如果 A 和 B 互相依赖,这种变化是必须同时作的,这样 A 和 B 不能正确的工作了,锁定机制对防止此类问题将无能为力—从而产生了一种处于安全状态的假相。很容易想象 Harry 和 Sally 都以为自己锁住了文件,而且从一个安全,孤立的情况开始工作,因而没有尽早发现他们不匹配的修改。
复制-修改-合并 方案
Subversion,CVS 和一些版本控制系统使用复制-修改-合并模型,在这种模型里,每一个客户读取项目版本库建立一个私有工作副本—版本库中文件和目录的本地映射。用户并行工作,修改各自的工作副本,最终,各个私有的复制合并在一起,成为最终的版本,这种系统通常可以辅助合并操作,但是最终要靠人工去确定正误。
Here's an example. Say that Harry and Sally each create working copies of the same project, copied from the repository. They work concurrently, and make changes to the same file A within their copies. Sally saves her changes to the repository first. When Harry attempts to save his changes later, the repository informs him that his file A is out-of-date. In other words, that file A in the repository has somehow changed since he last copied it. So Harry asks his client to merge any new changes from the repository into his working copy of file A. Chances are that Sally's changes don't overlap with his own; so once he has both sets of changes integrated, he saves his working copy back to the repository.
图 2.5. 复制-修改-合并 方案(续)


但是如果 Sally 和 Harry 的修改重叠了该怎么办?这种情况叫做冲突,这通常不是个大问题,当 Harry 告诉他的客户端去合并版本库的最新修改到自己的工作副本时,他的文件 A 就会处于冲突状态: 他可以看到一对冲突的修改集,并手工的选择保留一组修改。需要注意的是软件不能自动的解决冲突,只有人可以理解并作出智能的选择,一旦 Harry 手工的解决了冲突(也许需要与 Sally 讨论),他就可以安全的把合并的文件保存到版本库。
复制-修改-合并模型感觉是有一点混乱,但在实践中,通常运行的很平稳,用户可以并行的工作,不必等待别人,当工作在同一个文件上时,也很少会有重叠发生,冲突并不频繁,处理冲突的时间远比等待解锁花费的时间少。
最后,一切都要归结到一条重要的因素: 用户交流。当用户交流贫乏,语法和语义的冲突就会增加,没有系统可以强制用户完美的交流,没有系统可以检测语义上的冲突,所以没有任何证据能够承诺锁定系统可以防止冲突,实践中,锁定除了约束了生产力,并没有做什么事。
有一种情况下锁定-修改-解锁模型会更好,也就是你有不可合并的文件,例如你的版本库包含了图片,两个人同时编辑这个文件,没有办法将这两个修改合并,Harry 或 Sally 会丢失他们的修改。
Subversion 怎么做?
Subversion 缺省使用复制-修改-合并模型,大多数情况下可以满足你的需求。然而,Subversion 1.2 后还是支持锁定,如果你有不可合并的文件,或者你只是想实行强制管理策略,Subversion 仍然会提供你需要的特性。
工作副本

你已经阅读过了关于工作副本的内容,现在我们要讲一讲客户端怎样建立和使用它。
一个 Subversion 工作副本是你本地机器一个普通的目录,保存着一些文件,你可以任意的编辑文件,而且如果是源代码文件,你可以像平常一样编译,你的工作副本是你的私有工作区,在你明确的做了特定操作之前,Subversion 不会把你的修改与其他人的合并,也不会把你的修改展示给别人。
After you've made some changes to the files in your working copy and verified that they work properly, Subversion provides you with commands to publish your changes to the other people working with you on your project (by writing to the repository). If other people publish their own changes, Subversion provides you with commands to merge those changes into your working directory (by reading from the repository).
一个工作副本也包括一些由 Subversion 创建并维护的额外文件,用来协助执行这些命令。通常情况下,你的工作副本每一个文件夹有一个以 .svn 为名的文件夹,也被叫做工作副本管理目录,这个目录里的文件能够帮助 Subversion 识别哪一个文件做过修改,哪一个文件相对于别人的工作已经过期了。
一个典型的 Subversion 的版本库经常包含许多项目的文件(或者说源代码),通常每一个项目都是版本库的子目录,在这种安排下,一个用户的工作副本往往对应版本库的的一个子目录。
举一个例子,你的版本库包含两个软件项目。
图 2.6. 版本库的文件系统


换句话说,版本库的根目录包含两个子目录: paint 和 calc。
To get a working copy, you must check out some subtree of the repository. (The term check out may sound like it has something to do with locking or reserving resources, but it doesn't; it simply creates a private copy of the project for you).
假定你修改了 button.c,因为 .svn 目录记录着文件的修改日期和原始内容,Subversion 可以告诉你已经修改了文件,然而,在你明确告诉它之前,Subversion 不会将你的改变公开。将改变公开的操作被叫做提交(或者是检入),它提交修改到版本库中。
发布你的修改给别人,可以使用 Subversion 的提交命令。
这时你对 button.c 的修改已经提交到了版本库,如果其他人取出了 /calc 的一个工作副本,他们会看到这个文件最新的版本。
设你有个合作者,Sally,她和你同时取出了 /calc 的一个工作副本,你提交了你对 button.c 的修改,Sally 的工作副本并没有改变,Subversion 只在用户要求的时候才改变工作副本。
要使项目最新,Sally 可以要求 Subversion 更新她的工作副本,通过使用更新命令,可以将你和所有其他人在她上次更新之后的修改合并到她的工作副本。
注意,Sally 不必指定要更新的文件,Subversion 利用 .svn 以及版本库的进一步信息决定哪些文件需要更新。
版本库的 URL
Subversion 可以通过多种方式访问-本地磁盘访问,或各种各样不同的网络协议,但一个版本库地址永远都是一个 URL,URL 方案反映了访问方法。
直接版本库访问(本地磁盘或者网络磁盘)。
通过 WebDAV 协议访问支持 Subversion 的 Apache 服务器。
与 http:// 相似,但是用 SSL 加密。
通过未认证的 TCP/IP 自定义协议访问 svnserve 服务器。
通过认证并加密的 TCP/IP 自定义协议访问 svnserve 服务器。
For the most part, Subversion's URLs use the standard syntax, allowing for server names and port numbers to be specified as part of the URL. The file:// access method is normally used for local access, although it can be used with UNC paths to a networked host. The URL therefore takes the form file://hostname/path/to/repos. For the local machine, the hostname portion of the URL is required to be either absent or localhost. For this reason, local paths normally appear with three slashes, file:///path/to/repos.
Also, users of the file:// scheme on Windows platforms will need to use an unofficially “standard” syntax for accessing repositories that are on the same machine, but on a different drive than the client's current working drive. Either of the two following URL path syntaxes will work where X is the drive on which the repository resides:
file:///X:/path/to/repos

...

file:///X|/path/to/repos

...

注意 URL 使用普通的斜杠,而不是 Windows 本地(非 URL)形式的路径。
你可以安全的访问网络共享的 FSFS 版本库,但是你不能以这种方式访问 BDB 版本库。

警告
不要创建和访问网络共享上的 Berkeley DB 版本库,它不能存在于一个远程的文件系统,即使是映射到盘符的共享。如果你希望在网络共享使用 Berkeley DB,结果难以预料-你可能会立刻看到奇怪的错误,也有可能几个月之后才发现数据库已经损坏了。

修订版本

svn commit 操作可以作为一个原子事务操作发布任意数量文件和目录的修改。在你的工作副本中,你可以改变文件内容,创建、删除、改名和复制文件和目录,然后作为一个整体提交。
在版本库中,每次提交被当作一次原子事务操作: 要么所有的改变发生,要么都不发生,Subversion 努力保持原子性以应对程序错误、系统错误、网络问题和其他用户行为。
每当版本库接受了一个提交,文件系统进入了一个新的状态,叫做版本,每个版本被赋予一个独一无二的自然数,一个比一个大,初始修订号是 0,只创建了一个空目录,没有任何内容。
可以形象的把版本库看作一系列树,想象有一组版本号,从 0 开始,从左到右,每一个修订号有一个目录树挂在它下面,每一个树好像是一次提交后的版本库“快照”。
全局版本号
不像其它版本控制系统,Subversion 的版本号是针对整个目录树的,而不是单个文件。每一个版本号代表了一次提交后版本库整个目录树的特定状态,另一种理解是版本 N 代表版本库已经经过了 N 次提交。当 Subversion 用户讨论“foo.c的版本 5”时,他们的实际意思是“在版本 5 时的foo.c”。需要注意的是,一个文件的版本 N 和 M 并不表示它必定不同。
需要特别注意的是,工作副本并不一定对应版本库中的单一版本,他们可能包含多个版本的文件。举个例子,你从版本库检出一个工作副本,最新的版本是 4:
calc/Makefile:4

integer.c:4

button.c:4

此刻,工作目录与版本库的版本 4 完全对应,然而,你修改了 button.c 并且提交之后,假设没有别的提交出现,你的提交会在版本库建立版本 5,你的工作副本会是这个样子的:
calc/Makefile:4

integer.c:4

button.c:5

假设此刻,Sally 提交了对 integer.c 的修改,建立修订版本 6,如果你使用 svn update 来更新你的工作副本,你会看到:
calc/Makefile:6

integer.c:6

button.c:6

Sally 对 integer.c 的改变会出现在你的工作副本,你对 button.c 的改变还在,在这个例子里,Makefile 在 4、5、6 版本都是一样的,但是 Subversion 会把 Makefile 的版本设为 6 来表明它是最新的,所以你在工作副本顶级目录作一次干净的更新,会使所有内容对应版本库的同一修订版本。
• 工作文件的基准版本(叫做文件的工作版本)和
• 一个本地副本最后更新的时间戳。
给定这些信息,通过与版本库通讯,Subversion 可以告诉我们工作文件是处与如下四种状态的那一种:

未修改且是当前的
文件在工作目录里没有修改,在工作版本之后没有修改提交到版本库。svn commit 操作不做任何事情,svn update 不做任何事情。
本地已修改且是当前的
工作副本已经修改,从基准版本之后没有修改提交到版本库。本地修改没有提交,因此 commit 会成功的提交,update 不做任何事情。
本地未修改且过时
这个文件在工作副本没有修改,但在版本库中已经修改了。这个文件应当更新到最新公共版本。commit 不做任何事情,update 将会更新工作副本到最新的版本。
本地已修改且过时
The file has been changed both in the working directory, and in the repository. A commit of the file will fail with an out-of-date error. The file should be updated first; an update command will attempt to merge the public changes with the local changes. If Subversion can't complete the merge in a plausible way automatically, it leaves it to the user to resolve the conflict.
• 我们介绍了中央版本库、客户工作副本和版本库中版本树队列的概念。
• 我们介绍了两个协作者如何使用使用“复制-修改-合并”模型,用 Subversion 发布和获得对方的修改。
• 我们讨论了一些 Subversion 跟踪和管理工作副本信息的方式。
无论你用什么协议访问你的版本库,都至少需要创建一个版本库,这可以使用Subversion命令行客户端或TortoiseSVN完成。
如果你还没有创建Subversion版本库,是时间开始了。
创建版本库

You can create a repository with the FSFS backend or with the older Berkeley Database (BDB) format. The FSFS format is generally faster and easier to administer, and it works on network shares and Windows 98 without problems. The BDB format was once considered more stable simply because it has been in use for longer, but since FSFS has now been in use in the field for several years, that argument is now rather weak. Read Choosing a Data Store in the Subversion book for more information.
1. 创建一个名为SVN(例如D:\SVN\)的空文件夹,作为你的所有版本库的根。
2. 在D:\SVN\里创建另一个目录MyNewRepository。
3. 打开命令行窗口(或DOS窗口),进入D:\SVN\目录,输入
4. svnadmin create --fs-type bdb MyNewRepository
5.

svnadmin create --fs-type fsfs MyNewRepository

现在你在D:\SVN\MyNewRepository创建了一个新的版本库。
6. 打开资源管理器
7. 创建一个新的文件夹,命名为SVNRepository
8. 右键点击新创建的目录,选择TortoiseSVN → 在此创建版本库...。
然后就会在新文件夹创建一个版本库,不要手工编辑这些文件!!!如果你得到什么警告,一定要先确定目录非空并且没有写保护。
提示
TortoiseSVN 不再给你创建 BDB 版本库的选择,尽管你仍旧可以使用命令行工具创建。FSFS 版本库通常很容易维护,也让我们维护 TortoiseSVN 变得更容易,因为我们不再需要处理不同 BDB 版本之间的兼容性问题。
Future versions of TortoiseSVN will not support file:// access to BDB repositories due to these compatibility issues, although it will of course always support this repository format when accessed via a server through the svn://, http:// or https:// protocols. For this reason, we strongly recommend that any new repository which must be accessed using file:// protocol is created as FSFS.
Of course we also recommend that you don't use file:// access at all, apart from local testing purposes. Using a server is more secure and more reliable for all but single-developer use.
本地访问版本库

为了访问本地版本库,你需要这个文件夹的路径,只要记住Subversion期望所有的版本库路径使用的形式为file:///C:/SVNRepository/,请注意全部使用的是斜杠。
为了访问网络共享中的版本库,你可以使用驱动器影射或使用UNC路径,对于UNC路径,形式为file://ServerName/path/to/repos/,请注意这里前面只有两个斜杠。
在SVN 1.2之前,UNC路径曾经是一种非常晦涩的格式file:///\ServerName/path/to/repos,这种格式依然支持,但不推荐。
警告
不要创建和访问网络共享上的 Berkeley DB 版本库。它不能存在于远程文件系统。即使是映射到盘符的共享。如果你尝试在网络共享使用 Berkeley DB,结果难以预料 - 你可能会立刻看到奇怪的错误,也有可能几个月之后才发现数据库已经损坏了。
访问网络共享磁盘上的版本库

尽管从理论上说,将一个 FSFS 格式的版本库放在网络中共享,并且多用户通过 file:// 协议访问是可以的。但这样做是非常不妥当的。事实上我们强烈反对这样做,并且不支持这样的用法。
首先,这样赋予所有用户对版本库的写权限,所以任何一个用户都可能意外的删除整个版本库,或者因为别的问题导致版本库不可用。
其次,不是所有的网络文件共享协议都支持 Subversion 需要的文件锁定,所以你会发现你的版本库被毁了。它也许不会马上发生,但是总有一天会有 2 个用户同时访问版本库。
第三,文件的权限必需设置得井井有条。也许 Windows 的共享可以避开这个问题,但是在 SAMBA 中却是相当困难的。
file:// 访问是为本机工作而准备的,只能单用户访问,特别是测试和调试。当你打算共享版本库的时候,你真的需要设置一个适当的服务器,而且它并不像你想象的那样困难。阅读“Accessing the Repository”一节获得选择指南,并配置服务器。
版本库布局
在将你的数据导入到版本库之前,首先你得考虑如何组织你的数据。如果你使用一种推荐的布局,你在后面的操作将会更容易许多。
There are some standard, recommended ways to organize a repository. Most people create a trunk directory to hold the “main line” of development, a branches directory to contain branch copies, and a tags directory to contain tag copies. If a repository holds only one project, then often people create these top-level directories:
/trunk

/branches

/tags

如果一个版本库包含多个项目,人们通常按分支来安排布局:
/trunk/paint

/trunk/calc

/branches/paint

/branches/calc

/tags/paint

/tags/calc

……或者按项目:
/paint/trunk

/paint/branches

/paint/tags

/calc/trunk

/calc/branches

/calc/tags

如果项目不是密切相关,而且每一个是单独被检出,那么按项目布局是合理的。对于那些你想一次检出所有项目,或需要将它们打成一个分发包的相关项目,按分支来布局通常比较好。这种方式你只要检出一个分支,而且子项目之间的关系也比较清楚。
如果你采用顶层/trunk /tags /branches这种方式,并不意味着你必须复制整个主线为分支或标签,而且某些情况下这种结构更具灵活性。
对于不相关的项目,你可能更愿意使用不同的版本库。当你提交时,改变的是整个版本库的修订号,而不是项目的。让两个不相关的项目共用一个版本库,会导致修订号出现较大的跳跃。Subversion和TortoiseSVN项目看起来是在同一个主机地址,但是它们是在完全独立的版本库中开发着,并且版本号也不相干。
当然,你完全可以不理会上面提及的通用布局。你可以自由改变,来满足你和你团队的需要。请记住,不管你选择哪种布局,它都不是永久的。你可以在随时重新组织你的版本库。因为分支和标签是普通的目录,只要你愿意,TortoiseSVN可以将它们移动或重命名。
从一种布局转换到另一种布局仅仅是在服务器端移动一些文件或目录;如果你不喜欢版本库的组织形式,仅管大胆地修改那些目录。
因此,如果你还没有在版本库中创建基本的文件夹结构,你应该立刻创建。创建文件夹有 2 种方法。如果你只想创建一个 /trunk /tags /branches 结构,你可以使用版本库浏览器创建这 3 个文件夹(独立的 3 次提交)。如果你想创建一个层次更深的结构,那么更简单的做法是先在硬盘中创建好文件夹结构,然后将其导入(只有 1 次提交),就像这样:
1. 在你的硬盘上创建一个空的文件夹
2. 在那个文件夹下创建你想要的顶级目录--千万不要放任何文件进去!
3. 通过在那个文件夹右键,选择TortoiseSVN → 导入... 将这个结构导入到版本库中。这将导入临时文件夹到版本库的根目录形成一个基本的版本库布局。
注意,你所导入的那个文件夹的名字并不存在于版本库中,仅仅是它所包含的内容。比如,创建如下结构的文件夹
C:\Temp\New\trunk

C:\Temp\New\branches

C:\Temp\New\tags

导入C:\Temp\New到版本库的根目录,版本库中将会是这样:
/trunk

/branches

/tags


版本库备份

无论你使用何种版本库,定期维护和验证版本库备份非常重要,或许你可以访问最近版本的文件,但是如果没有版本库,所有的历史将会丢失。
最简单(但不推荐)的方法是复制整个版本库目录到备份介质,然而你必须绝对确定没有访问数据的进程,在这里“访问”的意思是任何访问,一个BDB版本库即使在访问看起来只需要读时也会有写操作,如果在复制时版本库被访问了(web浏览器,WebSVN等等),备份将毫无价值。
推荐的方法是运行
svnadmin hotcopy path/to/repository path/to/backup --clean-logs

,用一种安全的方式创建版本库的备份,备份是一个副本,--clean-logs选项并不必须,但是通过删除BDB版本库中多余的日志文件可以节省一些空间。
The svnadmin tool is installed automatically when you install the Subversion command line client. If you are installing the command line tools on a Windows PC, the best way is to download the Windows installer version. It is compressed more efficiently than the .zip version, so the download is smaller, and it takes care of setting the paths for you. You can download the latest version of the Subversion command line client from http://subversion.apache.org/getting.html.
服务器端钩子脚本

A hook script is a program triggered by some repository event, such as the creation of a new revision or the modification of an unversioned property. Each hook is handed enough information to tell what that event is, what target(s) it's operating on, and the username of the person who triggered the event. Depending on the hook's output or return status, the hook program may continue the action, stop it, or suspend it in some way. Please refer to the chapter on Hook Scripts in the Subversion Book for full details about the hooks which are implemented.
这些钩子脚本被版本库所在的服务器执行。TortoiseSVN 也允许你配置由确定事件触发,在本地执行的客户端脚本。请参看 “客户端钩子脚本”一节 以获得更多信息。
版本库的hooks目录中有一些钩子的例子脚本,这些例子脚本适合于Unix/Linux服务器,在Windows下需要修改。钩子可以是批处理文件或可执行文件,下面是用来实现pre-revprop-change钩子的例子。
rem Only allow log messages to be changed.

if "%4" == "svn:log" exit 0

echo Property '%4' cannot be changed >&2

exit 1

请注意所有发送到标准输出的东西都会被忽略,如果你希望信息出现在拒绝提交对话框中,你需要将这些信息发送到标准错误,在一个批处理文件中使用>&2实现。
检出链接

如果你希望你的 Subversion 版本库对于别人可用,你可以在你的站点包含一个链接。为了让其更加容易访问,你可以为其它 TortoiseSVN 用户包含一个检出链接。
当你安装了 TortoiseSVN,它会注册一个 tsvn: 协议,当 TortoiseSVN 用户点击这样一个链接,检出窗口会自动弹出,且版本库 URL 已经填入。
To include such a link in your own html page, you need to add code which looks something like this:
<a href="tsvn:http://project.domain.org/svn/trunk">

</a>

Of course it would look even better if you included a suitable picture. You can use the TortoiseSVN logo or you can provide your own image.
<a href="tsvn:http://project.domain.org/svn/trunk">

<img src=TortoiseCheckout.png></a>

你同样可以使链接指向一个特定的版本,例如
<a href="tsvn:http://project.domain.org/svn/trunk?100">

</a>


Accessing the Repository
To use TortoiseSVN (or any other Subversion client), you need a place where your repositories are located. You can either store your repositories locally and access them using the file:// protocol or you can place them on a server and access them with the http:// or svn:// protocols. The two server protocols can also be encrypted. You use https:// or svn+ssh://, or you can use svn:// with SASL.
如果你使用公共的主机服务,例如 Google Code,或者已经有人为你架设好了服务器,那么在这里你不用做什么。前进到 第 4 章 日常使用指南 。
If you don't have a server and you work alone, or if you are just evaluating Subversion and TortoiseSVN in isolation, then local repositories are probably your best choice. Just create a repository on your own PC as described earlier in 第 3 章 版本库. You can skip the rest of this chapter and go directly to 第 4 章 日常使用指南 to find out how to start using it.
如果你打算在网络共享中设者一个多用户的版本库,请重新考虑。阅读“访问网络共享磁盘上的版本库”一节以了解为什么我们认为这是一个坏主意。设置一个服务器并不像听上去那样难。并且还会为你提供更好的性能甚至更快的速度。
The next sections are a step-by-step guide on how you can set up such a server on a Windows machine. Of course you can also set up a server on a Linux machine, but that is beyond the scope of this guide. More detailed information on the Subversion server options, and how to choose the best architecture for your situation, can be found in the Subversion book under Server Configuration.
简介

在 Subversion 中包含 Svnserve - 一个轻型的独立服务器,它使用一个基于一般 TCP/IP 连接的定制协议。用于小型安装,或者不能使用全能 Apache 服务器的地方。
In most cases svnserve is easier to setup and runs faster than the Apache based server, although it doesn't have some of the advanced features. And now that SASL support is included it is easy to secure as well.
4. 可以从这里获取最新版本的 Subversion http://subversion.apache.org/getting.html。另外,也可以从 ColabNet 获取一个打包好的安装程序 http://www.collab.net/downloads/subversion 。这个安装程序将会把 svnserve 设置为 Windows 服务,并且还包含了一些你需要的工具,如果你为了安全而使用 SASL。
5. 如果你已经安装了 Subversion,svnserve 已经运行,你需要在继续之前把它停下来。
6. 运行 Subversion 安装程序,如果你在你的服务器(推荐)上运行,可以跳过第 4 步。
7. 打开资源管理器,进入Subversion的安装目录(通常是C:\Program Files\Subversion)的bin目录,找到文件svnserve.exe,intl3_svn.dll,libapr.dll,libapriconv.dll,libapriutil.dll,libdb*.dll,libeay32.dll和ssleay32.dll,复制这些文件,或所有bin目录内的文件到你的服务器目录,例如c:\svnserve。

运行 svnserve
现在svnserve已经安装了,你需要在你的server运行它,最简单的方法是在DOS窗口或者windows快捷方式输入:
svnserve.exe --daemon

svnserve将会在端口3690等待请求,--daemon选项告诉svnserve以守护进程方式运行,这样在手动终止之前不会退出。
如果你没有创建一个版本库,根据下面的Apache服务器设置指令“配置”一节。
为了验证svnserve正常工作,使用TortoiseSVN → 版本库浏览器来查看版本库。
假定你的版本库位于c:\repos\TestRepo,你的服务器叫做localhost,输入:
svn://localhost/repos/TestRepo

当被版本库浏览器提示输入。
你也可以使用 --root 选项设置根位置来限制访问服务器的目录,从而增加安全性和节约输入 svnserve URL 的时间:
svnserve.exe --daemon --root drive:\path\to\repository\root

以前面的测试为例,svnserve 现在的运行命令为:
svnserve.exe --daemon --root c:\repos

然后在 TortoiseSVN 中我们的版本库浏览器 URL 缩短为:
svn://localhost/TestRepo

注意,当 svnserve 和版本库位于不同分区或盘符时也需要使用 --root 选项。
Svnserve 可以提供任意数量的版本库服务。只要将这些版本库放到你刚才定义的根目录下即可,然后使用相对于根的URL访问它们。
警告
不要创建和访问网络共享上的 Berkeley DB 版本库,它不能存在于一个远程的文件系统,即使是映射到盘符的共享。如果你希望在网络共享使用 Berkeley DB,结果难以预料-你可能会立刻看到奇怪的错误,也有可能几个月之后才发现数据库已经损坏了。
以服务形式运行 svnserve

使用普通用户直接运行 svnserve 通常不是最好的方法。它意味着你的服务器必须有一个用户登录,还要记着重新启动服务器后重新启动 svnserve。最好的方法是将 svnserve 作为 windows 服务运行。从 Subversion 1.4 开始,svnserve 可以安装为 windows 服务。
To install svnserve as a native windows service, execute the following command all on one line to create a service which is automatically started when windows starts.
sc create svnserve binpath= "c:\svnserve\svnserve.exe --service

--root c:\repos" displayname= "Subversion" depend= tcpip

start= auto

If any of the paths include spaces, you have to use (escaped) quotes around the path, like this:
sc create svnserve binpath= "

\"C:\Program Files\Subversion\bin\svnserve.exe\"

--service --root c:\repos" displayname= "Subversion"

depend= tcpip start= auto

You can also add a description after creating the service. This will show up in the Windows Services Manager.
sc description svnserve "Subversion server (svnserve)"

注意 sc 的命令行很特殊。在 key= value 对中,key 与 = 之间不能有空格,但是在 value 之前,必须有空格。
提示
Microsoft 现在建议服务程序使用本地服务或网络服务帐户运行,参考 The Services and Service Accounts Security Planning Guide。以本地服务帐户创建服务,需要在上面的例子里追加下面几行。
obj= "NT AUTHORITY\LocalService"

请注意需要给本地服务帐户一些目录的适当权限,包括的 Subversion 和你的版本库,还有所有钩子脚本使用的应用。此帐号的内置组名是"LOCAL SERVICE"。
服务安装完毕后,你需要在服务管理器中启动它(仅此一次;当服务器重启后它会自动启动)。
为了得到更详细的信息,可参考 Windows Service Support for Svnserve。
如果你已经使用 SvnService 包装安装了早期的 svnserve,现在想使用内置服务,那么你需要将其从服务中删除(切记先停止服务!)。使用简单的命令
svnservice -remove

即可删除服务。
svnserve 与基本认证
The default svnserve setup provides anonymous read-only access. This means that you can use an svn:// URL to checkout and update, or use the repo-browser in TortoiseSVN to view the repository, but you won't be able to commit any changes.
为了打开对版本库的写访问,你可以编辑版本库目录的conf/svnserve.conf文件,这个文件控制了svnserve守护进程的配置,也提供了有用的文档。
为了打开匿名的写访问,只需要简单得设置:
[general]

anon-access = write

然而,你不会知道谁修改了版本库,因为svn:author属性是空的,你也不能控制谁来修改版本库,这是一个很危险的设置。
解决这个问题的一个方法是创建密码数据库:
[general]

anon-access = none

auth-access = write

password-db = userfile

这里的 userfile 与 svnserve.conf 文件在同一个目录,这个文件也可以存在于文件系统的其他地方(当多个版本库使用相同的访问权限时尤其有用),可以使用绝对路径,或者是 conf 的相对目录,使用 \ 或盘符不能工作。userfile 的结构如下:
[general]

anon-access = none

auth-access = write

password-db = userfile

这个例子拒绝所有的未认证用户(匿名)访问,给 userfile 中的用户读写权限。
提示
If you maintain multiple repositories using the same password database, the use of an authentication realm will make life easier for users, as TortoiseSVN can cache your credentials so that you only have to enter them once. More information can be found in the Subversion book, specifically in the sections Create a 'users' file and realm and Client Credentials Caching
什么是 SASL?
Cyrus 简单的认证和安全层(The Cyrus Simple Authentication and Security Layer)是一个由卡耐基梅隆大学编写的开源软件。它可以为任何网络协议增加通用认证和加密的能力,并且从 Subversion 1.5 开始所有的后续版本,包括 svnserve 服务器和 TortoiseSVN 客户端知道如何使用这个库。
要获得这一选项可用性的更充分讨论,你应该看一下 Subversion 手册中的通过 SASL 使用 svnserve 。如果你仅仅是找一种简单的方法为 Windows 服务器设置安全的认证和加密,因此你的版本库可以安全的通过又大又乱的互联网访问,请继续阅读。
SASL 认证
要在服务器上激活详尽的 SASL 功能,你需要做 3 件事。首先,在你的版本库的 svnserve.conf 文件中创建一个 [sasl] 节,包括这样一个配置项:
use-sasl = true

其次,在一个合适的地方创建一个名为 svn.conf 的文件 - 通常在 Subversion 的安装目录中。
第三,创建 2 个新的注册表项目来告诉 SASL 到哪里找到需要的东西。创建一个名为的 [HKEY_LOCAL_MACHINE\SOFTWARE\Carnegie Mellon\Project Cyrus\SASL Library] 注册表键并在其中创建两个新的字符串值:SearchPath 设置为 sasl*.dll 插件所在的目录路径(通常是 Subversion 的安装目录),ConfFile 设置为 svn.conf 文件所在的目录。如果你使用 CollabNet 安装程序,这两个注册表键就已经为你创建好了。
编辑文件 svn.conf,使其包括下列内容:
pwcheck_method: auxprop

auxprop_plugin: sasldb

mech_list: DIGEST-MD5

sasldb_path: C:\TortoiseSVN\sasldb

最后一行指示认证数据库的位置,认证数据库是一个名为 sasldb 的文件。它可以在任何地方,不过一个方便的选择是在版本库的上层目录中。确认 svnserve 服务有读取这个文件的权限。
如果 svnserve 已经在运行,你需要重启服务,并确保它读取了更新后的配置参数。
现在所有的东西已经设置完成,你要做的事情就是创建用户和密码。你需要 saslpasswd2 程序来做这件事。如果你使用 CollabNet 安装程序,这个程序会在安装目录内。使用像这样的命令:
saslpasswd2 -c -f C:\TortoiseSVN\sasldb -u realm username

选项 -f 指明数据库的位置,realm 必须与版本库的 svnserve.conf 文件中设置相同的值, username 就是你要使用的用户名。注意 realm 不允许包含空字符。
你可以使用 sasldblistusers2 程序列出数据库中储存的用户名。
SASL 加密
为了启用或禁用加密的不同等级,你可以设置版本库内文件 svnserve.conf 中的两个值:
[sasl]

use-sasl = true

min-encryption = 128

max-encryption = 256

变量 min-encryption 和 max-encryption 控制服务器所需要的加密强度。要完全禁用加密,就将这 2 个变量的值都设为 0。要启用简单的数据校验(例如,为了防止篡改和保证数据的完整,不加密),就将这 2 个值都设为 1。如果你想允许(但不强制)加密,将最小值设为 0,最大值设为任意位数。要强制加密,将这 2 个值设为大于 1 的数字。在前面的例子中,我们要求客户端至少进行 128 位加密,但是不大于 256 位加密。
使用 svn+ssh 认证
另一种 svnserve 认证的方法是使用 SSH 来建立请求通道。它不像设置 SASL 那样简单,但是某些场合却很有用。
通过此方法,svnserve 不会作为守护进程启动,而是 SSH 为你启动 svnserve,以 SSH 认证的用户身份运行,为此,你需要在你的服务器上有 SSH 守护进程。
设置服务器的基本方法请参见附录 G, 用 SSH 使服务器更安全。你可以在常见问题(FAQ)中使用关键词 “SSH” 找到其它 SSH 相关的主题。
更多的关于svnserve的信息可以看《使用 Subversion 进行版本管理》。
svnserve 基于路径的授权
从 Subversion 1.3 开始,svnserve 支持与 mod_authz_svn 相同的基于路径的授权模式,你需要编辑版本库路径下的 conf/svnserve.conf 引用的授权文件。
[general]

authz-db = authz

在这里,authz 是你创建用来定义访问权限的文件,你可以为每一个版本库使用单独的文件,或者为所有的版本库使用相同的文件,关于此文件的格式可以查看“路径为基础的授权”一节。
WebDAV
The Apache based Subversion server uses the WebDAV protocol which is supported by many other programs as well. You could e.g. mount such a repository as a “Web folder” in the Windows explorer and then access it like any other folder in the file system.
浏览版本库
你可以将浏览器指向版本库的URL,无需安装Subversion客户端就可以浏览内容,这样可以扩大访问你数据的用户圈。
认证
你可以使用所有Apache支持的认证机制,包括SSPI和LDAP。
安全
因为Apache非常稳定和安全,你的版本库可以自动获得同样的安全性,包括SSL加密。
安装 Apache
安装 Apache 的先决条件是有一台安装了 Windows 2000,Windows XP SP1+,Windows 2003,Vista 或 Windows Server 2008 的计算机。
8. 从 http://httpd.apache.org/download.cgi 下载最新版本的 Apache,请确认你下载的版本是 2.2.x - 1.3.xx 的版本不能工作!
点击 other files,然后浏览 binaries/win32,可以找到 msi 格式的 Apache 安装文件。你可以选择 msi 文件 apache-2.2.x-win32-x86-openssl-0.9.x.msi (这个包含有 OpenSSL)。
9. 一旦你有了 Apache2 安装程序,你可以双击它,然后它会指导你的安装过程。请确认你输入的服务器 URL 正确(如果你的服务器没有 DNS 名称,请直接输入 IP 地址)。我建议为所有用户在 80 端口安装 Apache 服务。注意: 如果你已经有了 IIS 或其他监听 80 端口的程序,安装会失败。如果发生这种情况,直接到程序的安装目录 \Apache Group\Apache2\conf,打开 httpd.conf。编辑文件的 Listen 80 为其他可用的端口,例如 Listen 81,然后重新启动 - 这样就不会那个问题了。
10. 现在可以测试 Apache 服务器是否正确运行,将浏览器指向 http://localhost/ - 将会看到一个预先配置的网站。
小心
如果你决定将Apache安装为服务,缺省情况以本地系统帐户运行会发出警告,更安全的方法是为Apache创建一个单独的运行帐户。
请确认Apache运行的帐户是版本库目录的访问控制列表(右键目录|属性|安全)中一个明确的条目,对目录有完全的控制能力,否则,用户不能提交他们的修改。
即使Apache运行于本地系统,你仍然需要这个条目(这种情况下将是SYSTEM帐户)。
如果没有配置 Apache 的此访问权限,你的用户会得到“拒绝访问(Access denied)”的错误信息,在 Apache 的错误日志中的错误代码是 500。
1. Download the latest version of the Subversion Win32 binaries for Apache. Be sure to get the right version to integrate with your version of Apache, otherwise you will get an obscure error message when you try to restart. If you have Apache 2.2.x go to http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=8100.
2. 运行Subversion安装程序,并根据指导安装,如果Subversion认识到你安装了Apache,你就几乎完成了工作,如果它没有找到Apache服务器,你还有额外的步骤。
3. 使用Windwos资源管理器,来到Subversion的安装目录(通常是c:\program files\Subversion),找到文件/httpd/mod_dav_svn.so和mod_authz_svn.so,复制这些文件到Apache的模块目录(通常是c:\program files\apache group\apache2\modules )。
4. 从 Subversion 安装目录将 /bin/libdb*.dll 和 /bin/intl3_svn.dll 复制到 Apache 的 bin 目录。
5. 使用记事本之类的文本编辑器修改Apache的配置文件(通常是 C:\Program Files\Apache Group\Apache2\conf\httpd.conf),做出如下修改:
去掉以下几行的注释(删除 '#'标记):
#LoadModule dav_fs_module modules/mod_dav_fs.so

#LoadModule dav_module modules/mod_dav.so

将以下两行到 LoadModule 节的末尾。
LoadModule dav_svn_module modules/mod_dav_svn.so

LoadModule authz_svn_module modules/mod_authz_svn.so


配置
现在你已经配置了 Apache 和 Subversion,但是 Apache 不知道如何处理 Subversion 客户端,例如TortoiseSVN。为了让 Apache 知道哪个 URL 是用作 Subversion 版本库,你需要使用任意文本编辑器(例如记事本)编辑 Apache 的配置文件(通常是 c:\program files\apache group\apache2\conf\httpd.conf):
6. At the end of the config file add the following lines:
7. <Location /svn>
8.
9. DAV svn
10.
11. SVNListParentPath on
12.
13. SVNParentPath D:\SVN
14.
15. #SVNIndexXSLT "/svnindex.xsl"
16.
17. AuthType Basic
18.
19. AuthName "Subversion repositories"
20.
21. AuthUserFile passwd
22.
23. #AuthzSVNAccessFile svnaccessfile
24.
25. Require valid-user
26.
27. </Location>
28.
This configures Apache so that all your Subversion repositories are physically located below D:\SVN. The repositories are served to the outside world from the URL: http://MyServer/svn/ . Access is restricted to known users/passwords listed in the passwd file.
29. 为了创建 passwd 文件,再次打开命令行提示符(DOS 窗口),进入 apache2 目录(通常是 c:\program files\apache group\apache2),通过输入下面的命令创建文件
30. bin\htpasswd -c passwd <username>
31.
它将会创建名为 passwd 的文件用于认证。用下面的命令增加其它用户
bin\htpasswd passwd <username>

32. 再次重启Apache服务。
33. 将浏览器指向http://MyServer/svn/MyNewRepository(MyNewRepository是你此前创建的版本库名),如果一切正常,你会被提示输入用户名和密码,然后你会看到版本库的内容。
你刚才输入的简短解释是:

设置 解释
<Location /svn> 意思是Subversion版本库的URL是http://MyServer/svn/
DAV svn 告诉Apache是哪个模块响应那个URL的请求-此刻是Subversion模块。
SVNListParentPath on 对于 Subversion 1.3 或者更高版本,这个指示会列出所有 SVNParentPath 中的版本库。
SVNParentPath D:\SVN 告诉Subversion需要查看的版本库位于D:\SVN之下
SVNIndexXSLT "/svnindex.xsl" 使用它可以在用浏览器浏览时更好看。
AuthType Basic 激活基本认证,就是用户名/密码
AuthName "Subversion repositories" 用来说明何时弹出要求用户输入认证信息的认证对话框
AuthUserFile passwd 指定使用的认证密码文件
AuthzSVNAccessFile 位置Subversion版本库的访问控制文件的路径
Require valid-user 指定只有输入了正确的用户/密码的用户可以访问URL


但是那只是一个例子。对于 Apache 你有很多可能的选择。

• 如果你希望所有人可以读你的版本库,但是只有特定用户可以写,你可以修改下面几行
• Require valid-user

to
<LimitExcept GET PROPFIND OPTIONS REPORT>

Require valid-user

</LimitExcept>

• 使用 passwd 可以整体的控制对版本库的访问,但是如果你希望精确的控制版本库目录访问,你可以去掉下行的注释
• #AuthzSVNAccessFile svnaccessfile

,并且创建 Subversion 的访问控制文件。Apache 将会确保只有有效的用户可以访问你的 /svn 目录,然后将用户名传递给 Subversion 的 AuthzSVNAccessFile 模块,这样就可以根据 Subversion 访问控制文件内的规则实现更细粒度的访问控制。请注意路径可以是 repos:path 或简单的 path,如果你不指定特定的版本库,访问控制规则会应用到 SVNParentPath 下所有的版本库。使用的授权策略文件的格式在“路径为基础的授权”一节描述。
• 如果要使浏览器浏览仓库时更“漂亮”,请将去掉下行注释
• #SVNIndexXSLT "/svnindex.xsl"

,将文件 svnindex.xsl, svnindex.css 和 menucheckout.ico 放到你的文档根目录中(通常是 C:/Program Files/Apache Group/Apache2/htdocs)。 这个目录在 Apache 配置文件中用 DocumentRoot 指示设置。
You can get those three files directly from our source repository at http://tortoisesvn.googlecode.com/svn/trunk/contrib/svnindex. (“TortoiseSVN 是完全免费的!”一节 explains how to access the TortoiseSVN source repository).
TortoiseSVN 版本库中的 XSL 文件有个特性:如果你用浏览器浏览版本库,那么每个版本库中的目录右边会有个图标。如果你点击此图标,那么 TortoiseSVN 会为此 URL 启动检出对话框。

多版本库

如果你使用 SVNParentPath 指示,你就不必在每次添加新 Subversion 版本库时修改 Apache 的配置文件,只需要在第一个版本库所在的位置建立新的版本库就可以了。在我的公司,我可以使用 SMB(普通的 windows 文件访问)直接访问服务器的文件夹,所以我直接在那里创建一个目录,运行 TortoiseSVN 命令TortoiseSVN → 在此创建版本库...,然后一个新的项目建立了...
如果你使用 Subversion 1.3 或更高版本,可以使用 SVNListParentPath on 指示,这样当你使用浏览器访问父路径而不是具体某个版本库时 Apache 就会显示所有版本库列表。
路径为基础的授权

mod_authz_svn 模块可以根据用户名和路径实现细粒度的权限控制,它对 Apache 服务器有效,在 Subversion 1.3 以上版本的 svnserve 中也实现了基于路径的授权。
一个可能的例子:
[groups]

admin = john, kate

devteam1 = john, rachel, sally

devteam2 = kate, peter, mark

docs = bob, jane, mike

training = zak

# Default access rule for ALL repositories

# Everyone can read, admins can write, Dan German is excluded.

[/]

* = r

@admin = rw

dangerman =

# Allow developers complete access to their project repos

[proj1:/]

@devteam1 = rw

[proj2:/]

@devteam2 = rw

[bigproj:/]

@devteam1 = rw

@devteam2 = rw

trevor = rw

# Give the doc people write access to all the docs folders

[/trunk/doc]

@docs = rw

# Give trainees write access in the training repository only

[TrainingRepos:/]

@training = rw

请注意,检查每一条路径是一件消耗极大的操作,特别是修订版本日志,服务器会检查在每一个修订版本的每一条路径是否可读,对于影响很多文件的修订将会花费很多时间。
认证和授权是不同的处理过程,如果用户希望获得对版本库的访问,他需要通过全部检查,即通常的认证需求和访问控制文件的授权需求。
使用 Windows 域认证

你已经注意到了,你需要为每个用户在passwd文件中创建用户名/密码条目,如果(因为安全原因)他们希望周期性的修改他们的密码,你需要手动的做出修改。
但是对于此问题有另一个解决方案 - 至少是你在使用域控制器的 LAN 中访问版本库时: mod_auth_sspi!
最初的 SSPI 是由 Syneapps 提供的,包括源代码。但是它的开发已经终止。不过不要失望,社区重新拾起代码并进行了改进,它现在的新主页在SourceForge。
• 下载此匹配你的 Apache 版本的模块,将文件mod_auth_sspi.so复制到 Apache 的 modules 目录。
• 编辑 Apache 的配置文件: 增加一行
• LoadModule sspi_auth_module modules/mod_auth_sspi.so

到 LoadModule 节。确认你在下行之前插入此行
LoadModule auth_module modules/mod_auth.so

• 为了让 Subversion 领域使用此认证类型,你需要将
• AuthType Basic

修改为
AuthType SSPI

并且在 <Location /svn> 中增加
SSPIAuth On

SSPIAuthoritative On

SSPIDomain <domaincontroller>

SSPIOmitDomain on

SSPIUsernameCase lower

SSPIPerRequestAuth on

SSPIOfferBasic On

如果你没有域控制器,可以将域控制器的名称置为 <domaincontroller> 。
请注意,当你使用 SSPI 认证时,没有必要再使用 AuthUserFile 行定义密码文件,Apache 使用 Windows 域验证你的用户名和密码,你需要更新 svnaccessfile 中的用户列表来引用 DOMAIN\username。
重要
只有使用 SSL 加密连接(https)时才可以启用 SSPI 认证。如果你只是用普通 http 协议连接到服务器,那么它不会工作。
要使你的服务器启用 SSL,请看: “用 SSL 使服务器更安全”一节
提示
Subversion 的 AuthzSVNAccessFile 文件对用户名大小写敏感(JUser 与 juser 不同)。
在微软的世界,Windows 域和用户名不是大小写敏感。即使如此,一些网络管理员还是喜欢创建首字母大写的用户帐号(例如 JUser)。
使用SSPI的一个问题是用户名和密码是用户在提示输入时发送到Subversion的,而IE经常会不管你的帐户是如何建立的都会自动发送你的用户名。
结果就是你必须为每个用户在 AuthzSVNAccessFile 中至少创建两个条目:一个小写的条目和一个与 IE 传递给 Apache 一样的条目,你也需要训练你的用户在通过 TortoiseSVN 输入访问版本库的凭证时使用小写字母。
Apache 的错误和访问日志是你最好的朋友,例如帮助你检测传递给 Subversion 的 AuthzSVNAccessFile 模块的用户名,你或许需要试验 svnaccessfile 中用户字符串的精确格式(例如 DOMAIN\user 还是 DOMAIN//user)来使一切工作正常。
多重认证源

也可以为Subversion使用不止一个的认证源,为此,你需要将每一种认证设置为non-authoritative,这样Apache会在多个源检查用户名/密码。
一个常见的场景就是同时使用Windows域和passwd文件认证,这样你可以为没有Windows域帐户的用户提供访问SVN的权限。
• To enable both Windows domain and passwd file authentication, add the following entries within the <Location> block of your Apache config file:
• AuthBasicAuthoritative Off

• SSPIAuthoritative Off

Here is an example of the full Apache configuration for combined Windows domain and passwd file authentication:
<Location /svn>

DAV svn

SVNListParentPath on

SVNParentPath D:\SVN



AuthName "Subversion repositories"

AuthzSVNAccessFile svnaccessfile.txt



# NT Domain Logins.

AuthType SSPI

SSPIAuth On

SSPIAuthoritative Off

SSPIDomain <domaincontroller>

SSPIOfferBasic On



# Htpasswd Logins.

AuthType Basic

AuthBasicAuthoritative Off

AuthUserFile passwd



Require valid-user

</Location>


用 SSL 使服务器更安全

虽然 Apache 2.2.x 支持 OpenSSL,它默认却没有激活。你可以手动激活它。
55. 在 apache 配置文件中,取消这些行的注释:
56. #LoadModule ssl_module modules/mod_ssl.so
57.
和最后面的
#Include conf/extra/httpd-ssl.conf

接着将这一行(在配置文件中这是一行)
SSLMutex "file:C:/Program Files/Apache Software Foundation/\

Apache2.2/logs/ssl_mutex"

改为
SSLMutex default

58. Next you need to create an SSL certificate. To do that open a command prompt (DOS-Box) and change to the Apache folder (e.g. C:\program files\apache group\apache2) and type the following command:
59. bin\openssl req -config conf\openssl.cnf -new -out my-server.csr
60.
You will be asked for a passphrase. Please don't use simple words but whole sentences, e.g. a part of a poem. The longer the phrase the better. Also you have to enter the URL of your server. All other questions are optional but we recommend you fill those in too.
Normally the privkey.pem file is created automatically, but if it isn't you need to type this command to generate it:
bin\openssl genrsa -out conf\privkey.pem 2048

Next type the commands
bin\openssl rsa -in conf\privkey.pem -out conf\server.key

and (on one line)
bin\openssl req -new -key conf\server.key -out conf\server.csr \

-config conf\openssl.cnf

and then (on one line)
bin\openssl x509 -in conf\server.csr -out conf\server.crt

-req -signkey conf\server.key -days 4000

This will create a certificate which will expire in 4000 days. And finally enter (on one line):
bin\openssl x509 -in conf\server.cert -out conf\server.der.crt

-outform DER

These commands created some files in the Apache conf folder (server.der.crt, server.csr, server.key, .rnd, privkey.pem, server.cert).
61. 重启 apache 服务。
62. 将你的浏览器指向https://servername/svn/project ...

SSL 和 Internet Explorer
如果你使用SSL保护你的服务器,并使用windows域来进行认证,你会发现不能使用IE浏览版本库了,不需要担心-那只是因为IE没有经过认证,其他浏览器没有这个问题,TortoiseSVN和其他Subversion客户端仍然可以得到认证。
如果你一直希望使用IE浏览你的版本库,你可以选择:
• 在 Apache 的配置文件定义一个单独的 <Location /path> 指示,增加 SSPIBasicPreferred On。这将使 IE 能够认证,但是其他浏览器和 Subversion 不能对这个领域认证。
• 也提供未加密(没有SSL)认证的浏览,奇怪的IE在没有使用SSL的认证时没有任何问题。
• 在 SSL 的“标准”配置中,通常在 apache 的虚拟 SSL 主机内有下面的内容:
• SetEnvIf User-Agent ".*MSIE.*" \

• nokeepalive ssl-unclean-shutdown \

• downgrade-1.0 force-response-1.0

这种设置的充足理由参见 http://www.modssl.org/docs/2.8/ssl_faq.html#ToC49。但是如果你希望使用 NTLM 认证,就必须使用 keepalive。如果启用全部 SetEnvIf,你就可以使 IE 用 Windows 认证访问运行在 Win32 上加载了 mod_auth_sspi 模块的 Apache。

强制 SSL 访问
当你设置了 SSL 让你的版本库更安全,你一定希望关闭普通的非 SSL (http) 访问。为此,你需要在 Subversion 的 <Location> 增加指示: SSLRequireSSL。
An example <Location> block would look like this:
<Location /svn>

DAV svn

SVNParentPath D:\SVN

SSLRequireSSL

AuthType Basic

AuthName "Subversion repositories"

AuthUserFile passwd

#AuthzSVNAccessFile svnaccessfile

Require valid-user

</Location>


在虚拟 SSL 主机中使用客户端证书
由 Nigel Green 发送到 TortoiseSVN 邮件列表。非常感谢!
在某些情况下你需由要 1 台服务器掌管 2 个虚拟的 SSL 主机: 第 1 个用于公共 web 浏览,不需要客户端证书。第 2 个必需通过客户端证书来保证安全,运行 Subversion 服务器。
在 Apache 配置文件的 per-server 部分中添加 SSLVerifyClient Optional 指令(例如,在任何 VirtualHost 和 Directory 块之外)强制 Apache 在开始 SSL 连接握手时索取客户端证书。由于 mod_ssl 中的一个错误,在这个时候索取客户端证书是非常有必要的,因为当 SSL 连接重新协商时,它就不会生效了。
解决方案就是在 Subversion 虚拟主机的目录配置部分添加下面的指令:
SSLRequire %{SSL_CLIENT_VERIFY} eq "SUCCESS"

这个指令确认只有在收到客户端证书并成功验证后才能有权读取目录。
总之,Apache 配置文件中的相关内容就是这样的:
SSLVerifyClient Optional



### 公共访问虚拟主机

### (不需要客户端证书)



<VirtualHost 127.0.0.1:443>

<Directory "pathtopublicfileroot">

</Directory>

</VirtualHost>



### S
  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Linux上使用SVN,你可以按照以下步骤进行操作: 1. 安装SVN服务端:根据的引用内容,你可以按照TortoiseSVN服务端的安装教程来安装SVN服务端。 2. 将文件checkout到本地目录:使用以下命令将文件从版本库中checkout到本地目录: ``` svn checkout svn_path local_path ``` 例如,你可以使用以下命令来checkout一个版本库中的文件: ``` svn checkout svn://192.168.1.131/45dian/brand ``` 如果你想要将文件checkout到当前目录下的一个子目录中,你可以使用以下命令: ``` svn checkout svn://192.168.1.131/45dian/brand ./brand/ ``` 这里的"./brand/"是你想要将文件checkout到的本地目录。 此外,你还可以使用`svn co`作为`svn checkout`的简写。 3. 往版本库添加新的文件:使用以下命令将新的文件添加到版本库中: ``` svn add file ``` 例如,要添加一个名为"test.php"的文件,你可以使用以下命令: ``` svn add test.php ``` 如果你想要添加当前目录下的所有php文件,可以使用以下命令: ``` svn add *.php ``` 如果你想要添加一个名为"user"的目录及其下的所有内容(递归添加),可以使用以下命令: ``` svn add user ``` 4. 将改动的文件提交到版本库:使用以下命令将改动的文件提交到版本库中: ``` svn commit -m '注释内容' [-N [--no-unlock PATH ``` 例如,你可以使用以下命令来提交一个名为"test.php"的文件: ``` svn commit -m '添加新文件' test.php ``` 如果你想要提交一个名为"user"的目录及其下的所有内容(递归提交),可以使用以下命令: ``` svn commit -m '添加新目录(递归)' user ``` 此外,你还可以使用`svn ci`作为`svn commit`的简写。 5. 加锁/解锁:使用以下命令对文件进行加锁或解锁操作: - 加锁: ``` svn lock -m '加锁注释内容' [--force PATH ``` 例如,你可以使用以下命令来对一个名为"test.php"的文件进行加锁: ``` svn lock -m "锁定文件" test.php ``` - 解锁: ``` svn unlock PATH ``` 例如,如果你想要解锁一个文件,可以使用以下命令: ``` svn unlock test.php ``` 6. 更新版本:根据的引用内容,你可以使用以下命令更新版本: ``` svn update ``` 总结起来,在Linux上使用SVN的基本操作包括安装SVN服务端、将文件checkout到本地目录、添加新文件到版本库、提交改动的文件到版本库、加锁/解锁文件以及更新版本。以上是一些基本的使用方法,如果你需要更详细的SVN使用说明,你可以参考和的引用内容。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值