有哪些好的网站建设公司国外网站网页设计

当前位置: 首页 > news >正文

有哪些好的网站建设公司,国外网站网页设计,沈阳微信网站制作,江西省建设局网站说明 SVN常用于程序代码版本控制,由于业务需求需将生产资料通过SVN进行管控,涉及人员众多,权限分支管理需要细化,特此记录SVN的学习操作. 前言 版本控制是管理信息修改的艺术#xff0c;它一直是程序员最重要的工具#xff0c;程序员经常会花时间作出小的修改#xff0c; 然… 说明 SVN常用于程序代码版本控制,由于业务需求需将生产资料通过SVN进行管控,涉及人员众多,权限分支管理需要细化,特此记录SVN的学习操作. 前言 版本控制是管理信息修改的艺术它一直是程序员最重要的工具程序员经常会花时间作出小的修改 然后又在某一天取消了这些修改想象一下一个开发者并行工作的团队或许是同时工作在同一个文 件你就会明白为什么一个好的系统需要管理潜在的混乱。 1.什么是SVN TortoiseSVN 是一个 Windows 下的版本控制系统 Apache™ Subversion® 的客户端工具。就是 说TortoiseSVN 常年管理文件和目录。文件存储于一个中央版本库中。版本库就像一个常见的文件服 务器除了它保存你对文件和目录所有的改变。这一特性使得你可以恢复文件的旧版本并查看历史-谁 在什么时间如何进行的修改。这就是为什么很多人认为 Subversion 和版本控制系统是一种“时间机 器”。 某些版本控制系统也是软件配置管理(SCM)系统这种系统经过精巧的设计专门用来管理源代码树 并且具备许多与软件开发有关的特性 比如对编程语言的支持或者提供程序构建工具。不过 Subversion 并不是这样的系统它是一个通用系统可以管理任何类型的文件集包括源代码。 2.SVN的特性 外壳集成 TortoiseSVN 无缝地整合进 Windows 的外壳(例如资源管理器)。这意味着你可以继续使用已经熟悉 的工具。而且当需要版本控制功能时你不用切换到不同的应用程序。 而且你并没有被限制在 Windows 资源管理器中; TortoiseSVN 的右键菜单可以在很多其它文件管理器中以及标准 Windows 程序的 文件/打开 对话框中被调出。 不过你应该记住 TortoiseSVN 是专门作为 Windows 资源管理器的扩展进行开发的。因此有可能在其它程序中整合的不那么完整例如重载图标可能不显示 重载图标 每个版本控制的文件和目录的状态使用小的重载图标表示可以让你立刻看出工作副本的状态。 图形用户界面 当你列出文件或文件夹的更改时你可以点击任意版本查看提交注释。也可以看到更改过的文件列表 – 只要双击文件就可以查看更改内容。 提交对话框列出了本次提交将要包括的条目每一个条目有一个复选框所以你可以选择包括哪些条目。未版本控制的文件也会被列出以防你忘记添加新文件。 Subversion 命令的简便访问 所有的 Subversion 命令存在于资源管理器的右键菜单,TortoiseSVN 在那里添加子菜单。 目录版本控制 CVS 只能追踪单个文件的历史但是 Subversion 实现了一个“虚拟”文件系统可以追踪整个目录树的修改文件和目录都是版本控制的结果就是可以在客户端对文件和目录执行移动和复制命令。 原子提交 提交要么完全进入版本库要么一点都没有这允许开发者以一个逻辑块提交修改。 版本控制的元数据 每个文件和目录都有一组附加的“属性”你可以发明和保存任意的键/值对属性是版本控制的就像文件内容。 可选的网络层 Subversion 在版本库访问方面有一个抽象概念利于人们去实现新的网络机制Subversion的“高级”服务器是 Apache 网络服务器的一个模块使用 HTTP 的变种协议 WebDAV/DeltaV 通讯这给了 Subversion 在稳定性和交互性方面很大的好处可以直接使用服务器的特性例如认证、授权、传输压缩和版本库浏览等等。也有一个轻型的单独运行的 Subversion 服务器这个服务器使用自己的协议可以轻松的用 SSH 封装。 一致的数据处理 Subversion 使用二进制文件差异算法表达文件的差异对文本文件人类可读和二进制文件人类不可读进行相同的处理方式两种类型的文件都压缩存放在版本库中之后差异结果在网络上双向传递。 高效的分支和标签 分支与标签的成本不需要与工程的大小成比例增长Subversion 建立分支与标签时只是单纯的使用一种类似于硬链接的机制复制项目。因而这类操作通常只会花费很少并且相对固定的时间以及 占用很小的版本库空间。
3.许可协议 TortoiseSVN 是一个基于 GNU 通用公共许可协议 (GPL) 开发的开源软件。它可以免费下载和使用无论是个人或是商业目的并且没有安装数量的限制。 4.SVN发展 4.1 SVN历史 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 的标志。现在他负责照看网站和管理多语言翻译。 随着时间推移其他的版本控制系统都有着自己的 Tortoise 客户端这导致了在资源管理器中图标重载的问题这些图标重载有着数量的限制仅一个 Tortoise 客户端也能轻易超过那个限制。因而 Stefan Küng 使用了 Tortoise 图标重载组件使得所有 Tortoise 客户端可以使用相同的图标重载。现在所有的开源 Tortoise 客户端甚至一些非 Tortoise 客户端也能使用分享的组件。 4.2 致谢 Tim Kemp 启动 TortoiseSVN 项目Stefan Küng 辛苦工作使 TortoiseSVN 达到现在的样子并领导整个项目。Lübbe Onken 制作了漂亮的图标标志跟踪错误翻译并且维护翻译结果Simon Large 维护文档Stefan Fuhrmann 日志缓存和版本图Subversion 手册 为了对 Subversion 大量介绍我们复制了其第二章Tigris 样式项目 我们在本文重用了一些样式我们的贡献者 提供了补丁、错误汇报及新的想法并且在邮件列表上回答了其他人的问题我们的捐赠者 他们发送给我们的那些音乐带来了快乐 5.阅读指南 本手册是为那些想使用 Subversion 来管理数据并且喜欢使用图形界面客户端程序替代命令行程序的电脑用户编写的。TortoiseSVN 是 Windows 外壳扩展并且假设用户熟悉和使用 Windows 资源管理器。 在 前言 一章里解释了什么是 TortoiseSVN一些关于TortoiseSVN 项目和开发人员社区的消息以及使用和分发它的许可条件。在 第 1 章 开始 一章里解释了如何在电脑中安装 TortoiseSVN以及如何立刻开始使用。在第 2 章 基本版本控制概念一章里简短地介绍了 Subversion 版本控制系统Subversion 是 TortoiseSVN 的基础。这一章借用了 Subversion 项目的文档介绍了各种版本控制模式以及Subversion 的工作原理。第 3 章 版本库 这一章介绍了如何设置一个本地版本库这对于在一台单独的个人计算机上测试 Subversion 和 TortoiseSVN 来说是相当有用的。这一章节也介绍了一些版本库管理的内容这与管理服务器上的版本库是有一定联系的。第 4 章 日常使用指南是最重要的章节介绍了 TortoiseSVN 最主要特性的使用。它以教程的形式从检出一个工作副本开始然后修改提交你的修改之后进入高级主题。第 5 章 项目监视器解释了如何监视您的Subversion项目这样您就不会错过其他团队成员的重要提交。第 6 章 SubWCRev 程序 是 TortoiseSVN 的一个独立程序可以从工作副本抽取信息并记录到一个文件可以用来在项目中包含构建信息。附录 B, 如何实现 …这一节回答了一些操作方面的常见问题。这些常见问题在其他章节没有被明确的提到过。附录 D, TortoiseSVN 操作 这一节展示了如何使用命令行调用TortoiseSVN 的 GUI 对话框当你在使用脚本时仍希望用户交互时非常有用。附录 E, 命令行交叉索引给出了 TortoiseSVN 命令与其对应的 Subversion 命令行工具 svn.exe 命令之间的关系。 术语 为了使文档更加易读所有 TortoiseSVN 的窗口名和菜单名使用不同的字体例如日志对话框。 菜单选择使用箭头显示。TortoiseSVN → 显示日志的含义是: 从 TortoiseSVN 右键菜单选择显示日志。 在 TortoiseSVN 对话框中出现的右键菜单可能是这个样子: 右键菜单 → 另存为 … 用户界面按钮的显示形式: 点击OK以继续。 用户动作使用粗体字表示。AltA: 表示按住键盘上的 Alt 键同时按下 A 键。右键拖拽: 表示按住鼠标右键同时拖拽条目到新位置。 系统输出和键盘输入也使用不同的字体显示。 使用图标标记的重要提示。 技巧让你的生活更加简单。 操作时需要小心的地方。 需要非常小心操作的地方。如果忽略警告内容将会导致数据损坏或其它严重后果。 一、开始 这一节面向那些想要了解 TortoiseSVN 的用途并且想试用一下它的人。介绍了如何安装 TortoiseSVN及设置本地版本库还将展示最常用的操作。 1.1 安装 TortoiseSVN 1.1.1 系统要求 TortoiseSVN 能够运行在 Windows Vista 或更高版本并且提供32位与64位系统的支持。适用与64位Windows 系统的安装程序同时包含32位的拓展部件。这意味着您无需单独安装32位版本的 TortoiseSVN就可以在32位的应用程序中使用右键菜单和图标重载。 自 1.2.0 版起放弃对 Windows 98 Windows ME 和 Windows NT 4 的支持。自 1.7.0 版起放弃对Windows 2000 和 XP SP2 的支持。自 1.9.0 版起放弃对Windows XP SP3的支持。如果需要仍然可 以下载、安装旧版本。
1.1.2 安装 TortoiseSVN 以简单易用的安装包的形式发布。双击安装文件并按照提示操作。安装文件会照顾其余的 事情。安装结束后不要忘记重启电脑。 你需要管理员权限来安装 TortoiseSVN。必要的话安装程序会向您要求管理员证书。 TortoiseSVN 提供语言补丁(Language pack)它可以将用户界面翻译成多种文字。请查看 附录 G, 语言包和拼写检查器 获得更多关于安装语言补丁的信息。 如果在安装TortoiseSVN期间或之后遇到任何问题请参阅在线常见问题解答 SVN技术支持 1.2 基本概念 在我们开始实地操作之前非常有必要对 Subversion 是如何工作的以及用到的术语做一个大致了解。 版本库 Subversion 使用集中的数据库它包含了所有的版本控制文件及其完整历史。这个数据库就是版本库。版本库通常位于运行 Subversion 服务器的文件服务器上向 Subversion 客户端(例如 TortoiseSVN)提供需要的数据。如果只备份一个东西请备份版本库因为它是你数据的主副本。工作副本 这是实际工作的地方。每一个开发者在自己的电脑上都有属于自己的工作副本有时可以将其理解为沙箱。你可以将最新的版本从版本库上取下来在本地的副本上工作而不影响其他人如果对更改满意就可以将其提交到版本库中。 Subversion 工作副本不包含项目的历史 但是它保存了你修改前的本件的副本就像这些文件在版本库中的状态一样。这意味着你可以轻而易举的准确检查出都做了哪些改动。 你还要知道从哪里开始运行 TortoiseSVN因为在开始菜单中看不到。这是因为 TortoiseSVN 是一个外壳扩展 所以第一步打开 Windows 资源管理器。在资源管理器中用右键单击一个文件夹然后就会发现在右键菜单中出现一些新的条目就像这样: 图 1.1. 未版本控制文件夹的 TortoiseSVN 菜单 1.3 开始试用 这一节通过一个小的实验版本库向你展示如何开始一些最普通的用途。实际上这里没有介绍全部功能 -这只是一个快速开始向导而已。 一旦你开始使用你应该花点时间读一下本手册的其它部分在那里将会详细地介绍本软件的方方面面。也会介绍更多关于设置一个全功能 Subversion 服务器的内容。 1.3.1 创建版本库 对于一个实际的项目需要在一个安全的地方创建版本库并设置 Subversion 服务器来控制它。而对于本教程而言我们将会使用 Subversion 的本机版本库功能该特性使得用户可以直接访问本机硬盘上的版本库而不需要服务器。 首先在您的个人计算机上建立一个新的空目录。这个目录可以建立在任何位置不过在这一教程中我们将建立 C:\svn_repos 。现在你可以右键点击这个新文件夹从右键菜单中选择TortoiseSVN → 在这里创建版本库… 。 这样做之后一个可以供您所用的版本库就在这个文件夹中创建好了。我们还可以通过点击 创建目录结构 来创建标准目录结构。 对于测试和评估用途来说本机版本库功能非常有用但除非你是一个只使用自己电脑进行独自工作的开发者否则你应该使用全功能的 Subversion 服务器。有些小公司为了避免设置服务器的工作就通过网络共享来存取版本库。不要这样做。这样会丢失数据。阅读第 3.1.4 节 “访问网络共享磁盘上的版本库” 了解为什么这是一个坏主意以及如何设置服务器。 1.3.2 导入项目 我们有一个版本库但它现在完全是空的。假设我想要添加一些文件到C:\Projects\Widget1在文件资源管理器中导航到Widget1并单击右键选择 TortoiseSVN → 导入…弹出导入对话框 图 1.2. 导入对话框 输入版本库URL可以是互联网上任何特定的版本库。既然这样我们也可以指向本地版本库如file:///c:/svn_repos/trunk,并添加项目名称Widget1。请注意file: 协议后面始终有三个斜杠。 这个对话框中另一个重要的功能就是导入信息文本框你可以输入一段信息来描述你的操作。当你查看项目的历史时这些提交信息是记录了你修改什么和为什么修改的宝贵资料。在这个例子中我们可以简单的写一下例如“导入 Widget1 项目”。点击确定文件夹就加入到版本库中了。 1.3.3 检出工作副本 现在你创建好了你的版本库这时还需要创建一个工作副本用于你平时编写代码。注意当你把一个文件夹导入到版本库这个过程并不能使刚才的文件夹变成一个工作副本。 在默认设置时检出菜单项不在TortoiseSVN 子目录而在资源管理器根目录。不在子目录中的 TortoiseSVN 命令有SVN前缀SVN 检出… 你会注意到这个文件夹看起来与我们原来的文件夹不一样。每一个文件的左下角都有一个绿色的对钩。它们就是只出现在工作副本中的 TortoiseSVN 状态图标。绿色的图标表示文件未被修改和版本库中的文件版本一致。 1.3.4 进行修改 在 Widget1-Dev 文件夹中我们开始编辑文件 - 假设我们对 Widget1.c 和 ReadMe.txt 做出了一些修改。注意这些文件的图标上的小图标变成了红色这说明本地文件已经被修改了。 但是我们做了哪些更改右键单击任意一个修改过的文件然后选择 TortoiseSVN → 比较差异。启动TortoiseSVN 的文件比较工具准确地显示哪些行被修改了。 图 1.3. 文件差异查看器 OK,我们对这些更改很满意让我们更新版本库。这个动作叫 提交 更改。右键单击文件夹 Widget1-Dev 然后选择 TortoiseSVN → 提交。提交对话框列出了修改过的文件每一个都有一个复选框。你可以选中列表中的部分文件但在这个例子中我们将要提交全部修改过文件。输入一段信息来描述做了什么修改然后单击 确定。进度对话框显示被上传到版本库中的文件并且完成提交。 1.3.5 添加更多的文件 随着项目的发展需要添加新文件 - 例如说你要添加新功能有了新文件 Extras.c 还要在现有的文件 Makefile 中加入起对该文件的引用。 右键单击文件夹然后选择 TortoiseSVN → 增 加。 加入对话框显示了所有未被版本控制的文件你可以选择哪些文件要被添加。另一个增加文件的方法是右键单击文件自身然后选择 TortoiseSVN → 加入。 现在当你提交文件夹时新文件会显示为增加原有的文件显示为修改。注意你可以双击修改的文件查看做了哪些改动。 1.3.6 查看项目历史 日志对话框是TortoiseSVN 最有用的功能之一。它把你所有的文件/文件夹提交记录显示为一个列表并且显示你输入的详细提交信息你按照建议输入提交信息了吗如果没有现在知道多重要了吧。 图 1.4. 日志对话框 好吧我在这儿偷个懒用一张TortoiseSVN 版本库的截图。 对话框的上部显示提交的版本列表以及提交信息的开头。如果选中版本列表中的任意一个对话框的中部显示该版本完整的日志消息对话框的底部显示更改的文件和文件夹列表。 对话框的每一部分都有右键菜单提供很多使用这些信息的方法。在底部可以 双击 文件来完整的查看该版本所做的修改。参阅 第 4.10 节 “版本日志对话框” 获得完整的内容。 1.3.7 撤销更改 所有的版本控制系统都有的功能就是让你可以撤销之前做的更改。如你预料的一样TortoiseSVN 非常容易做到这一点。 如果你想抛弃还没有提交的更改并将文件复原到修改之前的状态TortoiseSVN → SVN 还原 就是你的好伙伴。它抛弃了所做的更改(扔到回收站里)并复原到修改之前的版本。如果你想抛弃更改的一部分可以使用 TortoiseMerge 来查看区别并有选择的复原被修改的文件行。 如果你要撤销某一个特定版本的影响启动日志对话框找到不想要的版本。选择 右键菜单 → 复原此版本作出的修改 然后这些更改就会被撤销。 1.4 继续前进… 这个向导提供一个非常短小的例子来展示 TortoiseSVN 的最重要和最有用的功能当然这里很有很多内容没有被覆盖。我们强烈推荐你花点时间阅读这本手册剩余的部分尤其是 第 4 章 日常使用指南这一章展示了很多日常工作的详细内容。 我们已经不辞劳苦的确保本手册有丰富的信息并容易阅读但我们也承认在使用过程中还有很多的困难! 花点时间独自用测试版本库练练手。最好的方法就是在实践中学习。 二、基本版本控制概念 本章修改自《使用 Subversion 进行版本管理》的相同章节它的在线版本位于: 开源版本控制的标准。 这一章是对 Subversion 一个简短随意的介绍如果你对版本控制很陌生这一章节完全是为你准备的我们从讨论基本概念开始深入理解 Subversion 的思想然后展示许多简单的实例。 尽管我们的例子展示了人们如何分享程序源代码仍然要记住 Subversion 可以控制所有类型的文件它并没有限制只为程序员工作。 2.1 版本库 Subversion 是一种集中的分享信息的系统它的核心是版本库储存所有的数据版本库按照文件树形式储存数据包括文件和目录任意数量的客户端可以连接到版本库读写这些文件。通过写数据别人可以看到这些信息通过读数据可以看到别人的修改。 图 2.1. 一个典型的客户/服务器系统 所以为什么这很有趣呢讲了这么多让人感觉这是一种普通的文件服务器但实际上版本库是另一种文件服务器而不是你常见的那一种。最特别的是 Subversion 会记录每一次的更改不仅针对文件也包括目录本身包括增加、删除和重新组织文件和目录。 通常情况下客户端只会从版本库中读取最新版本的文件树但客户端还拥有读取前一版本文件树的功能。例如客户端可以发起这样的请求“版本库在周三时包含哪些内容”或者“针对某个文件最后更改者是谁具体的改动为何”这几类问题就是每个版本控制系统最需关注的核心问题系统需要实时记录与追踪数据变动。 2.2 版本模型 所有的版本控制系统都需要解决这样一个基础问题: 怎样让系统允许用户共享信息而不会让他们因意外而互相干扰版本库里意外覆盖别人的更改非常的容易。 2.2.1 文件共享的问题 考虑这个情景我们有两个共同工作者Harry 和 Sally他们想同时编辑版本库里的同一个文件如果首先 Harry 保存它的修改过了一会Sally 可能凑巧用自己的版本覆盖了这些文件Harry 的更改不会永远消失(因为系统记录了每次修改)Harry 所有的修改不会出现在 Sally 的文件中所以 Harry的工作还是丢失了,至少是从最新的版本中丢失了,而且是意外的这就是我们要明确避免的情况 图 2.2. 需要避免的问题 2.2.2 锁定-修改-解锁 方案 许多版本控系统使用 锁定-修改-解锁 模型来解决这个问题这是一个简单的解决方案。在这种系统中在同一时间版本库只允许一个用户修改一个文件。首先Harry 必须在修改前 锁定 该文件。锁定文件有点像从图书馆借书如果 Harry 锁定了一个文件那么 Sally 就无法修改该文件。如果她试图锁定该文件版本库会拒绝这个请求。她只能读取这个文件并等待 Harry 结束修改并释放文件锁。在 Harry 解锁文件后他的“回合”就结束了现在 Sally 可以接手工作 - 锁定并编辑文件。 图 2.3. 锁定-修改-解锁 方案 锁定-修改-解锁模型有一点问题就是限制太多经常会成为用户的障碍: 锁定可能导致管理问题。有时候 Harry 会锁住文件然后忘了此事这就是说 Sally 一直等待解锁来编辑这些文件她在这里僵住了。然后 Harry 去旅行了现在 Sally 只好去找管理员放开锁这种情况会导致不必要的耽搁和时间浪费。 锁定可能导致不必要的线性化开发。如果 Harry 编辑一个文件的开始Sally 想编辑同一个文件的结尾这种修改不会冲突设想修改可以正确的合并到一起他们可以轻松的并行工作而没有太多的坏 处没有必要让他们轮流工作。 锁定可能导致错误的安全状态。假设 Harry 锁定和编辑一个文件 A同时 Sally 锁定并编辑文件 B如果 A 和 B 互相依赖这种变化是必须同时作的这样 A 和 B 不能正确的工作了锁定机制对防 止此类问题将无能为力从而产生了一种处于安全状态的假相。很容易想象 Harry 和 Sally 都以为自己锁住了文件而且从一个安全孤立的情况开始工作因而没有尽早发现他们不匹配的修改。
2.2.3 复制-修改-合并 方案 Subversion、CVS和其他的一些版本控制系统使用 复制-修改-解锁 模型作为变相的锁定方式。在这种模型下每个用户的客户端会读取版本库内容而后针对文件或者项目创建独属于单个用户的工作副本。用户接下来会平行地工作修改他们的独属副本。最后这些独属副本会上传并合并为全新的、最终的版本。版本控制系统会协助处理这项合并工作但最终版的正确成型仍需人类责。 这儿有一个例子。比如说 Harry 和 Sally 参加同一个项目每人都有各自的工作副本从同一个版本库复制出来的。他们同时工作在自己的副本中修改同一个文件 A。Sally 先将她的更改保存到版本库 中。 稍后当 Harry 尝试提交他的更改时版本库提示他的文件 A 已经过时。换句话说自从他上次复制文件后无论如何版本库中的文件 A 已经被修改了。所以 Harry 要用客户端程序将版本库中文 件 A 的新更改 合并 到他的工作副本中。碰巧的是 Sally 的更改和他的不重合; 所以一旦他整合了两人的更改他就可以把他的工作副本复制回版本库。 图 2.4. 复制-修改-合并 方案 图 2.5. 复制-修改-合并 方案(续) 但是如果 Sally 和 Harry 的修改重叠了该怎么办这种情况叫做冲突这通常不是个大问题当Harry 告诉他的客户端去合并版本库的最新修改到自己的工作副本时他的文件 A 就会处于冲突状 态: 他可以看到一对冲突的修改集并手工的选择保留一组修改。需要注意的是软件不能自动的解决冲突只有人可以理解并作出智能的选择一旦 Harry 手工的解决了冲突(也许需要与 Sally 讨论)他就可以安全的把合并的文件保存到版本库。 复制-修改-合并模型感觉是有一点混乱但在实践中通常运行的很平稳用户可以并行的工作不必等待别人当工作在同一个文件上时也很少会有重叠发生冲突并不频繁处理冲突的时间远比等待解锁花费的时间少。 最后一切都要归结到一条重要的因素: 用户交流。 当用户交流贫乏语法和语义的冲突就会增加没有系统可以强制用户完美的交流没有系统可以检测语义上的冲突所以没有任何证据能够承诺锁定系统可以防止冲突实践中锁定除了约束了生产力并没有做什么事。 有一种情况下锁定-修改-解锁模型会更好也就是你有不可合并的文件例如你的版本库包含了图片两个人同时编辑这个文件没有办法将这两个修改合并Harry 或 Sally 会丢失他们的修改。 2.2.4 Subversion 怎么做 Subversion 缺省使用复制-修改-合并模型大多数情况下可以满足你的需求。然而Subversion 1.2后还是支持锁定如果你有不可合并的文件或者你只是想实行强制管理策略Subversion 仍然会提供你需要的特性。 2.3 Subversion 实战 2.3.1 工作副本 你已经阅读过了关于工作副本的内容现在我们要讲一讲客户端怎样建立和使用它。 一个 Subversion 工作副本是你本地机器一个普通的目录保存着一些文件你可以任意的编辑文件而且如果是源代码文件你可以像平常一样编译你的工作副本是你的私有工作区在你明确的做了特定操作之前Subversion 不会把你的修改与其他人的合并也不会把你的修改展示给别人。 当对工作副本中的文件做了一些更改并确认他们能够正常工作后Subversion 提供将这些更改公布给同项目的其他人员的命令(通过写入版本库)。如果其他人公布他们的更改Subversion 提供将这些更 改合并到工作副本的命令(通过读取本版本库)。 Subversion还会在工作副本中创建并管理一些额外的文件这些文件将用于协助执行命令。特别地你的工作副本中会包含一个名为.svn的子目录即该工作副本的管理目录。管理目录中的文件帮助Subversion识别哪些文件包含未发布的更改哪些文件由于他人的更改已过期。早于1.7版本的Subversion会在工作副本中每一级目录下包含名为.svn的管理子目录。1.7版本开始 Subversion 启 用了全新的策略每个工作副本只有一个管理子目录该目录是工作副本根目录的直接子级。 一个典型的 Subversion 的版本库经常包含许多项目的文件(或者说源代码)通常每一个项目都是版本库的子目录在这种安排下一个用户的工作副本往往对应版本库的的一个子目录。 举一个例子你的版本库包含两个软件项目。 图 2.6. 版本库的文件系统 换句话说版本库的根目录包含两个子目录: paint 和 calc。要获得工作副本必须通过 检出 版本库中的某个子树。(术语 检出 听起来好像会锁定和保留资源但实际上不是这样; 它只是给项目创建了一个私有的副本。) 假设你对button.c做出了修改。由于.svn目录记录了文件的修改日期和原始内容Subversion得以告知使用者已经更改了这个文件。然而 Subversion 并不会将你的更改展示给全部用户除非你明确指出要这么做。推送你做出的更改这一举动通常被称作提交修改或者检入修改到版本库。 发布你的修改给别人可以使用 Subversion 的提交命令。 这时你对 button.c 的修改已经提交到了版本库如果其他人取出了 /calc 的一个工作副本他们会看到这个文件最新的版本。 假设你有个合作者Sally她和你同时取出了 /calc 的一个工作副本你提交了你对 button.c 的修改Sally 的工作副本并没有改变Subversion 只在用户要求的时候才改变工作副本。 要使项目最新Sally 可以要求 Subversion 更新她的工作副本通过使用更新命令可以将你和所有其他人在她上次更新之后的修改合并到她的工作副本。 注意Sally 不必指定要更新的文件Subversion 利用 .svn 以及版本库的进一步信息决定哪些文件需要更新。 2.3.2 版本库的 URL Subversion 可以通过多种方式访问本地磁盘访问或各种各样不同的网络协议但一个版本库地址永远都是一个 URLURL 方案反映了访问方法。 表 2.1. 版本库访问 URL 对于大多数情况Subversion 的 URL 使用标准格式允许服务器名称和端口作为 URL 的一部分明确的指出来。 files:// 访问方式一般用于本地访问尽管它可以使用 UNC 路径来引用网络主机。因此 URL使用这种格式file://hostname/path/to/repos。对于本机而言URL 中的 hostname 部分必须省略或者使用 localhost。就是因为这个原因本机路径通常含有 3 个斜线file:///path/to/repos。 同样在 Windows 平台上使用 file:// 方案的用户需要使用一种非官方的 “标准” 协议格式来访问那些位于本机其他分区即与客户端当前所处分区不同的版本库。如下两种格式的 URL 路径是有效的其中X代表版本库目录所在分区的盘符 file:///X:/path/to/repos …file:///X|/path/to/repos … 注意 URL 使用普通的斜杠而不是 Windows 本地(非 URL)形式的路径。 你可以通过网络共享访问一个FSFS版本库但由于很多原因不建议你这样做。 你会授予所有用户写权限这样他们就有可能会意外删除或破坏版本库文件系统。不是所有的网络文件共享协议都支持 Subversion 需要的文件锁定所以你会发现你的版本库被毁了。有一天你会发现你的版本库微妙地崩溃你必须设置正确的访问许可。SAMBA在这方面尤其困难如果有人安装新版客户端升级了版本库格式那么其他人将无法访问该版本库直到他们也升级到新版客户端。 2.3.3 修改版本 svn commit 操作可以作为一个原子事务操作发布任意数量文件和目录的修改。在你的工作副本中你可以改变文件内容创建、删除、改名和复制文件和目录然后作为一个整体提交。 在版本库中每次提交被当作一次原子事务操作: 要么所有的改变发生要么都不发生Subversion努力保持原子性以应对程序错误、系统错误、网络问题和其他用户行为。 每当版本库接受了一个提交文件系统进入了一个新的状态叫做版本每个版本被赋予一个独一无二的自然数一个比一个大初始修订号是 0只创建了一个空目录没有任何内容。 可以形象的把版本库看作一系列树想象有一组版本号从 0 开始从左到右每一个修订号有一个目录树挂在它下面每一个树好像是一次提交后的版本库“快照”。 图 2.7. 版本库 全局版本号 不同于其它版本控制系统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 来表明它是最新的所以你在工作副本顶级目录作一次干净的更新会使所有内容对应版本库的同一修订版本。 2.3.4 工作副本怎样跟踪版本库 对于工作副本的每一个文件Subversion 在管理目录 .svn/记录两项关键的信息: 你的工作文件所基于的版本也被称为文件的工作版本并且一个本地副本最后更新的时间戳。 给定这些信息通过与版本库通讯Subversion 可以告诉我们工作文件是处于如下四种状态的哪一种: 未修改且是当前的 文件在工作目录里没有修改在工作版本之后没有修改提交到版本库。svn commit 操作不做任何事情svn update 不做任何事情。本地已修改且是当前的 工作副本已经修改从基准版本之后没有修改提交到版本库。本地修改没有提交因此 commit 会成功的提交,update 不做任何事情。本地未修改且过时 这个文件在工作副本没有修改但在版本库中已经修改了。这个文件应当更新到最新公共版本。commit 不做任何事情update 将会更新工作副本到最新的版本。本地已修改且过时 这个文件在工作副本和版本库中都被修改了。提交 该文件将会因为 过时 而失败。该文件应该先更 新; 更新 命令将会尝试合并公共更改和本机更改。如果 Subversion 不能顺利的自动完成合并则需要用户解决冲突。 三、版本库 无论你用什么协议访问你的版本库都至少需要创建一个版本库这可以使用Subversion命令行客户端 或TortoiseSVN完成。 如果你还没有创建Subversion版本库是时间开始了。 3.1 创建版本库 3.1.1 使用命令行工具创建版本库 创建一个名为SVN(例如D:\SVN)的空文件夹作为你的所有版本库的根。在D:\SVN\里创建另一个目录MyNewRepository。打开命令提示符(或DOS窗口)跳转到D:\SVN\目录输入 svnadmin create –fs-type bdb MyNewRepository 现在你在D:\SVN\MyNewRepository创建了一个新的版本库。 3.1.2 使用TortoiseSVN 创建版本库 图 3.1. 未版本控制文件夹的 TortoiseSVN 菜单 打开资源管理器创建一个新的文件夹命名为SVNRepository右键单击 新建的文件夹并选择 TortoiseSVN → 在此创建版本库…。 然后就会在新文件夹创建一个版本库不要手工编辑这些文件如果你得到什么警告一定要先确定目录非空并且没有写保护。 你会被询问是否要在版本库中创建目录结构。要获得关于目录结构的选项情参阅 第 3.1.5 节 “版本库布局”。 TortoiseSVN 将会在创建版本库时为其设置一个特定的文件夹图标便于辨别本地版本库。如果使用官方的命令行客户端创建版本库则不会设置文件夹图标。 除非是基于本地测试的目的我们推荐你完全不要使用 field:// 访问。对于除独立开发者以外的人而言使用服务器更安全更可靠。 3.1.3 本地访问版本库 为了访问本地版本库你需要这个文件夹的路径只要记住Subversion期望所有的版本库路径使用的形式为file:///C:/SVNRepository/请注意全部使用的是斜杠。 为了访问网络共享中的版本库你可以使用驱动器影射或使用UNC路径对于UNC路径形式为file://ServerName/path/to/repos/请注意这里前面只有两个斜杠。 在SVN 1.2之前UNC路径曾经是一种非常晦涩的格式file:///\ServerName/path/to/repos这种格式依然支持但不推荐。 3.1.4 访问网络共享磁盘上的版本库 尽管从理论上说将一个 FSFS 格式的版本库放在网络中共享并且多用户通过 file:// 协议访问是可行的。但是我们不推荐这样做。事实上我们强烈反对这样做并且不支持这样的用法基于不同得原因 首先这样赋予所有用户对版本库的写权限所以任何一个用户都可能意外的删除整个版本库或者因为别的问题导致版本库不可用。其次不是所有的网络文件共享协议都支持 Subversion 需要的文件锁定所以你会发现你的版本库被毁了。它也许不会马上发生但是总有一天会有 2 个用户同时访问版本库。第三文件的权限必需设置得井井有条。也许 Windows 的共享可以避开这个问题但是在 SAMBA 中却是相当困难的。如果有人安装新版客户端升级了版本库格式那么其他人将无法访问该版本库直到他们也升级到新版客户端。 file:// 访问是为本机工作而准备的只能单用户访问特别是测试和调试。当你打算共享版本库的时候你真的需要设置一个适当的服务器而且它并不像你想象的那样困难。阅读第 3.5 节 “访问版本库”获得选择指南并配置服务器。 3.1.5 版本库布局 在将你的数据导入到版本库之前首先你得考虑如何组织你的数据。如果你使用一种推荐的布局你在后面的操作将会更容易许多。 有一些标准的推荐使用的组织版本库结构的方法。大多数人创建一个 trunk 目录掌管开发的 “主干”一个 branches 目录存放分支副本以及一个 tags 目录存放标记副本。如果一个版本库只掌管一个项目那么人们通常创建这些顶级录 /trunk /branches /tags 因为这个布局非常通用所以当使用 TortoiseSVN 创建版本库时它会提出帮你创建这个目录结构。 如果一个版本库包含多个项目人们通常按分支来安排布局: /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 次提交)就像这样 在你的硬盘上创建一个空的文件夹在那个文件夹下创建你想要的顶级目录千万不要放任何文件进去将这个结构导入版本库中只需 右键单击 包含这个结构的文件夹并选择 TortoiseSVN → 导入…。 在导入对话框中输入版本库的 URL 并单击确定。这样就会将临时文件夹导入版本库中创建基本布局。 请注意你导入的文件夹名不会显示在版本库中只有文件夹的内容。例如创建如下文件夹结构: C:\Temp\New\trunk C:\Temp\New\branches C:\Temp\New\tags 导入C:\Temp\New的版本库根目录之后应该像这样 /trunk /branches /tags 3.2 版本库备份 无论你使用何种版本库定期维护和验证版本库备份非常重要或许你可以访问最近版本的文件但是如果没有版本库所有的历史将会丢失。 最简单(但不推荐)的方法是复制整个版本库文件夹到备份介质然而你必须确定没有访问进程在访问这些数据在这里“访问”的意思是全部的任何访问。如果在复制时版本库被访问了(web浏览器WebSVN等等)备份将毫无意义。 推荐的方法是运行 svnadmin hotcopy path/to/repository path/to/backup –clean-logs 以一种安全的方式创建版本库的备份然后备份副本。 svnadmin工具在安装 Subversion 命令行客户端时已自动安装。最方便的方式是在安装TortoiseSVN时勾选对应的选项但是如果你更想要的话可以从Subversion[https://subversion.apache.org/ packages.html#windows]网站下载最新版本命令行工具。 3.3. 服务器端钩子脚本 钩子脚本是由某些版本库事件触发的程序例如创建新版本或修改未被版本控制的属性。每个钩子都能掌管足够的信息来了解发生了什么事件操作对象是谁以及触发事件用户名。根据钩子的输出或者返回状态钩子程序能够以某种方式继续执行停止或者挂起。请参阅 Subversion 手册中的 钩子脚本 [http://svnbook.red-bean.com/en/1.7/ svn.reposadmin.create.html#svn.reposadmin.create.hooks] 章节来获得关于已实现的钩子的完整信息。 这些钩子脚本被版本库所在的服务器执行。TortoiseSVN 也允许你配置由确定事件触发在本地执行的客户端脚本。请参看 第 4.31.8 节 “客户端钩子脚本” 以获得更多信息。 钩子脚本的例子位于版本库的 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 注意任何传输到标准输出 (stdout) 的内容都会被丢弃。如果想要在拒绝提交对话框中显示信息你必须将该信息送到标准错误 (stderr)。在批处理文件中通过使用 2 来实现。 跨越钩子 如果一个钩子脚本拒绝你的提交那这就是它的最终决定。但是你可以在脚本中使用 魔 咒 来构建一种跨越机制。如果脚本要拒接操作它首先在日志信息中扫描某个特定的通关 短语可以是一个固定的短语或者带有某个前缀的文件名。如果它找到了魔咒则允许提交继续进行。如果没有找到则阻挡提交并返回一条消息例如 “你没有念魔咒”。 3.4 检出链接 如果你希望你的 Subversion 版本库对于别人可用你可以在你的站点包含一个链接。为了让其更加容易访问你可以为其它 TortoiseSVN 用户包含一个检出链接。 当你安装了 TortoiseSVN它会注册一个 tsvn: 协议当TortoiseSVN 用户点击这样一个链接检出窗口会自动弹出且版本库 URL 已经填入。 想要在你个人的 html 页面中加入这样的链结只需要添加像这样的代码即可: a hreftsvn:http://project.domain.org/svn/trunk/a当然如果能插入一张合适的图片看起来更好。你可以使用 TortoiseSVN 标志 [https://tortoisesvn.net/images/TortoiseCheckout.png] 或者使用你自己的图片。 a hreftsvn:http://project.domain.org/svn/trunk img srcTortoiseCheckout.png/a你同样可以使链接指向一个特定的版本例如: a hreftsvn:http://project.domain.org/svn/trunk?100/a3.5 访问版本库 要使用 TortoiseSVN (或其它 Subversion 客户端程序)需要定位版本库的所在之处。版本库可以位于本机使用 file:// 协议访问或者位于服务器端使用 http:// 或 svn:// 协议访问。这两个服务器协议都可以加密。那就是 https:// 或 svnssh:// 抑或带 SASL 加密的 svn://。 如果你使用公共的主机服务例如 SourceForge[https://sourceforge.net]或者已经有人为你架设好了服务器那么在这里你不用做什么。前往 第 4 章 日常使用指南 。 如果你没有服务器并且独自工作或者只是想在独立的环境下评估 Subversion 和 TortoiseSVN那么本地版本库可能是你最好的选择。只要按照 第 3 章 版本库 中先前描述的那样在你自己的电脑中创建一个版本库就好了。你可以跳过本章剩余的内容进入 第 4 章 日常使用指南 了解如何开始用它。 如果你打算在网络共享中设者一个多用户的版本库请重新考虑。阅读第 3.1.4 节 “访问网络共享磁盘上的版本库”以了解为什么我们认为这是一个坏主意。设置一个服务器并不像听上去那样难。并且还会为你提供更好的性能甚至更快的速度。 你可以在Subversion 手册中服务器设置 [http://svnbook.red-bean.com/en/1.8/svn.serverconfig.html]章节下找到Subversion 服务器选项的更多细节信息和如何选择符合你的最佳架构。 Subversion早期设置服务器要求对人们对服务器设置有良好的理解并且在早期版本中的手册我们加入了如何设置服务器的具体具体描述。随着事情变得越来越简单现在有不少已经预先打包好的服务器安装包能引导你完成安装和设置。这些是我们所知道的部分安装包 VisualSVN [https://www.visualsvn.com/server/]CollabNet [https://www.collab.net/products/subversion] 你始终能在Subversion[https://subversion.apache.org/packages.html]网站找到最新的链接。 您可以在 TortoiseSVN[https://tortoisesvn.net/usefultips.html] 网站上找到更多的指南。 4、日常使用指南 本文目的在与描述TortoiseSVN客户端的日常使用。不是一个版本控制系统指南也不是Subversion (SVN)的指南。本文档的价值在于当你知道大概要做什么却又记不起应该怎么做的时候可以有个 参考的地方。 如果你需要了解使用Subversion进行版本控制的指南我们建立你阅读以下这本梦幻之书: 《使用 Subversion 进行版本管理》 [http://svnbook.red-bean.com/] 4.1 基本特性 这部分在描述了某些 TortoiseSVN 的特性适用于手册中的所有部分。请注意这些特性很多只在 Subversion的工作副本中显示。 4.1.1 图标重载 图 4.1. 显示重载图标的资源管理器 TortoiseSVN 最明显的特性之一就是图标重载重载的图标显示在你的工作副本文件上。你一眼就可以看到文件被修改过了。参考 第 4.7.1 节 “图标重载” 查阅不同的重载图标含义。 4.1.2 右键菜单 图 4.2. 版本控制下一个目录的右键菜单 所有的TortoiseSVN命令都是通过windows资源管理器的右键菜单执行。右键点击一个文件或者文件夹大多数菜单项都能够直接显示。一个命令是否显示取决于这个文件或文件夹或者它们的父文件夹是否受版本控制你也可以将TortoiseSVN的菜单作为资源管理器菜单的一部分。 某些很少被用到的命令只出现在扩展右键菜单中。要想打开扩展右键菜单需要在 右键单 击 时按住 Shift 键。 在某些情况下你可能看到多个TortoiseSVN条目。这不是BUG 图 4.3. 在一个版本控制的文件夹下资源管理器文件菜单中的快捷方式。 本示例是在一个受控文件夹下的某个未受控的快捷方式 在资源管理器的文件菜单下有三 个TortoiseSVN条目。一个是受控文件夹本身的一个是快捷方式本身的第三个是快捷方式所指向的对象。为了帮助你区分它们菜单条目的图标的右下角有标志表明是文件、快捷方式、文件夹或是选 中了多项。 4.1.3 拖放 图 4.4. 版本控制下的一个目录的右键拖拽菜单 在工作副本里右键拖拽文件或目录到新的位置或者右键拖拽一个非版本控制的文件或文件夹到一个版本控制目录下的时候右键菜单还能够出现其他的命令。 4.1.4 常用快捷方式 一些常见的操作与 Windows 的快捷键是一样的但没有出现在按钮或是菜单中。如果你找不到一些显而易见的操作比如刷新视图请参考以下内容。 F1 当然是帮助。F5 刷新当前视图。这也许是单键命令中唯一一个最常用的了。比如… 在资源浏览器中这个键可以刷新工作副本中的图标重载。在提交对话框中它可以重新扫描查找哪些是需要提交的。在版本日志对话框中可以重新联系版本库以检查更多的最近修改情况。CtrlA 全选。可用于在得到一个错误消息并想要复制粘贴到电子邮件时。使用Ctrl-A to选择错误错误然后…Ctrl-C 复制选中的文本。如果没有文本被选中 例如一个列表或者信息框则列表中或者信息框中的内容会被复制到剪贴板。 4.1.5 认证 如果连接的版本库需要密码就会显示认证对话框。 图 4.5. 认证对话框 输入你的用户名和密码。复选框能让 TortoiseSVN 在 Subversion 的缺省目录: %APPDATA%\Subversion \auth 的三个子目录内保存认证信息 svn.simple 里包含了基本认证方式所需要的认证信息(用户名/密码)。注意保存的密码是通过WinCrypt API 加密的不是文本形式。svn.ssl.server 里包含了SSL服务器证书。svn.username 里包含了用户名认证的认证信息(不需要提供密码)。 如果想要清除认证缓存可以通过 TortoiseSVN 设置对话框的已保存数据页来实现。全部清除按钮会清除所有版本库的认证缓存。清除…按钮会显示一个对话框你能选择哪些认证缓存需要被清除。清参考第 4.31.6 节 “已保存数据的设置” 有些人希望在注销 Windows 或者关机时删除认证数据。完成这个的方法是使用关机脚本来删除 %APPDATA%\Subversion\auth 目录例如: echo off rmdir /s /q %APPDATA%\Subversion\auth关于如何安装这种脚本的详细说明请参阅: http://www.windows-help-central.com/windows-shutdown-script.html。 更多的关于如何设置服务器进行认证和授权控制的信息请参考: 第 3.5 节 “访问版本库” 4.1.6最大化窗口 大多数 TortoiseSVN 的对话框显示很多信息但是经常只有最大化高度或者宽度有用而不是全部最大化覆盖整个屏幕。为了方便在 最大化 按钮有快捷方式做这些工作。使用鼠标中键最大化高度右键最大化宽度。 4.2 导入数据到版本库 4.2.1 导入 如果将项目导入一个已经含有其它项目的版本库中那么版本库的结构已经确定了。如果要导入一个新的版本库中那么最好花点时间来想一下如何设置版本库的结构。阅读 第 3.1.5 节 “版本库布局”获得更多建议。 这部分描述了Subversion 导入命令它被设计用于一次性导入一个文件夹的层次结构到版本库中。尽管它能完成这个工作但是它还是有不少缺点 不能选择包括哪些文件或文件夹除非使用全局忽略设置。导入的文件夹不能变成工作副本。你必须通过签出操作从服务器拿回文件。很容易导入到版本库中错误的文件夹层次。 基于此我们推荐你不要使用导入命令而是按照第 4.2.2 节 “导入适当的位置”描述的的两步方法除非你正在你的版本库创建一个初始的/trunk /tags /branches结构的简单步骤中。既然你做到了这里这些是基本导入工作的方法 在将你的项目导入到版本库之前你应该: 删除所有构建工程不需要的文件(临时文件编译器产生的文件例如 *.obj生成的二进制文件…)组织目录和子目录内的文件。尽管以后可以改名/删除文件我们还是建议你在导入之前使你的项目结构组织良好 现在进入资源管理器选择你的项目的顶层目录右击打开上下文菜单。选择命令TortoiseSVN → 导入 …它会弹出一个对话框: 图 4.6. 导入对话框 在这个对话框中需要输入你需要导入的版本库所在的 URL。你必须了解非常重要的事项: 你要导入的本地文件夹本身不会出现在版本库中只有文件夹中的内容。例如你有这样的文件夹结构: C:\Projects\Widget\source C:\Projects\Widget\doc C:\Projects\Widget\images 你将 C:\Projects\Widget 导入到http://mydomain.com/svn/trunk然后你会惊奇的发现: 你的子目录直接进入 trunk 中而不是在 Widget 的子目录中。你需要将子目录作为URL 的一部分明确的指出来http://mydomain.com/svn/trunk/Widget-X。注意如果版本库中不存在指定的子目录导入命令将会自动创建它们。 这个输入信息将用作提交日志。 默认情况下匹配全局忽略模式的文件和文件夹不会被导入。你可以使用包含忽略文件检验栏来禁止此行为。参考第 4.31.1 节 “常规设置”以获得关于全局忽略模式的更多信息。 当你点击确认时TortoiseSVN 会导入包含所有文件的完整目录树到版本库。现在这个工程就存贮在版本库被版本控制。请注意你导入的文件夹没有被版本控制你需要检出刚才导入的版本以便获得受版本控制的工作副本。或者继续阅读找到如何导入文件夹到合适的位置。 4.2.2 导入适当的位置 假定你已经有个版本库你想给它增加一个新目录结构只需以下步骤: 使用版本库浏览器来在版本库中直接创建新项目。如果有在使用标准布局的话你可能想要创建主干的子文件夹而不是版本库的根目录。版本库浏览器按Windows资源管理器的结构显示所以你可以看到文件是如何组织的在你要导入的文件夹检出新目录。你会得到一个本地文件夹为空的警告。忽视警告。现在你有一个版本控制的顶级目录其中含有未版本控制的内容。在此受版本控制的文件夹上使用TortoiseSVN → 增加…增加部分或全部内容。你可以增加或删除文件在文件夹上设置svn:ignore属性或者你需要的其它修改。提交顶级目录你有一个新的版本树一份从你已有目录创建的本地工作副本。 4.2.3 专用文件 有时候你需要版本控制一个包含用户专用的数据。它意味着你有一个文件每个开发者/用户都需要修改一边满足他/她的本地配置。但是版本控制这样的文件是困难的因为每个用户可能都要提交他/她的修改。 在这种情况下我们建议使用模版文件。创建一个包含所有开发者需要的数据的文件增加到版本库中让开发者检出。然后每个开发者创建一个副本改名此文件。于是修改这个文件不再是问题。 举个例子你可以看看TortoiseSVN的构建脚本。它调用一个不在版本库中的TortoiseVars.bat文件 。 只有TortoiseVars.tmpl在版本库中。TortoiseVars.tmpl是一个模版文件每个开发者都需要用模板创建一个副本并重命名为TortoiseVars.bat。在这个文件中我们增加了注释以便用户根据他们的本地设置知道那些行他们需要编辑来让它正常工作。 为了不干扰用户我们也将default.build.user增加到它父目录的忽略列表也就是我们设置了Subversion属性svn:ignore来包含这个文件名称。这样每次提交时它都不会作为没有版本控制的文件出现。 4.3 检出工作副本 为了得到一个工作副本需要进行从版本库检出的操作 在Windows资源管理器里选择一个存放工作副本的目录。右键点击弹出右键菜单选择TortoiseSVN →检出…命令。然后就会看到下面的对话框: 图 4.7. 检出对话框 如果输入一个并不存在的目录名那么这个名字的目录就会被创建出来。 在默认设置时检出菜单项不在TortoiseSVN 子目录而在资源管理器根目录。不在子目录中的 TortoiseSVN 命令有SVN前缀SVN 检出… 4.3.1 检出深度 你可以选择要检出的深度它允许你指定子目录递归的深度。如果你只需要大目录中的几个子条目你可以只检出最高层目录然后递归的更新选择的目录。 全递归 检出完整的目录树包含所有的文件或子目录。直接子节点包含文件夹 检出目录包含其中的文件或子文件夹但是不递归展开子文件夹。仅文件子节点 检出指定目录包含所有文件但是不检出任何子文件夹。仅此项 只检出目录。不包含其中的文件或子文件夹。工作副本 保持工作副本指定的深度。此选项不用于检出对话框但它是其它所有含有深度配置对话框的默认配置。排除 对于已经创建好的工作副本可以使用此选项来缩减文件夹的深度。这个选项只在更新至版本对话框中可用。 为了方便地选择你想要检出地文件并强制目标工作副本只保留这些项目单击选择项目按钮。这会打开一个新对话框。你可以选中你在工作副本中想要的所有项目取消选中你不想要的所有项目。目标工作副本将称为所谓的稀疏检出。这种工作副本的更新将不会获取丢失的文件和文件夹而是单单更新你的工作副本中所拥有的文件。 如果检出了一个稀疏工作副本(例如在检出深度一栏中选择了除全递归以外的其它项)你可以方便地 使用如下地方式之一来添加或删除子文件夹 。 4.3.1.1 使用更新到版本部分更新 右键检出的文件夹然后使用TortoiseSVN → 更新到修订版本然后选择选择项目…这将打开跟初始检查一样的对话框并允许你选中和取消选中包含在检出中的项目。这个方式很灵活但是如果文件夹中每个项目要单独更新的话就会很慢 4.3.1.2 使用版本库浏览器部分更新 右键选中需要检出的文件夹然后使用TortoiseSVN → 版本浏览来打开版本库浏览器。找到你想要添加到工作副本的子文件然后使用右键菜单 → 更新项目到版本库…。 4.3.1.3 使用检查修改部分更新 在检查修改对话框中首先shift点击检查版本库按钮。对话框会将你未检出但是位于版本库中的文件和文件夹显示为远程加入。右键单击你需要加入工作副本的文件夹选择右键菜单 → 更新。 当你想要检出一个很大的文件树的某些部分而且想要方便的只更新单一的工作副本时该功能非常有用。假设有一个很大的文件树其中包含 99 个子文件夹从 Project01 到 Project99你只想检出Project03Project25 和 Project76/SubProj。按下列步骤操作 检出父文件夹时检出深度使用“仅此项”。现在你获得一个空的顶级文件夹。选中新文件夹使用 TortoiseSVN → 版本库浏览器 来显示版本库的内容。右键单击 Project03 然后选择右键菜单 → 更新项目至版本…。保持默认设置并单击 确定。现在这个文件夹就位于你的工作副本中了。为 Project25 重复相同的操作。定位至 Project76/SubProj 并且进行相同的操作。这次需要注意Project76 文件夹中除了新增的SubProj 没有其它内容。Subversion 创建了相关的文件夹并没有拿出其全部内容。 改变工作副本深度 一旦以某个深度检出了工作副本后以后还可以修改这个深度来获得更多或更少的内容使用 右键菜单 → 更新该项至版本。在弹出的对话框中确认选中了 粘滞深度 复选框。 使用旧版本服务器 1.5 版之前的服务器不支持工作副本深度请求。所以不能有效的处理这种请求。不过该命令仍然可以使用但是旧版本的服务器会发送所有的数据让客户端来过滤掉哪些是不需 要的这就意味着大量的网络传输。如果可能应该将服务器升级到 1.5 版以上。 如果项目含有外部项目的引用而这些引用你不希望同时检出请选中忽略外部项目复选框。 如果选中了 忽略外部项目或者想要增加深度值你应该使用 TortoiseSVN → 更新至版本… 替代 TortoiseSVN → 更新 来对工作副本进行更新。标准的更新操作会包含外部项目 并保持深度。 强烈建议你只检出 trunk 或更低层的目录树。如果你在 URL 中指定了根路径你的硬盘有可能被塞满因为你将会得到整个版本库树的副本包括项目所有的分支和标签(tag) 关于导出 有时你可能想要建立一个没有.svn目录的本地的副本比如建立一个源代码压缩包。要达到这个目的请参考第 4.27 节 “导出一个Subversion工作副本”。 4.4.1 提交对话框 如果你的工作副本是最新的并且没有冲突你就已经为提交做好准备了选择你要提交的文件和/或文件夹然后TortoiseSVN → 提交… 图 4.8. 提交对话框 提交对话框将显示每个被改动过的文件包括新增的、删除的和未受控的文件。如果你不想改动被提交只要将该文件的复选框的勾去掉就可以了。如果你要加入未受控的文件只要勾选该文件把它加入提交列表就可以了。 快速选中或者取消选中所有版本控制的或修改过的文件类型单击列表上方显示项目的项目链接。 关于颜色和基于项目状态覆盖相关的信息请参考第 4.7.3 节 “本地与远程状态” 那些被切换(switched)到不同版本库路径的项也用(s)标记来表示。当工作在分支上的时候你可能切换到某处然后忘记切换回主干。这是你的警告信号 提交文件还是文件夹 当你提交文件时提交对话框只显示你所提中的文件。当你提交文件夹中提交对话框将自动选择有改动的文件。如果你忘记了你建立的一个新文件提交文件夹将使你可以找到它。提交一个文件夹并不意味着每个文件都被标识为修改过的它仅仅是通过帮你多做些事从而让你的生活更滋润一点。 在提交对话框中有很多未受控的文件 如果你认为提交对话框显示了太多的未受版本控制的文件(如编译器产生的文件或是编辑器的备份文件)有几种方法可以处理这种情况。你可以: 将文件(或是通配符扩展)加入到设置页的排除列表中。这对每个工作副本都起作用。使用TortoiseSVN → 加入忽略列表将文件加入svn:ignore列表。 这只对你设置了svn:ignore属性的路径有效。使用SVN属性对话框你可以改变一个目录的svn:ignore属性。使用TortoiseSVN → 添加到忽视列表全递归来增加文件到svn:global-ignores列表中去。这会影响你设svn:global-ignores属性的目录和所有的子文件夹。 参考 第 4.14 节 “忽略文件和目录” 获得更多的信息 在提交对话框中双击任何修改过的文件将运行外部 diff 工具显示你做的改动。上下文菜单将给你更多的选项请看屏幕截图。你可以从这里将文件拖动到另一个应用程序中如文本编辑器或 IDE。 可以通过单击条目左侧的复选框来选中或不选该条目。对于目录可以按下 Shift 键再 选择 就可以递归该动作。 在底部面板中显示的列是可定制的。如果你右击任何一列的头部你就会看到一个上下文菜单允许你选择哪一列要显示。还可以在鼠标移动到列边界时通过拖动手把来改变列的宽度。这些定制的内容都会被保留下来下一次你会见到相同的列。 缺省情况下当你成功提交修改后你在这些文件上持有的锁会被自动释放。如果你需要保留锁请确认选中检查框保留锁。此检查框的缺省状态从 Subversion 配置文件的no_unlock 选项获取。参考第 4.31.1 节 “常规设置” 以获得更多关于编辑 Subversion 配置文件的信息。 正在提交到Tag时警告通常提交是提交到主干或者分支而不是标签。毕竟标签应该固定而且不应该更改。 如果提交试图标识URLTortoiseSVN 会先显示确认对话框来确保这是否真的需要被完成。因为绝大多数时候这种提交是意外出现的。 然而只有在版本库布局是推荐布局的情况下这个检出才有效。这意味着它使用了名字主干分支和标签来标记三个主要区域。以防设置不同可以在设置对话框第 4.31.2 节 “版本图设置”中设置检测什么是标签/分支/主干同样也称为分类参数 拖放 你可以将文件从别的地方拖动到提交对话框只要工作副本是由同一版本库中检出就可以了。比如你有一个很大的工作副本要开好几个资源管理器窗口来查看层次中不同的文件夹。如果你要避免从顶级文件夹提交(冗长而缓慢的文件夹改动检查)你可以打开一个文件夹的提交对话框然后将别的窗口中的项拖进去这样就可以一次提交它们了。 你可以将未版本控制的文件拖到工作副本提交对话框中它们就会被自动增加。 从提交对话框底部的列表中将文件拖拽到日志消息编辑框中就能以文本格式将文件的路径插入编辑框中。当你想将本次提交相关的文件路径插入日志消息中时该功能非常有用。 修复外部改名 有时候文件不是用 Subversion 改名于是它们在文件列表中作为丢失和未版本控制的文件出现。为了避免丢失历史你需要通知Subversion。简单的选择老名称(丢失)和新名称(未版本控制)然后使用右键菜单 → 修复移动来指明这两个文件是改名关系。 修复外部复制 如果复制了一个文件但不是通过 Subversion 的命令来做的你可以修复此次复制来确保新文件不会丢失历史。只要简单的选择旧文件(正常或已修改)和新文件(无版本控制)然后使用 右键菜单 → 修复复制来修复两个文件的复制关系。 4.4.2 修改列表 提交对话框支持 Subversion 的更改列表功能来分组相关的文件。关于这个功能请查看第 4.8 节“修改列表”。 4.4.3 仅提交文件的部分 有时你只想提交一个文件部分修改的部分。这种情况通常在你做某些事情但是一个紧急的修复需要被提交而那个修复正好是你正在工作中的同一个文件。 右键文件并使用上下文菜单 → 提交后恢复。这回创建文件的一个副本。然后你可以编辑这个文件例如在文本编辑器中撤销你不想要提交的所有修改。在保存这些修改后你可以提交文件 使用 TortoiseMerge 如果你使用TortoiseMerge来编辑文件你可以编辑你修改过的变更也可以标记你想要添加的变更。右键修改块然后使用上下文菜单 → 标记这个变更来添加变更。最后右键并使用上下文菜单 → 仅保留标记的变更它就会更改正确的视图以包括你之前标记的变更并撤销你未标记的变更。