[No000094]SVN学习笔记4-版本库概念与部分日常操作

基本概念

版本库

Subversion 使用集中的数据库,它包含了所有的版本控制文件及其完整历史。这个数据库就是版本库。版本库通常位于运行 Subversion 服务器的文件服务器上,向 Subversion 客户端(例如TortoiseSVN)提供需要的数据。如果只备份一个东西,请备份版本库,因为它是你数据的主副本。

Subversion 是一种集中的分享信息的系统,它的核心是版本库,储存所有的数据,版本库按照文件树形式储存数据-包括文件和目录,任意数量的客户端可以连接到版本库,读写这些文件。通过写数据,别人可以看到这些信息;通过读数据,可以看到别人的修改。

[No000094]SVN学习笔记4-版本库概念与部分日常操作

一个典型的客户/服务器系统

实际上,版本库是另一种文件服务器,而不是你常见的那一种。最特别的是 Subversion 会记录每一次的更改,不仅针对文件也包括目录本身,包括增加、删除和重新组织文件和目录。

工作副本

这是实际工作的地方。每一个开发者在自己的电脑上都有属于自己的工作副本,有时可以将其理解为沙箱。你可以将最新的版本从版本库上取下来,在本地的副本上工作而不影响其他人,如果对更改满意就可以将其提交到版本库中。

Subversion 工作副本不包含项目的历史,但是它保存了你修改前的本件的副本,就像这些文件在版本库中的状态一样。这意味着你可以轻而易举的准确检查出都做了哪些改动。

添加更多的文件

右键单击文件夹然后选择 TortoiseSVN →增加。加入对话框显示了所有未被版本控制的文件,你可以选择哪些文件要被添加。另一个增加文件的方法是右键单击文件自身然后选择 TortoiseSVN →加入。

现在当你提交文件夹时,新文件会显示为增加,原有的文件显示为修改。注意你可以双击修改的文件查看做了哪些改动。

文件共享的问题

锁定-修改-解锁 方案

在这种系统中,在同一时间版本库只允许一个用户修改一个文件。

[No000094]SVN学习笔记4-版本库概念与部分日常操作

锁定-修改-解锁模型有一点问题就是限制太多,经常会成为用户的障碍:

•锁定可能导致管理问题。有时候 Harry 会锁住文件然后忘了此事,这就是说 Sally 一直等待解锁来编辑这些文件,她在这里僵住了。然后 Harry 去旅行了,现在 Sally 只好去找管理员放开锁,这种情况会导致不必要的耽搁和时间浪费。

•锁定可能导致不必要的线性化开发。如果 Harry 编辑一个文件的开始,Sally 想编辑同一个文件的结尾,这种修改不会冲突,设想修改可以正确的合并到一起,他们可以轻松的并行工作而没有太多的坏处,没有必要让他们轮流工作。

•锁定可能导致错误的安全状态。假设 Harry 锁定和编辑一个文件 A,同时 Sally 锁定并编辑文件 B,如果 A 和 B 互相依赖,这种变化是必须同时作的,这样 A 和 B 不能正确的工作了,锁定机制对防止此类问题将无能为力—从而产生了一种处于安全状态的假相。很容易想象 Harry 和 Sally 都以为自己锁住了文件,而且从一个安全,孤立的情况开始工作,因而没有尽早发现他们不匹配的修改。

复制-修改-合并 方案

[No000094]SVN学习笔记4-版本库概念与部分日常操作

[No000094]SVN学习笔记4-版本库概念与部分日常操作

复制-修改-合并方案

但是如果 Sally 和 Harry 的修改重叠了该怎么办?这种情况叫做冲突,这通常不是个大问题,当Harry 告诉他的客户端去合并版本库的最新修改到自己的工作副本时,他的文件 A 就会处于冲突状态: 他可以看到一对冲突的修改集,并手工的选择保留一组修改。需要注意的是软件不能自动的解决冲突,只有人可以理解并作出智能的选择,一旦 Harry 手工的解决了冲突(也许需要与 Sally 讨论),他就可以安全的把合并的文件保存到版本库。

最后,一切都要归结到一条重要的因素: 用户交流。当用户交流贫乏,语法和语义的冲突就会增加,没有系统可以强制用户完美的交流,没有系统可以检测语义上的冲突,所以没有任何证据能够承诺锁定系统可以防止冲突,实践中,锁定除了约束了生产力,并没有做什么事。

有一种情况下锁定-修改-解锁模型会更好,也就是你有不可合并的文件,例如你的版本库包含了图片,两个人同时编辑这个文件,没有办法将这两个修改合并,Harry 或 Sally 会丢失他们的修改。

一个 Subversion 工作副本是你本地机器一个普通的目录,保存着一些文件,你可以任意的编辑文件,而且如果是源代码文件,你可以像平常一样编译,你的工作副本是你的私有工作区,在你明确的做了特定操作之前,Subversion 不会把你的修改与其他人的合并,也不会把你的修改展示给别人。当对工作副本中的文件做了一些更改并确认他们能够正常工作后,Subversion 提供将这些更改公布给同项目的其他人员的命令(通过写入版本库)。如果其他人公布他们的更改,Subversion 提供将这些更改合并到工作副本的命令(通过读取本版本库)。

svn commit 操作可以作为一个原子事务操作发布任意数量文件和目录的修改。在你的工作副本中,你可以改变文件内容,创建、删除、改名和复制文件和目录,然后作为一个整体提交。

在版本库中,每次提交被当作一次原子事务操作: 要么所有的改变发生,要么都不发生,Subversion努力保持原子性以应对程序错误、系统错误、网络问题和其他用户行为。

,只创建了一个空目录,没有任何内容。

可以形象的把版本库看作一系列树,想象有一组版本号,从 0 开始,从左到右,每一个修订号有一个目录树挂在它下面,每一个树好像是一次提交后的版本库"快照"。

[No000094]SVN学习笔记4-版本库概念与部分日常操作

全局版本号

需要特别注意的是,工作副本并不一定对应版本库中的单一版本,他们可能包含多个版本的文件。

工作副本怎样跟踪版本库

对于工作副本的每一个文件,Subversion 在管理目录 .svn/ 记录两项关键的信息:

• what revision your working file is based on (this is called the file's working revision)

•一个本地副本最后更新的时间戳。

给定这些信息,通过与版本库通讯,Subversion 可以告诉我们工作文件是处与如下四种状态的那一种:

未修改且是当前的

文件在工作目录里没有修改,在工作版本之后没有修改提交到版本库。svn commit 操作不做任何事情,svn update 不做任何事情。

本地已修改且是当前的

工作副本已经修改,从基准版本之后没有修改提交到版本库。本地修改没有提交,因此 commit 会成功的提交,update 不做任何事情。

本地未修改且过时

这个文件在工作副本没有修改,但在版本库中已经修改了。这个文件应当更新到最新公共版本。commit 不做任何事情,update 将会更新工作副本到最新的版本。

本地已修改且过时

这个文件在工作副本和版本库中都被修改了。提交该文件将会因为过时而失败。该文件应该先更新; 更新命令将会尝试合并公共更改和本机更改。如果 Subversion 不能顺利的自动完成合并,则需要用户解决冲突。

在本地建立一个本地版本库存储空间(只适用于一个开发者,或者多人通过网络磁盘共享访问)

使用命令行工具创建(本地)版本库

创建一个名为SVN(例如D:\SVN\)的空文件夹,作为你的所有版本库的根。

1.在D:\SVN\里创建另一个目录MyNewRepository。

2.Open the command prompt (or DOS-Box), change into D:\SVN\ and type

svnadmin create --fs-type fsfs MyNewRepository

现在你在D:\SVN\MyNewRepository创建了一个新的版本库。

[No000094]SVN学习笔记4-版本库概念与部分日常操作

使用 TortoiseSVN 创建(本地)版本库

1. 打开资源管理器

2. 创建一个新的文件夹,命名为SVNRepository

3. 右键单击新建的文件夹并选择 TortoiseSVN →在此创建版本库(Create repository here)...。

然后就会在新文件夹创建一个版本库,不要手工编辑这些文件!!!如果你得到什么警告,一定要先确定目录非空并且没有写保护。

[No000094]SVN学习笔记4-版本库概念与部分日常操作

TortoiseSVN 将会在创建版本库时为其设置一个特定的文件夹图标,便于辨别本地版本库。如果使用官方的命令行客户端创建版本库则不会设置文件夹图标。

[No000094]SVN学习笔记4-版本库概念与部分日常操作

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,这种格式依然支持,但不推荐。

访问网络共享磁盘上的版本库

Although in theory it is possible to put a FSFS repository on a network share and have multiple users access it using file:// protocol, this is most definitely not recommended. In fact we would strongly discourage it, and do not support such use for various reasons:

•首先,这样赋予所有用户对版本库的写权限,所以任何一个用户都可能意外的删除整个版本库,或者因为别的问题导致版本库不可用。

•其次,不是所有的网络文件共享协议都支持 Subversion 需要的文件锁定,所以你会发现你的版本库被毁了。它也许不会马上发生,但是总有一天会有 2 个用户同时访问版本库。

•第三,文件的权限必需设置得井井有条。也许 Windows 的共享可以避开这个问题,但是在 SAMBA(一种文件共享协议)中却是相当困难的。

• If one person installs a newer version of the client which upgrades the repository format, then everyone else will be unable to access the repository until they also upgrade to the new client version.

file:// 访问是为本机工作而准备的,只能单用户访问,特别是测试和调试。当你打算共享版本库的时候,你真的需要设置一个适当的服务器,而且它并不像你想象的那样困难。

版本库布局

在将你的数据导入到版本库之前,首先你得考虑如何组织你的数据。如果你使用一种推荐的布局,你在后面的操作将会更容易许多。

有一些标准的,推荐使用的组织版本库结构的方法。大多数人创建一个 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 次提交),就像这样:

1. 在你的硬盘上创建一个空的文件夹

2. 在那个文件夹下创建你想要的*目录--千万不要放任何文件进去!

3. 将这个结构导入版本库中,只需右键单击包含这个结构的文件夹并选择 TortoiseSVN →导入...。在导入对话框中输入版本库的 URL 并单击确定。这样就会将临时文件夹导入版本库中创建基本布局。

Note that the name of the folder you are importing does not appear in the repository, only its contents. For example, create the following folder structure:

C:\Temp\New\trunk

C:\Temp\New\branches

C:\Temp\New\tags

Import C:\Temp\New into the repository root, which will then look like this:

/trunk

/branches

/tags

右键导入的文件夹是作为远程版本库的根目录。

版本库备份

无论你使用何种版本库,定期维护和验证版本库备份非常重要,或许你可以访问最近版本的文件,但是如果没有版本库,所有的历史将会丢失。

The simplest (but not recommended) way is just to copy the repository folder onto the backup medium. However, you have to be absolutely sure that no process is accessing the data. In this context, access means any access at all. If your repository is accessed at all during the copy, (web browser left open, WebSVN, etc.) the backup will be worthless.(备份期间,不能有连接访问版本库)

The recommended method is to run (热备份)

svnadmin hotcopy path/to/repository path/to/backup

to create a copy of your repository in a safe manner. Then backup the copy.

The svnadmin tool is installed automatically when you install the Subversion command line client. The easiest way to get this is to check the option to include the command line tools when installing TortoiseSVN, but if you prefer you can download the latest version of command line tools directly from the Subversion [http://subversion.apache.org/packages.html#windows] website.

服务器端钩子脚本

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 [http://svnbook.red-bean.com/en/1.8/svn.reposadmin.create.html#svn.reposadmin.create.hooks] in the ubversion Book for full details about the hooks which are implemented.

这些钩子脚本被版本库所在的服务器执行。TortoiseSVN 也允许你配置由确定事件触发,在本地执行的客户端脚本。

Sample hook scripts can be found in the hooks directory of the repository. These sample scripts are suitable for Unix/Linux servers but need to be modified if your server is Windows based. The hook can be a batch file or an executable. The sample below shows a batch file which might be used to implement a pre-revprop-change hook.(版本属性修改之前触发的脚本)

[No000094]SVN学习笔记4-版本库概念与部分日常操作

rem Only allow log messages to be changed.

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

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

exit 1

Note that anything sent to stdout(标准输出界面cmd界面) is discarded. If you want a message to appear in the Commit Reject dialog you must send it to stderr(标准错误). In a batch file this is achieved using >&2.

If a hook script rejects your commit then its decision is final. But you can build an override mechanism into the script itself using the Magic Word technique. If the script wants to reject the operation it first scans the log message for a special pass phrase, either a fixed phrase or perhaps the filename with a prefix. If it finds the magic word then it allows the commit to proceed. If the phrase is not found then it can block the commit with a message like "You didn't say the magic word". :-)(你可以通过白名单放行一些文件的提交命令)

检出链接

如果你希望你的 Subversion 版本库对于别人可用,你可以在你的站点包含一个链接。为了让其更加容易访问,你可以为其它 TortoiseSVN 用户包含一个检出链接。

当你安装了 TortoiseSVN,它会注册一个 tsvn: 协议,当 TortoiseSVN 用户点击这样一个链接,检出窗口会自动弹出,且版本库 URL 已经填入。

想要在你个人的 html 页面中加入这样的链结,只需要添加像这样的代码即可:

<a href="tsvn:http://project.domain.org/svn/trunk"></a>

当然,如果能插入一张合适的图片会看起来更好。你可以使用 TortoiseSVN 标志或者你自己的图片。

<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>

访问版本库

  • 要使用 TortoiseSVN (或其它 Subversion 客户端程序),需要定位版本库的所在之处。版本库可以位于本机使用 file:// 协议访问,或者位于服务器端使用 http:// 或 svn:// 协议访问。这两个服务器协议都可以加密。那就是 https:// 或 svn+ssh://, 抑或带 SASL 加密的 svn://。
  • 如果你使用公共的主机服务,例如 Google Code [http://code.google.com/hosting/],或者已经有人为你架设好了服务器,那么在这里你不用做什么。
  • 如果你没有服务器并且独自工作,或者只是想在独立的环境下评估 Subversion 和 TortoiseSVN,那么本地版本库可能是你最好的选择。
  • 如果你打算在网络共享中设者一个多用户的版本库,请重新考虑。

日常使用指南

本文目的在与描述TortoiseSVN客户端的日常使用。不是一个版本控制系统指南,也不是Subversion(SVN)的指南。本文档的价值在于,当你知道大概要做什么,却又记不起应该怎么做的时候,可以有个参考的地方。

This section describes some of the features of TortoiseSVN which apply to just about everything in the manual. Note that many of these features will only show up within a Subversion working copy.(下面所讲的一切特性,只会出现在工作副本中)

图标重载

[No000094]SVN学习笔记4-版本库概念与部分日常操作

可以通过Setting修改不同的风格

[No000094]SVN学习笔记4-版本库概念与部分日常操作

重载的图标显示在你的工作副本文件上。你一眼就可以看到文件被修改过了。

右键菜单

版本控制下(工作副本文件夹上)一个目录的右键菜单

[No000094]SVN学习笔记4-版本库概念与部分日常操作

一个命令是否显示取决于这个文件或文件夹或者它们的父文件夹是否受版本控制,你也可以将TortoiseSVN的菜单作为资源管理器菜单的一部分。

某些很少被用到的命令只出现在扩展右键菜单中。要想打开扩展右键菜单,需要在 右键单击 时按住 Shift 键。(在某些情况下,你可能看到多个TortoiseSVN条目。这不是BUG!)

[No000094]SVN学习笔记4-版本库概念与部分日常操作在一个版本控制的文件夹下资源管理器文件菜单中的快捷方式。

本示例是在一个受控文件夹下的某个未受控的快捷方式, 在资源管理器的文件菜单下有三个TortoiseSVN条目。一个是受控文件夹本身的,一个是快捷方式本身的,第三个是快捷方式所指向的对象。为了帮助你区分它们,菜单条目的图标的右下角有标志,表明是文件、快捷方式、文件夹或是选中了多项。

This example is for an unversioned shortcut within a versioned folder, and in the Explorer file menu there are three entries for TortoiseSVN. One is for the folder, one for the shortcut itself, and the third for the object the shortcut is pointing to. To help you distinguish between them, the icons have an indicator in the lower right corner to show whether the menu entry is for a file, a folder, a shortcut or for multiple selected items.

[No000094]SVN学习笔记4-版本库概念与部分日常操作

在工作副本里右键拖拽文件或目录到新的位置,或者右键拖拽一个非版本控制的文件或文件夹到一个版本控制目录下的时候,右键菜单还能够出现其他的命令。

常用快捷方式

F5 刷新当前视图。这也许是单键命令中唯一一个最常用的了。比如... 在资源浏览器中,这个键可以刷新工作副本中的图标重载。在提交对话框中,它可以重新扫描查找哪些是需要提交的。在版本日志对话框中,可以重新联系版本库以检查更多的最近修改情况。

认证

如果连接的版本库需要密码,就会显示认证对话框。

[No000094]SVN学习笔记4-版本库概念与部分日常操作

输入你的用户名和密码。复选框能让 TortoiseSVN 在 Subversion 的缺省目录: %APPDATA%\Subversion\auth 的三个子目录内保存认证信息:

• svn.simple 里包含了基本认证方式所需要的认证信息(用户名/密码)。注意,保存的密码是通过WinCrypt API 加密的,不是文本形式。

• svn.ssl.server 里包含了SSL服务器证书。

• svn.username 里包含了用户名认证的认证信息(不需要提供密码)。

[No000094]SVN学习笔记4-版本库概念与部分日常操作

If you want to clear the authentication cache, you can do so from the Saved Data page of TortoiseSVN's settings dialog. The button Clear all will clear the cached authentication data for all repositories. The button Clear... however will show a dialog where you can chose which cached authentication data should be deleted.

[No000094]SVN学习笔记4-版本库概念与部分日常操作

可以通过TortoiseSVN客户端删除认证,也可以很暴力的直接删除%APPDATA%\Subversion\auth文件夹和其内容删除认证。

Some people like to have the authentication data deleted when they log off Windows, or on shutdown. The way to do that is to use a shutdown script to delete the %APPDATA%\Subversion \auth directory, e.g.

@echo off

rmdir /s /q "%APPDATA%\Subversion\auth"

还可以写个关机脚本,自动删除%APPDATA%\Subversion\auth文件夹和其内容

You can find a description of how to install such scripts at http://www.windows-help-central.com/windows-shutdown-script.html.

导入数据到版本库

如果将项目导入一个已经含有其它项目的版本库中,那么版本库的结构已经确定了。如果要导入一个新的版本库中,那么最好花点时间来想一下如何设置版本库的结构。

This section describes the Subversion import command(导入命令), which was designed for importing a directory hierarchy(目录层次) into the repository in one shot(一次性). Although it does the job, it has several shortcomings:(虽然该方法可行,但是有几个缺点)

  • 不能选择包括哪些文件或文件夹,除非使用全局忽略设置。
  • 导入的文件夹不能变成工作副本。你必须通过签出操作从服务器拿回文件。
  • 很容易导入到版本库中错误的文件夹层次。

因此不建议直接导入而是通过文章后面介绍的两步法导入 , unless you are performing the simple step of creating an initial /trunk /tags /branches structure in your repository. Since you are here, this is how the basic import works ...

在将你的项目导入到版本库之前,你应该:

1. 删除所有构建工程不需要的文件(临时文件,编译器产生的文件,例如 *.obj,生成的二进制文件,...)

2. 组织目录和子目录内的文件。尽管以后可以改名/删除文件,我们还是建议你在导入之前使你的项目结构组织良好!

现在进入资源管理器,选择你的项目的顶层目录,右击打开上下文菜单。选择命令TortoiseSVN → 导入 ...,它会弹出一个对话框:

[No000094]SVN学习笔记4-版本库概念与部分日常操作

In this dialog you have to enter the URL of the repository location where you want to import your project. It is very important to realise that the local folder you are importing does not itself appear in the repository, only its content.

Note that the import command will automatically create subdirectories within the repository if they do not exist.如果服务端版本库没有指定路径,则在导入时会自动创建。

在文件夹上右键导入,不会导入该文件夹本身,而是导入该文件夹下的内容到服务端版本库的主目录下。

默认情况下,匹配全局忽略模式的文件和文件夹不会被导入。你可以使用包含忽略文件检验栏来禁止此行为。

当你点击确认时,TortoiseSVN 会导入包含所有文件的完整目录树到版本库。现在这个工程就存贮在版本库,被版本控制。请注意,你导入的文件夹没有被版本控制!你需要检出刚才导入的版本,以便获得受版本控制的工作副本。

导入适当的位置

假定你已经有个版本库,你想给它增加一个新目录结构,只需以下步骤:

1. Use the repository browser to create a new project folder directly in the repository.If you are using one of the standard layouts you will probably want to create this as a sub-folder of trunk rather than in the repository root. The repository browser shows the repository structure just like Windows explorer, so you can see how things are organised.(通过repository browser直接在服务端版本库内创建目录结构)

2. Checkout the new folder over the top of the folder you want to import. You will get a warning that the local folder is not empty. Ignore the warning. Now you have a versioned top level folder with unversioned content.

3. 在此受版本控制的文件夹上使用TortoiseSVN → 增加...增加部分或全部内容。你可以增加或删除文件,在文件夹上设置svn:ignore属性,或者你需要的其它修改。

4. 提交*目录,你有一个新的版本树,一份从你已有目录创建的本地工作副本。(先全部下载版本库里的文件,然后调整并增加新目录结构,然后提交到版本库)

专用文件

有时候你需要版本控制一个包含用户专用的数据。它意味着你有一个文件,每个开发者/用户都需要修改,一边满足他/她的本地配置。但是版本控制这样的文件是困难的,因为每个用户可能都要提交他/她的修改。

在这种情况下,我们建议使用模版文件。创建一个包含所有开发者需要的数据的文件,增加到版本库中,让开发者检出。然后,每个开发者创建一个副本,改名此文件。于是,修改这个文件不再是问题。

As an example, you can have a look at TortoiseSVN's build script. It calls a file named default.build.user which doesn't exist in the repository. Only the file default.build.user.tmpl. default.build.user.tmpl is the template file which every developer has to create a copy from and rename that file to default.build.user. Inside that file, we added comments so that the users will see which lines they have to edit and change according to their local setup to get it working.(通过脚本实现模板文件)

So as not to disturb the users, we also added the file default.build.user to the ignore list of its parent folder, i.e. we've set the Subversion property svn:ignore to include that filename. That way it won't show up as unversioned on every commit.

检出工作副本

为了得到一个工作副本,需要进行从版本库检出的操作。

在Windows资源管理器里选择一个存放工作副本的目录。右键点击弹出右键菜单,选择TortoiseSVN →检出…命令。然后就会看到下面的对话框:

[No000094]SVN学习笔记4-版本库概念与部分日常操作

如果输入一个并不存在的目录名,那么这个名字的目录就会被创建出来。

In the default setting, the checkout menu item is not located in the TortoiseSVN submenu but is shown at the top explorer menu. TortoiseSVN commands that are not in the submenu have SVN prepended: SVN Checkout...(Checkout菜单在主菜单显示)

检出深度

你可以选择要检出的深度,它允许你指定子目录递归的深度。如果你只需要大目录中的几个子条目,你可以只检出最高层目录,然后递归的更新选择的目录。

全递归Fully recursive

检出完整的目录树,包含所有的文件或子目录。

直接子节点,包含文件夹Immediate children, including folders

检出目录,包含其中的文件或子文件夹,但是不递归展开子文件夹。

仅文件子节点Only file children

检出指定目录,包含所有文件,但是不检出任何子文件夹。

仅此项Only this item

只检出目录。不包含其中的文件或子文件夹。

工作副本Working copy

保持工作副本指定的深度。此选项不用于检出对话框,但它是其它所有含有深度配置对话框的默认配置。

排除Exclude

对于已经创建好的工作副本,可以使用此选项来缩减文件夹的深度。这个选项只在更新至版本对话框中可用。

To easily select only the items you want for the checkout and force the resulting working copy to keep only those items, click the Choose items... button. This opens a new dialog where you can check all items you want in your working copy and uncheck all the items you don't want. The resulting working copy is then known as a sparse checkout. An update of such a working copy will not fetch the missing files and folders but only update what you already have in your working copy.

自定义深度检出按钮

  • Sparse Update using Update to Revision【TortoiseSVN → Update to Revision and select Choose items....】
  • Sparse Update using Repo Browser【TortoiseSVN → Repo-Browser to bring up the repository browser. Find the sub-folder you would like to add to your working copy, then use Context Menu → Update item to revision....】
  • Sparse Update using Check for Modifications【first shift click on the button Check repository. The dialog will show all the files and folders which are in the repository but which you have not checked out as remotely added. Right click on the folder(s) you would like to add to your working copy, then use Context menu → Update.】

改变工作副本深度

一旦以某个深度检出了工作副本后,以后还可以修改这个深度来获得更多或更少的内容,使用 右键菜单 → 更新该项至版本。在弹出的对话框中,确认选中了 粘滞深度 复选框。

使用旧版本服务器

1.5 版之前的服务器不支持工作副本深度请求。所以不能有效的处理这种请求。不过该命令仍然可以使用,但是旧版本的服务器会发送所有的数据,让客户端来过滤掉哪些是不需要的,这就意味着大量的网络传输。如果可能,应该将服务器升级到 1.5 版以上。

如果项目含有外部项目的引用,而这些引用你不希望同时检出,请选中忽略外部项目复选框。

如果选中了 忽略外部项目,或者想要增加深度值,你应该使用 TortoiseSVN → 更新至版本... 替代 TortoiseSVN → 更新 来对工作副本进行更新。标准的更新操作会包含外部项目并保持深度。

强烈建议你只检出 trunk 或更低层的目录树。如果你在 URL 中指定了根路径,你的硬盘有可能被塞满,因为你将会得到整个版本库树的副本,包括项目所有的分支和标签(tag)!

将你的修改提交到版本库

将你对工作副本的修改发送给版本库,称为提交修改。但在你提交之前要确保你的工作副本是最新的。你可以直接使用TortoiseSVN → 更新,或者,你可以先使用TortoiseSVN → 检查修改看看哪些文件在本地或是服务器上已经有了改动。

提交对话框

如果你的工作副本是最新的,并且没有冲突,你就已经为提交做好准备了,选择你要提交的文件和/或文件夹,然后TortoiseSVN → 提交....

[No000094]SVN学习笔记4-版本库概念与部分日常操作

提交对话框将显示每个被改动过的文件,包括新增的、删除的和未受控的文件。如果你不想改动被提交,只要将该文件的复选框的勾去掉就可以了。如果你要加入未受控的文件,只要勾选该文件把它加入提交列表就可以了。

To quickly check or uncheck types of files like all versioned files or all modified files,click the link items just above the list of shown items.(点击上面的链接,快速选择需要的项目)

那些被切换(switched)到不同版本库路径的项也用(s)标记来表示。当工作在分支上的时候你可能切换到某处,然后忘记切换回主干。这是你的警告信号!

提交文件还是文件夹?

当你提交文件时,提交对话框只显示你所提中的文件。当你提交文件夹中,提交对话框将自动选择有改动的文件。如果你忘记了你建立的一个新文件,提交文件夹将使你可以找到它。提交一个文件夹并不意味着每个文件都被标识为修改过的,它仅仅是通过帮你多做些事从而让你的生活更滋润一点。

在提交对话框中有很多未受控的文件

如果你认为提交对话框显示了太多的未受版本控制的文件(如编译器产生的文件或是编辑器的备份文件),有几种方法可以处理这种情况。你可以:

• 将文件(或是通配符扩展)加入到设置页的排除列表中。这对每个工作副本都起作用。

• 使用TortoiseSVN->加入忽略列表,将文件加入svn:ignore列表。 这只对你设置了svn:ignore属性的路径有效。使用SVN属性对话框,你可以改变一个目录的svn:ignore属性。

• add the file to the svn:global-ignores list using TortoiseSVN → Add to ignore list (recursively递归地) This will affect the directory on which you set the svn:global-ignores property and all subfolders as well.(全局忽略)

在提交对话框中双击任何修改过的文件,将运行外部 diff 工具显示你做的改动。上下文菜单将给你更多的选项,请看屏幕截图。你可以从这里将文件拖动到另一个应用程序中,如文本编辑器或 IDE。可以通过单击条目左侧的复选框来选中或不选该条目。对于目录,可以按下 Shift 键再 选择 就可以

递归该动作。

在底部面板中显示的列是可定制的。如果你右击任何一列的头部,你就会看到一个上下文菜单,允许你选择哪一列要显示。还可以在鼠标移动到列边界时通过拖动手把来改变列的宽度。这些定制的内容都会被保留下来,下一次你会见到相同的列。缺省情况下,当你成功提交修改后,你在这些文件上持有的锁会被自动释放。如果你需要保留锁,请确认选中检查框保留锁。此检查框的缺省状态从 Subversion 配置文件的 no_unlock 选项获取。

Warning when committing to a tag

Usually, commits are done to the trunk or a branch, but not to tags. After all, a tag is considered fixed and should not change.(一般只针对trunk和branch提交,tags不提交)

If a commit is attempted to a tag URL, TortoiseSVN shows a confirmation dialog first to ensure whether this is really what is intended. Because most of the time such a commit is done by accident.However, this check only works if the repository layout is one of the recommended

ones, meaning it uses the names trunk, branches and tags to mark the three main areas. In case the setup is different, the detection of what is a tag/branch/trunk (also known as classification patterns)

拖放

你可以将文件从别的地方拖动到提交对话框,只要工作副本是由同一版本库中检出就可以了。比如,你有一个很大的工作副本,要开好几个资源管理器窗口来查看层次中不同的文件夹。如果你要避免从*文件夹提交(冗长而缓慢的文件夹改动检查),你可以打开一个文件夹的提交对话框,然后将别的窗口中的项拖进去,可样就可以一次提交它们了。

你可以将未版本控制的文件拖到工作副本提交对话框中,它们就会被自动增加。从提交对话框底部的列表中将文件拖拽到日志消息编辑框中,就能以文本格式将文件的路径插入编辑框中。当你想将本次提交相关的文件路径插入日志消息中时该功能非常有用。

修复外部改名

有时候文件不是用 Subversion 改名,于是它们在文件列表中作为丢失和未版本控制的文件出现。为了避免丢失历史,你需要通知Subversion。简单的选择老名称(丢失)和新名称(未版本控制),然后使用右键菜单 → 修复移动【Context Menu → Repair Move】来指明这两个文件是改名关系。

修复外部复制

如果复制了一个文件,但不是通过 Subversion 的命令来做的,你可以修复此次复制来确保新文件不会丢失历史。只要简单的选择旧文件(正常或已修改)和新文件(无版本控制),然后使用 右键菜单 → 修复复制【Context Menu → Repair Copy】来修复两个文件的复制关系。

Commit only parts of files只提交文件的部分

Sometimes you want to only commit parts of the changes you made to a file. Such a situation usually happens when you're working on something but then an urgent fix needs to be committed, and that fix happens to be in the same file you're working on.

right click on the file and use Context Menu → Restore after commit. This will create a copy of the file as it is. Then you can edit the file, e.g. in a text editor and undo all the changes you don't want to commit. After saving those changes you can commit the file.

使用 TortoiseMerge

If you use TortoiseMerge to edit the file, you can either edit the changes as you're used to, or mark all the changes that you want to include. right click on a modified block and use Context Menu → Mark this change to include that change. Finally right click and use Context Menu → Leave only marked changes which will change the right view to only include the changes you've marked before and undo the changes you have not marked.(在合并工具里右侧右键菜单标记改变和取消标记)

After the commit is done, the copy of the file is restored automatically, and you have the file with all your modifications that were not committed back.(自动保存)

从提交列表中排除项目

有时,你经常更改一些版本控制的文件但你却不打算提交它们。这有可能说明你的构建过程中存在瑕疵- 那些文件为什么是版本控制的?应该使用模版文件吗?但可能这是无法避免的。一个经典的原因是当你每次构建的时候,集成开发环境(IDE)更改了项目文件的时间戳。项目文件是版本控制的,因为它包含全部的构建设置。但是,仅仅因为时间戳更改了的情况下,你并不需要提交它。

为了解决这样一个棘手的问题,我们准备了一个名叫 ignore-on-commit 的更改列表。任何一个被添加到这个列表的文件在提交对话框中将不会自动选中。你仍然可以提交此文件的更改,不过你需要在提交对话框中手动选中它。

提交日志信息

确保输入描述你所提交的修改内容的日志信息。这可以帮你回顾做了什么,什么时候做的。信息的内容可长可短,许多项目规定了要包含的内容、使用的语言甚至是严格的格式。

你可以使用与电子邮件相似的约定,简单格式化日志消息。如果对文本采用这些样式,使用*文本*表示粗体,_文本_表示下划线,^文本^表示斜体。

[No000094]SVN学习笔记4-版本库概念与部分日常操作

TortoiseSVN包含了一个拼写检查器帮助你正确地书写日志信息。对任何错误拼写的词都高亮显示。使用右键菜单可以获得修改建议。当然它不会知道所有的技术术语,所以有时一些拼写正确的词会被当作错误。但不用担心,你可以使用右键菜单将它们加入你的个人字典中。

日志消息窗口同时也含有文件名和函数自动完成的功能。它使用正则表达式从本次提交的(文本)文件中抽取类和函数的名称,以及被提交文件的文件名。如果你输入的单词与列表中的内容匹配(至少键入 3个字符,或者按 Crtl+空格键),就会显示一个下拉列表让你选择完整的名字。TortoiseSVN 支持的正则表达式位于 TortoiseSVN 安装文件夹下的 bin 文件夹中。你可以自定义匹配规则然后将其保存在文件 %APPDATA%\TortoiseSVN\autolist.txt 中。当然,在升级新版本的 TortoiseSVN 时你个人的自动匹配规则列表不会被覆盖。如果你不熟悉正则表达式,可以看一下介绍: http://zh.wikipedia.org/wiki/正则表达式,以及在线文档和教程: http://www.regular-expressions.info/。

写出正确的匹配规则有点棘手,所以为了帮你写出合适的表达式,我们提供了一个对话框,你可以输入表达式,然后输入文件名来做个测试。要启动该对话框,在命令提示符中输入这个命名:TortoiseProc.exe /command:autotexttest。

The log message window also includes a commit message snippet facility. These snippets

上一篇:LUA中将未分类数据分为测试集和训练集


下一篇:利用指针数组来存strtok函数切割出字符串的首地址