[No000098]SVN学习笔记5-分支,合并,属性,补丁,锁,分支图

时间:2022-10-06 15:53:18

行结束符和空白选项

在项目的生命周期中,有时可能会将行结束符由 CRLF 改为 LF,或者修改一段代码的缩进。不幸的是这样将会使大量的代码行被标记为已修改,尽管代码本身并没有被修改。这里列出的选项将会在比较差异

和应用补丁时帮助你应对这些修改。你将会在合并和追溯对话框中看到这些设置,它们同样也出现在TortoiseMerge 的设置中。

忽略行结束符 排除仅行结束符的差异。

比较空白 将所有缩进和行内空白差异视为增加/删除的行。

忽略空白修改 排除那些完全是针对空白数量或类型的修改,例如,修改缩进或者将 tab 改为空格。在原来没有空白的地方增加空白或删除全部空白仍然会显示为修改。

忽略所有空白 排除仅空白改变的差异。

自然的,任何已经修改内容的行永远都包含在差异中。

比较文件夹

当你在版本库浏览器中选择了两个树,或者在日志对话框中选择了一个文件夹的两个版本,就可以使用右键菜单 → 比较版本差异。(Context menu → Compare revisions.)

这个对话框显示一个所有已经修改的文件列表,允许你使用右键菜单单独的比较或追溯它们。

你可以导出修改树,当你需要将仅包含已修改文件的项目树结构发送给其它人的时候很有用。这个操作仅对选中的文件有效,所以需要选择你感兴趣的文件 - 通常这就意味着全部文件 - 然后使用右键菜单→ 导出选择项...(Context menu → Export selection to....)。然后会提示你选择目录保存修改树。

你也可以通过右键菜单 → 保存选择文件列表(Context menu → Save list of selected files to....)将修改过的文件列表导出为文本文件。

如果你需要导出文件列表和动作(修改,增加,删除),你可以使用右键菜单 → 复制到剪贴板。(Context menu → Copy selection to clipboard)

顶部的按钮允许你改变比较的方向。你可以显示从A到B的修改,或者如果你喜欢,显示从B到A的修改。

有版本数字的按钮可以用来改变版本范围。当你改变范围时,两个版本不同的项目列表会自动更新。

如果列表中的文件非常多,你可以使用查找框来筛选文件名中包含指定文字的文件,从而减少列表中的文件。注意这里使用的是简单文本查找,所以当你需要显示 C 语言源码的列表时,你应该输入.c 而不是 *.c。

使用 TortoiseIDiff 进行比较的图像Diffing Images Using TortoiseIDiff

我们有许多有用的比较文本文件的工具,包括我们自带的TortoiseMerge,但是我们也需要查看图像文件的更改。这就是我们设计TortoiseIDiff的原因。

[No000098]SVN学习笔记5-分支,合并,属性,补丁,锁,分支图

TortoiseSVN → 比较差异 会启动 TortoiseIDiff 显示常用格式的图像差异。一般情况下是左右对称地显示两个图像,但你也可以通过视图菜单或者工具栏切换为上下显示的模式,或者如果你愿意,也可以重叠显示图像。

当然你也可以放大和缩小,或者移动图像。你也可以简单的通过左键拖拽来移动图像。如果你选择链接图像位置,则移动控制(滑动条,鼠标滚轮)对两幅图像同时生效。

在图像信息框中显示了图像的基本信息,比如像素的大小,颜色的深度。如果觉得这个框碍眼可以选择视图 → 图像信息来隐藏它。当你的鼠标指针位于图像标题栏上方时,可以从工具提示中获得同样的信息。

当图像叠加时,图像的相对亮度(alpha 混合)由左边的滑杆控制。你可以点击滑杆的任意地方来设置混合参数,或者通过拖曳滑杆来交互改变。Ctrl+Shift-鼠标滚轮也可以改变混合参数。

滑杆上方的按钮可以切换 0% 和 100% 混合,如果你双击按钮,会每隔两秒钟自动切换,直到再次点击按钮为止。当查看多处小更改时,这个功能很有用。

有时你想要查看不同但不是混合图像。也许你有两个版本的印刷电路板图像文件,想查看哪些线条改变了。如果你关闭 alpha 混合模式,不同之处会以像素颜色值的或非(XOR)结果显示。未修改的区域是纯白色的,修改的部分则是彩色的。

比较Office文档

When you want to diff non-text documents you normally have to use the software used to create the document as it understands the file format. For the commonly used Microsoft Office and Open Office suites there is indeed some support for viewing differences and TortoiseSVN includes scripts to invoke these with the right settings when you diff files with the well-known file extensions. You can check which file extensions are supported and add your own by going to TortoiseSVN → Settings(TortoiseSVN → Settings) and clicking Advanced(Advanced) in the External Programs(External Programs ) section.

其他的比较/合并工具

如果我们提供的这些工具不是你所需要的,可以尝试使用一些其他开源的或者商业的软件。

添加新文件和目录

如果在你的开发过程中你创建了新的文件或目录,那么你需要把他们加入你的版本控制中。选择那个文件或目录并使用TortoiseSVN → 添加(Add).

当你添加了指定的文件/目录到版本控制系统之后,这个文件上会出现一个added标志,这意味着你得先提交你的工作副本使该文件/目录对其他开发者来说成为有效的。添加一个文件/目录不会not影响版本库

更多

你也可以在已经版本控制的文件夹上使用增加命令。那样的话,增加对话框会显示该版本控制文件夹中所有未版本控制的文件。如果你有许多新文件需要一起增加的话,这是很有帮助的。

你可以使用鼠标拖拽的方式从你的工作副本外部添加进文件。

1. 选择你要添加的文件

2. 用鼠标右键拖拽它们到工作副本的新位置

3. 松开鼠标右键

4. 选择右键菜单 → SVN 增加文件到工作副本(Context Menu → SVN Add files to this WC.)。这些文件会被复制到工作副本,加入版本控制。

你可以在工作副本中通过左拖,将文件放到提交对话框中,来增加文件。

如果你误增加了文件或文件夹,你可以在提交前撤销增加,使用TortoiseSVN → 撤销增加.(TortoiseSVN → Undo add....)

复制/移动/重命名文件和文件夹

It often happens that you already have the files you need in another project in your repository, and you simply want to copy them across. You could simply copy the files and add them, but that would not give you any history. And if you subsequently fix a bug in the original files, you can only merge the fix automatically if the new copy is related to the original in Subversion.

在工作副本中复制文件和目录的最简单的方法是使用右拖菜单。当你从一个工作副本右拖文件或目录到另一个工作副本,甚至是在同一个目录中,当你释放鼠标时,就会出现一个上下文菜单。现在你可以复制受版本控制的内容到新位置,可能同时有改名操作。

你也可以使用熟悉的剪切-粘贴方式在一个工作副本中或两个工作副本之间复制或移动版本控制的文件。使用标准的 Windows 复制 或 剪切来复制或移动版本控制的条目到剪贴板中。如果剪贴板中包含这样的版本控制的条目,就可以使用 TortoiseSVN → 粘贴(TortoiseSVN → Paste)(注意: 不是标准的 Windows 粘贴)来复制或移动这些条目到工作副本中的新位置。

你可以使用TortoiseSVN → 分支/标记(TortoiseSVN → Branch/Tag)将工作副本中的文件和文件夹复制到版本库中的另一个位置。

你可以直接在日志对话框中定位一个文件或文件夹的旧版本并使用右键菜单 → 从版本创建分支/标记(Context menu → Create branch/tag from revision)将其复制到版本库中的新位置。

你也可以使用版本库浏览器定位内容,并从版本库直接复制到你的工作副本中,或复制到版本库中的另一个位置。

不能在版本库之间复制

虽然可以在同一个版本库中复制或移动文件和文件夹,你却不能使用 TortoiseSVN 从一个版本库中复制或移动到另一个版本库并保留完整的历史。即使版本库在同一个服务器上也不可以。你能做的就是复制它当前的状态并以新内容的形式添加到第二个版本库中。

如果你不能确定位于同一个服务器上的两个 URL 指向相同的还是不同的版本库,使用版本库浏览器打开其中一个URL,并且找到版本库的根。如果你能在这一个版本库浏览器中看到那两个地址,那么它们就在同一个版本库中。

忽略文件和目录

在多数项目中你总会有文件和目录不需要进行版本控制。这可能包括一些由编译器生成的文件,*.obj,*.lst,或许是一个用于存放可执行程序的输出文件夹。只要你提交修改,TortoiseSVN 就会在提交对话框的文件列表中显示出未版本控制文件。当然你可以关闭这个显示,不过你可能会忘记添加新的源文件。

最好的避免类似问题的方法是添加参考文件到该项目的忽略列表。这样他们就永远不会出现在提交对话框中,而真正的未版本控制文件则仍然列出。

If you right click on a single unversioned file, and select the command TortoiseSVN → Add to Ignore List(TortoiseSVN → Add to Ignore List) from the context menu, a submenu appears allowing you to select just that file, or all files with the same extension. Both submenus also have a (recursively) equivalent. If you select multiple files, there is no submenu and you can only add those specific files/folders.

If you choose the (recursively) version of the ignore context menu(如果只是一个文件,有无recursively效果一样), the item will be ignored not just for the selected folder but all subfolders as well. However this requires SVN clients version 1.8 or higher.(点击recursively会将子文件夹中所有项目也给递归的忽略,非recursively的只忽略该根目录)

如果你想从忽略列表中移除一个或多个条目,右击这些条目,选择TortoiseSVN → 从忽略列表删除(TortoiseSVN → Remove from Ignore List)。你也可以直接存取目录的svn:ignore属性。它允许你使用文件匹配来指定多个模式,请注意每个忽略模式占一行,不支持使用空格分割。

全局忽略列表

另一个忽略文件的方法是添加这些文件到global ignore list .他们最大的不同是全局忽略列表是一个客户端特性。它会作用到 所有的(all)subversion 项目。但只能在pc客户端使用。在全局尽可能更好的使用svn:ignore特性,因为他能够应用到特殊的项目区域,并却他作用于所有检出该项目的人。

忽略已版本控制的条目

已版本控制的文件或目录不能够忽略,这是subversion的一个特性。

忽略列表中的模式匹配

Subversion 的忽略模式使用了文件匹配,一种原先在Unix系统中使用meta字符作为通配符的技术。下面的字符有着特殊的意思:

* 匹配任何字符串,包括空串(没有字符)

? 匹配任何单字符

[...] 匹配任何单在方括号[]内的单字符,在方括号内,一对字符被"-"分隔,匹配任何词汇表(lexically)上在他们中间的字符。例如[AGm-p]匹配任何单个的A,G,m,n,o或者p。模式匹配是大小写敏感的,这在 Windows 平台下会出问题。你可以使用成对的字符来强制忽略大小写。例如,忽略不记 *.tmp 的大小写,那么你可以使用像 *.[Tt][Mm][Pp] 这样的模式。

如果你想要一个官方定义的匹配规则。你可以在关于shell命令行语言的IEEE规范Pattern Matching Notation [http://www.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html#tag_02_13]中找到。

全局忽略列表中不要使用路径

不应该在模式中包含路径信息。模式匹配的目标是纯文本的文件名和文件夹名。如果你想忽略所有的 CVS 文件夹,只要向忽略列表中添加 CVS 即可。不再需要像在早先的版本中那样指定 CVS */CVS。如果你想忽略所有在 prog 文件夹下的 tmp 文件夹,但不忽略在doc 文件夹下的,你应该使用 svn:ignore 属性来替代。使用全局忽略模式不能可靠的完成这一目标。

删除、移动和改名

Subversion allows renaming and moving of files and folders. So there are menu entries for delete and rename in the TortoiseSVN submenu.

正在删除文件/文件夹

Use TortoiseSVN → Delete (TortoiseSVN → Delete)to remove files or folders from Subversion.

When you TortoiseSVN → Delete (TortoiseSVN → Delete)a file or folder, it is removed from your working copy immediately as well as being marked for deletion in the repository on next commit. The item's parent folder shows a "modified" icon overlay. Up until you commit the change, you can get the file back using TortoiseSVN → Revert (TortoiseSVN → Revert)on the parent folder.(通过父文件夹恢复被删除的文件)

如果你想从版本库删除项目,但是在本地作为非版本控制的文件/文件夹保留,可以使用 扩展右键菜单 → 删除(保留本地副本)(Extended Context Menu → Delete (keep local).)。为了看到扩展右键菜单,当你在文件管理器列表窗格(右窗格)中的项目上点击右键时,必须同时按下 Shift 键。

If an item is deleted via the explorer instead of using the TortoiseSVN context menu, the commit dialog shows those items as missing and lets you remove them from version control too before the commit. However, if you update your working copy, Subversion will spot the missing item and replace it with the latest version from the repository. If you need to delete a version-controlled file, always use TortoiseSVN → Delete so that Subversion doesn't have to guess what you really want to do.(建议不要通过Window直接删除文件,而通过svn右键菜单)

找回已删除的文件或目录

如果你删除了一个文件或目录并已经提交该删除操作到版本库,那么 一个常规的TortoiseSVN → 复原已不能再将其找回。但是该文件或目录并没有完全丢失。如果你知道该被删除文件或目录的版本(如果不能,使用日志对话框来查找出来),打开数据仓库的浏览器,并选择那个版本。然后选择你删除的文件或目录,右键并选择Context Menu → 复制到...作为目标执行复制操作,然后选择你的工作副本的路径。

移动文件和文件夹

如果你仅想重命名文件或文件夹,使用 右键菜单 → 改名... 为此条目输入新的名称就可以了。

如果你想在工作副本中移动文件,比如移动到一个不同的子文件夹下,那么使用鼠标右键拖拽:

1. 选择你要移动的文件或目录

2. 用鼠标右键拖拽它们到工作副本的新位置

3. 松开鼠标右键

4. 在弹出菜单选择右键菜单 → SVN 移动版本控制的条目到当前位置。(Context Menu → SVN Move versioned files here)

提交父目录

既然重命名和移动都是像添加之后跟随着删除一样被执行,你必需提交该重命名/移动文件的父文件夹,所以重命名/移动的删除部分将出现在提交对话框中。如果你不提交重命名/移动的已删除部分,他将保留在仓库中并且你的同组人更新工作副本时,该文件也不会被删除。例如,他们将有两个一老一新的副本。

你必须在重命名文件夹后立刻进行提交,在提交前不要更改文件夹下的任何文件,不然你的工作副本就会真的混淆。

另外一种复制或移动文件的方法是通过Windows 的复制/移动命令. 首先选择你需要复制的文件, 在资源管理器中右键点击并选择右键菜单 → 复制. 然后进入目标文件夹,右键点击并选择TortoiseSVN → 粘贴. 对于移动文件,选择 右键菜单 → 剪切而不是右键菜单 → 复制.

你也可以使用版本库浏览器在版本库中移动条目。

不要使用 SVN 移动外部连接

你不应该用 TortoiseSVN 的移动或改名命令作用在用 svn:externals 创建的目录上。因为这个动作可能会导致外部元素(item)从它的父版本库中删除,这可能会使其它人烦恼。如果你需要移动外部目录,你应该使用普通的外壳移动,然后调整源和目的之父目录的svn:externals 属性。

处理文件名称大小写冲突

万一在你的版本库中有两个名字相同但大小拼写不同(例如: TEST.TXT 和 test.txt)的文件,你是不能在 Windows 客户端更新或者检出该包含该文件的目录的。当 Subversion 支持大小写敏感的文件名时,Windows 不支持。

它偶尔在两个人在独立的工作副本提交时发生,文件名称相同,只有大小写不同。它也会在具有大小写敏感的文件系统的系统中提交文件时发生,例如 Linux。

如果是那样的话,你得决定在这个版本库里的哪一个文件是你想保留的,哪一个是要删除(或重命名)的

防止两个文件名字相同

这有一个有用的服务器端脚本在http://svn.collab.net/repos/svn/trunk/contrib/hook-scripts/将会防止检入拼写(大小写)冲突文件。

修复文件改名

有时候你的IDE会因为执行反射操作,改名文件,当然它不能告诉Subversion。如果你尝试提交修改,Subversion会发现丢失了老文件,新增了未版本控制的新文件。你可以简单的增加新文件,但是你将丢失历史记录,因为Subversion不知道这些文件的关系。

更好的方法是通知Subversion这实际上是改名,你可以在提交和检查修改对话框(Commit and Check for Modifications)中做此操作。简单选择老文件(丢失的)和新文件(未版本控制的),使用右键菜单 → 修复移动(Context Menu → Repair Move)设置这两个文件是改名关系。

删除未版本控制的文件

通常你可以在Subversion中设置自己的忽略列表,例如忽略所有产生的文件。但是你如何清理这些忽略的项目,从而产生一个干净的构建呢?通常你在makefile中清理,但是如果你在调试makefile,或者修改构建系统,那么有一个清理方法是极为有用的。

TortoiseSVN 提供了使用扩展上下文菜单 → 删除未版本控制的项目...(Extended Context Menu → Delete unversioned items....)来清理工作副本。你可以在目录上右键操作时,保持 Shift按下,就可以看到这个上下文菜单。它会出现一个对话框,列出工作副本中的所有未版本控制的文件。你可以选择或取消删除的项目。

当删除这些项目时,使用了垃圾箱。所以如果你犯了错误,删除了应该版本控制的文件,你仍旧可以恢复。

撤消更改

如果你想要撤消一个文件自上次更新后的所有的变更,你需要选择该文件, 右键点击弹出右键菜单,然后选择TortoiseSVN → SVN 还原(TortoiseSVN → Revert)命令,将会弹出一个对话框显示你已经变更并能恢复的文件。选择那些你想要恢复的然后按确定。

如果你想撤销删除或者更名操作,因为被删除的条目已经不存在了,你需要右键点击上一层文件夹来进行还原操作。

如果你想撤销增加条目,在右键菜单中选择 TortoiseSVN → 撤销增加。其实这就是还原操作,只是起了一个更显而易见的名字而已。

在这一对话框中,纵列和在 检查修改对话框中的纵列同样是可以定制的。

还原命令有时被用来清理工作副本,因此这里有一个额外的按钮,通过这个按钮你可以删除未版本控制的条目。当你点击这个按钮,会出现另一个对话框列出所有的未版本控制的条目,你可以选择需要删除的内容。

取消已经提交的改变

Revert仅能撤消你本地的变更。他不能撤消已经提交的的变更。

还原较慢

当你进行还原修改时,你会发现操作所花的时间比你预期的要长。这是因为修改过的文件被扔到回收站,所以当误还原时你可以找回更改后的文件。不管怎样,如果你的回收站已经满了,Windows 会花一些时间来找个地方放置文件。解决方案很简单: 或者清空回收站,或者在 TortoiseSVN 的设置中取消选中在恢复的时候使用垃圾箱。

清理

If a Subversion command cannot complete successfully, perhaps due to server problems, your working copy can be left in an inconsistent state. In that case you need to use TortoiseSVN → Cleanup on the folder. It is a good idea to do this at the top level of the working copy.

In the cleanup dialog, there are also other useful options to get the working copy into a clean state.

[No000098]SVN学习笔记5-分支,合并,属性,补丁,锁,分支图

Clean up working copy status清理工作副本状态

As stated above, this option tries to get an inconsistent working copy into a workable and usable state. This doesn't affect any data you have but only the internal states of the working copy database. This is the actual Cleanup command you know from older TortoiseSVN clients or other SVN clients.(对工作数据无影响)

Refresh shell overlays刷新壳覆盖图标

Sometimes the shell overlays, especially on the tree view on the left side of the explorer don't show the current status, or the status cache failed to recognize changes. In this situation, you can use this command to force a refresh.(更新状态图标)

Include externals包括外部项目

If this is checked, then all actions are done for all files and folders included with the svn:externals property as well.(引入外部所有的项目)

Delete unversioned files and folders, Delete ignored files and folders删除非版本控制的文件和文件夹,删除忽略了文件和文件夹

This is a fast and easy way to remove all generated files in your working copy. All files and folders that are not versioned are moved to the trash bin.(删除文件到回收站)

Note: you can also do the same from the TortoiseSVN → Revert (TortoiseSVN → Revert)dialog. There you also get a list of all the unversioned files and folders to select for removal.(也可以通过还原菜单获取无版本控制的文件)

Revert all changes recursively恢复所有递归更改

This command reverts all your local modifications which are not committed yet. (恢复所有更改到还未提交前)

Note: it's better to use the TortoiseSVN → Revert command instead, because there you can first see and select the files which you want to revert.(最好用TortoiseSVN → Revert替代该命令)

项目设置

Subversion 属性

你可以通过右键菜单 → 属性从 Windows 属性(Context menu → properties.)对话框来读写 Subversion 属性,这样也能得到TortoiseSVN 的状态列表。也可以从TortoiseSVN → 属性(TortoiseSVN → properties)来读写 Subversion 属性。

你可以添加你自己定义的属性,或者一些在 Subversion 中有特殊含义的属性。这些属性以 svn: 开头。svn:externals 就是这一类型的属性;

svn:keywords

Subversion 支持类似 CVS 的关键字扩展,用来在文件中嵌入文件名称和版本信息。当前支持的关键字有:

$Date$ 已知最后提交的日期。它基于你更新工作副本时获得的信息。它不检查版本库查找最新的修改。

$Revision$ 已知最后提交的版本。

$Author$ 已知最后提交的作者。

$HeadURL$ 此文件在版本库中的 URL。

$Id$ 上述四个关键字的压缩组合。

To find out how to use these keywords, look at the svn:keywords section [http://svnbook.red-bean.com/en/1.8/svn.advanced.props.special.keywords.html] in the Subversion book, which gives a full description of these keywords and how to enable and use them.

增加和编辑属性

[No000098]SVN学习笔记5-分支,合并,属性,补丁,锁,分支图

要添加一个新的属性,先点击新建... 。从菜单中选择需要的属性名称,然后在特定的属性对话框内填写所需的信息。

想添加没有自己的对话框的属性,从新建... 菜单中选择高级 。然后从组合框中选择已经存在的属性或者输入自定义的属性名称。

如果你想一次性设置许多文件的属性,在资源管理器中选择文件/文件夹,然后选择右键菜单 → 属性。

如果你想设置当前文件夹内的全部文件和文件夹,选中递归检查框。

如果你想编辑一个已有属性,在已有属性列表中选择它,然后单击编辑...即可。

如果你想删除已有属性,在已有属性列表中选择它,然后单击删除即可。

属性svn:externals可以用来下载位于同一版本库或不同版本库的其它工程。

编辑最新修订版本的属性

因为属性是受版本控制的,因此您不能编辑以前修订版本的属性。如果您从日志对话框或库浏览器中的无头部修订版本来查看属性(non-HEAD revision in the repository browser),您将会看到一个属性和值的列表,但没有编辑控件。

导出和导入属性

通常,你会发现你要设置同一组属性很多遍,例如 bugtraq:logregex。要想简单的完成从一个项目复制属性到另一个项目,你可以使用导出/导入特性。

在已经设置了属性的文件或文件上使用TortoiseSVN → 属性(TortoiseSVN → properties),选择你想要导出的属性并单击导出...(Export....)。然后会提示你输入文件名,属性名和属性值会保存在此文件中。

在你想要应用这些属性的文件夹上使用TortoiseSVN → 属性并单击导入...。然后会提示你选择从哪个文件导入,找到之前你保存导出文件的地方并选中它。属性会添加到文件夹,不递归。

如果你想递归的添加属性到目录树,按照上述的步骤,然后在属性对话框依次选中每一个需要递归的属性,单击编辑...,选中递归应用该属性并单击确定。

导入文件是二进制格式的,并且只被 TortoiseSVN 所使用。它唯一的用途是在导入和导出命令之间传递属性,所以不要编辑这些文件。

二进制属性

TortoiseSVN可以处理文件的二进制属性。使用保存...到文件读取二进制属性值。使用十六进制编辑器或其它适当的工具创建文件,然后用从文件加载...设置二进制值为此文件的内容。

尽管二进制文件不经常使用,它们在一些程序中是有用的。举例来说,如果你存储了巨大的图形文件,或者用程序加载的文件巨大,你可能想将缩略图作为属性存储,于是你可以快速的预览。

自动属性设置

你可以配置 Subversion 和 TortoiseSVN 在文件和文件夹添加到版本库时自动设置属性。这里有两种实现方法。

You can edit the Subversion configuration file to enable this feature on your client. The General page of TortoiseSVN's settings dialog has an edit button to take you there directly. The config file is a simple text file which controls some of Subversion's workings. You need to change two things: firstly in the section headed miscellany uncomment the line enable-auto-props = yes. (先取消注释符)Secondly you need to edit the section below to define which properties you want added to which file types. (给什么文件添加什么属性)This method is a standard Subversion feature and works with any Subversion client. However it has to be defined on each client individually - there is no way to propagate these settings from the repository.(但是只针对本地有效,每个svn客户端都要这样设置)

另一个办法是在文件夹上设置 tsvn:autoprops 属性,将会在下一节详细描述。这个方法仅对TortoiseSVN 客户端有效,但是它可以在更新时应用于所有的工作副本。

As of Subversion 1.8, you can also set the property svn:auto-props on the root folder. The property value is automatically inherited by all child items.

无论您选择哪种方法,您应该注意 Auto-props 仅应用于本次被添加到工作副本的那些文件。Auto-props 将决不会更改已受版本控制的文件的属性。

如果你想确保所有的新文件设置了正确的属性,你应该设置版本库的 pre-commit 钩子脚本来拒绝那些没有设置必要属性的提交。

提交属性 Subversion 属性是受版本控制的。在你改变或增加属性后必须提交。

属性冲突 如果因为其他用户已经提交了同样的属性,提交时出现冲突,Subversion 会产生一个.prej 文件。在你解决冲突后,请删除此文件。

TortoiseSVN 项目属性

TortoiseSVN 有自己专用的几个属性,它们都有tsvn:前缀。

• tsvn:logminsize设置提交日志的最小长度。如果你输入的日志短于预设值,提交会被禁止。这个属性对于提醒你为每次提交提供一个适当的描述信息非常有用。如果不设置这个属性,或者设置为0,那么就允许空提交信息。

tsvn:lockmsgminsize设置锁定日志的最小长度。如果你输入的日志短于预设值,加锁会被禁止。这个属性对于提醒你为每次加锁提供一个适当的描述信息非常有用。如果不设置这个属性,或者设置为0,那么就允许空加锁信息。

• tsvn:logwidthmarker用在要求日志信息被格式化为在最大宽度(典型是80字符)处换行非常有用。设置此属性为大于0的值会在日志消息对话框中做两件事: 放置一个标记指示最大宽度,和禁止自动换行,于是你可以看到输入的信息是否太长。注意: 这个特性仅在你选择的消息使用固定宽度字体时才能正确工作。

• tsvn:logtemplate在需要定义日志消息格式化规则的工程中使用。在你开始提交时,这个属性的多行消息会被插入日志消息编辑框。你可以编辑它以便包含需要的信息。注意: 如果你使用了tsvn:logminsize属性,请确认这个长度大于模版的长度,不然就会失去其保护作用。也会有一些可替代 tsvn:logtemplate 的操作特定模板以供使用。这些特定模板被设置后即可使用,但如果没有设置任何特定模板,则将会使用 tsvn:logtemplate。

这些操作特定模板是:

• tsvn:logtemplatecommit 用于所有来自工作副本的提交。

• tsvn:logtemplatebranch 用于在您创建分支/标记或直接在版本库浏览器中复制文件或文件夹时。

• tsvn:logtemplateimport 用于导入。

• tsvn:logtemplatedelete 用于直接在版本库浏览中删除项目时。

• tsvn:logtemplatemove 用于在版本库浏览器中重命名或移动项目时。

• tsvn:logtemplatemkdir 用于在版本库浏览中创建目录时。

• tsvn:logtemplatepropset 用于在版本库浏览器中修改属性时。(in the repository browser)

• tsvn:logtemplatelock 用于获取一个锁定。

Subversion allows you to set "autoprops" which will be applied to newly added or imported files,(autoprops只对后面添加的文件有效) based on the file extension. This depends on every client having set appropriate autoprops in their Subversion configuration file(各个SVN客户端设置可以不同). tsvn:autoprops can be set on folders and these will be merged with the user's local autoprops when importing or adding files. (tsvn:autoprops与autoprops规则会合并)The format is the same as for Subversion autoprops, e.g. *.sh = svn:eol-style=native;svn:executable sets two properties on files with the .sh extension.

如果本地 autoprops 与 tsvn:autoprops 冲突,项目设置优先(project settings)(因为它们是针对此项目的)。

As of Subversion 1.8(1.8版本以上的), you should use the property svn:auto-props instead of tsvn:autoprops since this has the very same functionality but works with all svn clients and is not specific to TortoiseSVN.(建议用svn:auto-props替代tsvn:autoprops,以便所有SVN客户端有同样的自动属性)

在提交对话框,你可以粘贴修改的文件列表,包含每个文件的状态(增加,修改等)。tsvn:logfilelistenglish定义了文件状态用英文插入,还是用本机语言插入。如果此属性没有设置,默认值是 true。(默认用英语提交状态)

TortoiseSVN可以使用OpenOffice和Mozilla使用的拼写检查模块。如果你安装了这些模块,那么这个属性将检测使用哪个拼写检查模块。也就是,你的项目的日志信息用的语言。tsvn:projectlanguage设置拼写检查引擎在你输入日志消息的时候应该使用什么语言模块。你可以在这个页面找到你的语言的取值: MSDN: 语言标示符 [http://msdn2.microsoft.com/en-us/library/ms776260.aspx]。

你可以用十进制输入取值,如果用0x前缀的话,也可以用十六进制。例如英语(美国英语)可以输入0x0409或者1033。

属性 tsvn:logsummary 用于摘录日志的一部分,在日志对话框中显示为日志摘要。

属性 tsvn:logsummary 的值必须设置为一行包含一个正则组的正则字符串。匹配于这个正则组的任何内容被当作摘要。例如: \[SUMMARY\]:\s+(.*) 将会抓取 "[SUMMARY]" 后面的所有内容并将其用作摘要。

属性 tsvn:logrevregex 定义了一个正则表达式,它匹配日志消息中的对版本号的引文。它的用处是,在日志对话框中,将这样的版本号变成链接,当点击链接的时候滚动到这一版本(如果此版本已经显示在日志对话框中被显示出来,或者它在日志缓存中)或者打开一个新的日志对话框显示那个版本。

正则表达式必须匹配整个引文,而不仅仅是版本号。版本号可以自动的从匹配的引文字符串中提取出来。如果这个属性没有设置,一个默认的正则表达式被用来链接版本引文。

There are several properties available to configure client-side hook scripts. Each property is for one specific hook script type. The available properties/hook-scripts are

• tsvn:startcommithook

• tsvn:precommithook

• tsvn:postcommithook

• tsvn:startupdatehook

• tsvn:preupdatehook

• tsvn:postupdatehook

The parameters are the same as if you would configure the hook scripts in the settings dialog.

Since not every user has his or her working copy checked out at the same location with the same name, you can configure a script/tool to execute that resides in your working copy by specifying the URL in the repository instead, using %REPOROOT% as the part of the URL to the repository root. For example, if your hook script is in your working copy under contrib/hook-scripts/client-side/checkyear.js, you would specify the path to the script as %REPOROOT%/trunk/contrib/hook-scripts/client-side/checkyear.js. This way even if you move your repository to another server you do not have to adjust the hook script properties. Instead of %REPOROOT% you can also specify %REPOROOT+%. The + is used to insert any number of folder paths necessary to find the script. This is useful if you want to specify your script so that if you create a branch the script is still found even though the url of the working copy is now different. Using the example above, you would specify the path to the script as %REPOROOT+%/contrib/hook-scripts/client-side/checkyear.js.(统一提交路径)

当你想增加新属性时,你可以从组合框的下拉列表选取,也可以输入你喜欢的任何属性名称。如果你的项目使用了自定义属性,并且想让这些属性出现在组合框的下拉列表中(避免输入时拼写错误),你可以使用tsvn:userfileproperties和tsvn:userdirproperties创建自定义属性列表。对目录应用这些属性,当你编辑其任何子项属性时,你自定义的属性将会在预定义属性名称列表中出现。

You can also specify whether a custom dialog is used to add/edit your property. TortoiseSVN offers four different dialog, depending on the type of your property.

Bool If your property can only have two states, e.g., true and false, then you can configure your property as a bool type. propertyname=bool;labeltext(YESVALUE;NOVALUE;Checkboxtext)(二选一)

State If your property represents one of many possible states, e.g., yes, no, maybe, then you can configure your property as a state(单选)property like this: propertyname=state;labeltext(DEFVAL;VAL1;TEXT1;VAL2;TEXT2;VAL3;TEXT3;...)

Singleline For properties that consist of one line of text, use the singleline property type: propertyname=singleline;labeltext(regex) the regex specifies a regular expression which is used to validate (match) the text the user entered. If the text does not match the regex, then the user is shown an error and the property isn't set.(单行文本)

Multiline For properties that consist of multiple lines of text, use the multiline property type: propertyname=multiline;labeltext(regex) the regex specifies a regular expression which is used to validate (match) the text the user entered. Don't forget to include the newline (\n) character in the regex!(多行)

TortoiseSVN 可以与一些 BUG 跟踪工具集成。它使用 bugtraq: 开始的项目属性。它也与一些基于 WEB 的版本库浏览器集成,使用 webviewer: 开始的项目属性。

设置文件夹的项目属性

为了让系统更好的工作,某些特别的项目属性必须保存在 文件夹中。 当你使用了TortoiseSVN 命令调用这些属性,属性值就从选中的文件夹读取出来。如果在文件夹中找不到属性值, TortoiseSVN 会沿着文件夹树一直向上搜索,直到出现未版本化的 文件夹或者到达根目录 (例如: C:\) 。 如果您可以肯定每个用户都是只从类似 trunk/的位置签出代码,而且没什么子目录, 那么只需要设置属性在 trunk/上就够了。 假如你并不确定,那就需要在每个子目录都设置属性。 如果你给每个目录设置了相同的属性但是不同的项目角色又要使用不同的值,那么从不同的目录签出的时候,会得到不同的结果。

对于tsvn:属性,例如 tsvn:,bugtraq: 和 webviewer:,你只能对于所有子文件夹使用递归复选框设置属性,不用将这些属性设置在文件上。当你使用TortoiseSVN在工作副本中新建一个子目录, 上层目录的所有项目属性都会自动的被继承。.

限制使用代码库浏览器

远程获取项目属性是一项很耗时的操作,因此上面描述的某些功能查看工作副本时是没有问题的,但在浏览库的时候不一定会显示。

• 当你使用版本库浏览器添加一个属性时,在预定义列表中只会提供标准的 svn: 属性。任何其他的属性名称都必须手动输入。

• 属性不能设置或删除递归使用回购浏览器。Properties cannot be set or deleted recursively using the repo browser.

• 当使用版本库浏览器添加一个新的子文件夹时,项目属性将 不会 被自动传递到子文件夹。

• 当使用版本库浏览器添加文件时,tsvn:autoprops 将 不会 给这些添加的文件设定属性。

尽管 TortoiseSVN 的项目属性很有用,但它们只适用于 TortoiseSVN,而且一些只是对于新版本的 TortoiseSVN 才生效。如果你的项目中的人使用各种 Subversion 客户端,或者使用低版本的 TortoiseSVN,你可能要使用版本库钩子强制执行项目策略。项目属性只能帮助你实现策略,不能强制执行。

属性编辑器

有些属性必须使用特定的值或以某种特定的方式进行格式化,以便能被自动使用。为了帮助正确地进行格式化,TortoiseSVN 为某些显示可能值或将属性分解给它的单独组件的特殊属性提供了编辑对话框。

外部条目External Content

svn:外部 属性可用于从同一版本库或一个完全不同的版本库中引入其他项目。svn:externals

You need to define the name of the sub-folder that the external folder is checked out as, and the Subversion URL of the external item. You can check out an external at its HEAD revision, so when the external item changes in the repository, your working copy will receive those changes on update. However, if you want the external to reference a particular stable point then you can specify the specific revision to use. IN this case you may also want to specify the same revision as a peg revision. If the external item is renamed at some point in the future then Subversion will not be able to update this item in your working copy. By specifying a peg revision you tell Subversion to look for an item that had that name at the peg revision rather than at HEAD.

The button Find HEAD-Revision fetches the HEAD revision of every external URL and shows that HEAD revision in the rightmost column. After the HEAD revision is known, a simple right click on an external gives you the command to peg the selected externals to their explicit HEAD revision. In case the HEAD revision is not known yet, the right click command will fetch the HEAD revision first.

SVN 关键字SVN Keywords

选择你想要在文件中被扩展的关键字。

EOL 样式EOL Style

选择您想使用的并且 TortoiseSVN 会使用正确属性值的行结束样式。

问题跟踪器集成Issue Tracker Integration

tsvn:bugtraq 属性页,

日志消息大小

These 3 properties control the formatting of log messages. The first 2 disable the OK in the commit or lock dialogs until the message meets the minimum length. The border position shows a marker at the given column width as a guide for projects which have width limits on their log messages. Setting a value to zero will delete the property. 日志信息属性页的大小

项目语言

Choose the language to use for spell-checking log messages in the commit dialog. The file lists checkbox comes into effect when you right click in the log message pane and select Paste file list. By default the Subversion status will be shown in your local language. When this box is checked the status is always given in English, for projects which require English-only log messages.

MIME 类型

svn:mime-type 属性页

svn:needs-lock

此属性只是简单地控制一个文件是否要被检出为只读,如果没有在工作副本中锁定它。

svn:executable

该属性控制一个文件在 Unix/Linux 系统上检出时是否将被给予可执行状态。在 Windows 签出时则没有任何影响。

Merge log message templates

Whenever revisions are merged into a working copy, TortoiseSVN generates a log message from all the merged revisions. Those are then available from the Recent Messages button in the commit dialog.

You can customize that generated message with the following properties:

tsvn:mergelogtemplatetitle, tsvn:mergelogtemplatereversetitle

This property specifies the first part of the generated log message. The following keywords can be used:

{revisions} A comma separated list of the merged revisions, e.g., 3, 5, 6, 7

{revisionsr} Like {revisions}, but with each revision preceded with an r, e.g., r3, r5, r6, r7

{revrange} A comma separated list of the merged revisions, grouped into ranges if possible,e.g., 3, 5-7

{mergeurl} The source URL of the merge, i.e., where the revisions are merged from.

The default value for this string is Merged revision(s) {revrange} from {mergeurl}: with a newline at the end.

tsvn:mergelogtemplatemsg This property specifies how the text for each merged revision should look like. The following keywords can be used:

{msg} The log message of the merged revision, as it was entered.

{msgoneline} Like {msg}, but all newlines are replaced with a space, so that the whole log message appears on one single line.

{author} The author of the merged revision.

{rev} The merged revision itself.

{bugids} The bug IDs of the merged revision, if there are any.

tsvn:mergelogtemplatemsgtitlebottom

This property specifies the position of the title string specified with the tsvn:mergelogtemplatetitle or tsvn:mergelogtemplatereversetitle. If the property is set to yes or true, then the title string is appended at the bottom instead of the top.

This only works if the merged revisions are already in the log cache. If you have disabled the log cache or not shown the log first before the merge, the generated message won't contain any information about the merged revisions.

外部条目External Items

有时候,构建一个需要不同检出的工作目录是很有用的。举例来说,你也许需要来自版本库的不同位置的别的文件或子目录,或者可能完全来自不同的版本库。如果你需要每个用户具有相同的目录结构,你可以定义 svn:externals 属性来获取特定的资源到你需要的地方。

外部文件夹

URLs 必须正确转义否则将不会工作,例如必须将每个空格替换为 %20。

如果外部项目位于同一版本库,当你提交你的主要项目时,你在这儿所做的任何更改都将包含在提交列表中。

如果外部工程位于不同的版本库,当你向主项目提交你的修改时,你对外部工程做的修改会被通报,但是你必须单独的提交这些外部工程的修改。

如果你在 svn:externals 定义中使用绝对 URL 并且你不得不重定位你的工作副本(例如,版本库的 URL改变了),然后你的外部定义并不会改变,它可能就失效了。

外部文件

Creating externals via drag and drop

If you already have a working copy of the files or folders you want to include as externals in another working copy, you can simply add those via drag and drop from the windows explorer. Simply right drag the file or folder from one working copy to where you want those to be included as externals. A context menu appears when you release the mouse button: SVN Add as externals here if you click on that context menu entry, the svn:externals property is automatically added. All you have to do after that is commit the property changes and update to get those externals properly included in your working copy.

分支/标记

版本控制系统的一个特性是能够把各种修改分离出来放在一个单独的开发线上。这条线被称为分支。分支经常被用来试验新的特性,而不会干扰正在修改编译器错误和 bug 的主开发线。当新的特性足够稳定之后,开发分支就可以合并回主分支里(主干).

版本控制系统的另一个特性是能够标记特殊的版本(例如一个发布版本),所以你可以在任何时候重新建立一个特定的构建或环境。这个过程被称作标记。

Subversion 没有用于建立分支和标记的特殊命令,但是使用所谓的便宜复制来代替。便宜复制类似于Unix 里的硬连接,它意思是代替一个版本库里的完整的复制,创建一个内部的链接,指向一个具体的版本树。结果分支和标记迅速被创建,并且几乎没有在版本库里占据任何额外的空间。

创建一个分支或标记

如果你用推荐的目录结构导入了一个工程,那么创建分支或标记就非常简单: 在你当前的工作副本中选择你想要复制的分支或标记的目录,然后选择命令TortoiseSVN → 分支/标记...。(TortoiseSVN → Branch/Tag....)

The default destination URL for the new branch will be the source URL on which your working copy is based. You will need to edit that URL to the new path for your branch/tag. So instead of http://svn.collab.net/repos/ProjectName/trunk you might now use something like http://svn.collab.net/repos/ProjectName/tags/Release_1.10 If you can't remember the naming convention you used last time, click the button on the right to open the repository browser so you can view the existing repository structure.

When you specify the target URL, all the folders up to the last one must already exist or you will get an error message. However if you want to create a branch/tag to an URL that has intermediate folders that don't exist yet you can check the option Create intermediate folders at the bottom of the dialog. If that option is activated, all intermediate folders are automatically created.要在新地方创建分支,如果创建分支的路径已经存在,则创建失败。

现在你需要选择从哪里复制。这里你有三个选择:

版本库中的最新版本 新的分支从最新版本复制到版本库中。没有数据需要从你的工作副本传递到版本库,而且分支非常迅速的被创建。

版本库中指定的版本 新的分支从你选选择的旧版本复制到版本库中。当你忘记为上一周发布的项目创建标记时,这就很有用了。如果你不记得版本号,点击右边的按钮来显示版本日志,然后从中选择版本号。也没有数据需要从你的工作副本传递到版本库,而且分支非常迅速的被创建。

工作副本 新的分支是与你本地工作副本一模一样的副本。如果你将工作副本中某些文件更新到某个早先的版本,或者你进行了本地修改,这些正是要进入副本的。当然,这些繁多的标记会作为传输数据从你的工作副本送回版本库,如果它们不存在于版本库中。

如果想要将工作副本自动切换到新创建分支,选中切换工作副本至新分支/标记复选框。但是如果你要这样做,首先确认你的工作副本中不包含修改。如果有,这些修改将会在你切换时合并到分支的工作副本中。

If your working copy has other projects included with svn:externals properties, those externals will be listed at the bottom of the branch/tag dialog. For each external, the target path and the source URL is shown.

If you want to make sure that the new tag always is in a consistent state, check all the externals to have their revisions pinned. If you don't check the externals and those externals point to a HEAD revision which might change in the future, checking out the new tag will check out that HEAD revision of the external and your tag might not compile anymore. So it's always a good idea to set the externals to an explicit revision when creating a tag. The externals are automatically pinned to either the current HEAD revision or the working copy BASE revision, depending on the source of the branch/tag:

Copy Source

Pinned Revision

版本库中的最新版本

external's repos HEAD revision

指定版本库中的版本

external's repos HEAD revision

工作副本

external's WC BASE revision

externals within externals

If a project that is included as an external has itself included externals, then those will not be tagged! Only externals that are direct children can be tagged. 外部项目包含的外部项目不会被包含。

按下确认提交新副本到版本库中。别忘了提供一条日志信息。需要注意的是这个副本是在版本库内部创建的。需要注意除非你决定切换工作副本到新创建分支,建立一个分支或标记不会影响你的工作副本。即使你从工作副本创建分支,这些修改也会提交到新分支里,而不是到主干里,所以你的工作副本可能仍然标记为已修改状态来避免影响主干。

创建分支或标记的其他方法

你可以在没有工作副本的情况下创建分支或标记。要这样做,打开版本库浏览器。你可以拖拽文件夹到新的位置。要创建副本,你必须在拖拽过程中按下 Ctrl 键,否则文件夹是被移动,不是被复制。

你可以使用鼠标右键拖拽文件夹。一旦你松开鼠标右键,你可以从右键菜单中选择移动或复制文件夹。当然,要创建分支或标记你必须复制文件夹,而不是移动它。

还有一个方法就是从日志对话框。你可以显示某个文件夹,例如 trunk,的日志对话框,选择一个版本(可以是位于顶端的最新版本,也可以是先前的版本),右键单击并选择从版本创建分支/标记。

检出或者切换

...这是个小问题。当从版本库中预期的分支检出所有数据到你的工作副本目录时,TortoiseSVN → 切换...(TortoiseSVN → Switch...) 仅仅传输已经被修改的数据到你的工作副本中。有利于减轻网络负担,也有利于你的耐心。 :-)

为了能够使用你最新产生的副本或标记,你可以采用下面几种方法。你可以:

• TortoiseSVN → 检出(TortoiseSVN → Checkout)一个最新的工作副本在一个空目录下。你可以在你的本地磁盘上的任意位置进行检出操作,同时你可以从版本库中按照你的意愿建立出任意数量的工作副本。

• 将你当前的工作副本切换到在版本库中新建立的副本。再一次选择你的项目所处的*文件夹然后在右键菜单中使用TortoiseSVN → 切换...。(TortoiseSVN → Switch...)

在接下来的对话框中输入你刚才建立的分支的 URL。选择最新版本单选按钮然后确认。你的工作副本就切换到了最新的分支/标记。

切换操作起来就象更新,因为它没有丢弃你在本地做的修改。当你进行切换的时候,工作副本里任何没有提交过的修改都会被合并。如果你不想看到这样的结果,那么你可以有两种选择,要么在切换前提交修改,要么把工作副本恢复到一个已经提交过的版本(通常是最新版本)。

• 如果你需要在主干和分支上工作,但是又不想耗费资源来进行一个全新的检出操作,你可以使用Windows 资源管理器来将你的主干工作副本复制到另一个文件夹,然后使用TortoiseSVN → 切换...( TortoiseSVN → Switch...)这样就会复制新的分支。

尽管 Subversion 本身不区分标记和分支,但它们通常被应用的场合还是有些不同。

• 标记被用来建立一个项目在某个特殊的阶段的静态映像。通常情况下他们本不是用来进行开发的 -分支是用来进行开发的,这就是我们推荐 /trunk /branches /tags 这样的版本库结构的原因。在标记上工作并不是一个好想法,因为你的本地文件没有写保护,没有什么办法防止你误操作。然而,如

果你试着提交一个包含 /tags/ 的路径到版本库,TortoiseSVN 会警告你。

• 如果你需要在一个已经标记的发布版上做更多的修改。正确的操作方法是先从标记处建立一个新分支然后提交这个分支。在这个分支的基础上进行修改后再从这个新分支上建立一个新标记,例如Version_1.0.1。

• 如果你修改了一个从分支建立的工作副本然后又提交了这个副本,那么所有的修改会转到一个新分支里而不是 主干。仅仅是存储了修改的数据。其余的数据还是便宜复制。

合并

分支用来维护独立的开发支线,在一些阶段,你可能需要将分支上的修改合并到主干,或者相反。

下一个需要注意的地方是,合并总是在工作副本中进行。如果你想要合并修改到分支,你必须检出该分支的工作副本,并且从这个工作副本使用TortoiseSVN → 合并...( TortoiseSVN → Merge....)来调用合并向导。

通常来说,在没有修改的工作副本上执行合并是一个好想法。如果你在工作副本上做了修改,请先提交。如果合并没有按照你的想法执行,你可能需要撤销这些修改,命令SVN 还原 会丢弃包含你执行合并之前的所有修改。

这里有三个处理方法稍微不同的用例,如下所述。合并向导的第一页会让你选择你需要的方法。

合并一个版本范围

这个方法覆盖了你已经在分支(或者主干)上做出了一个或多个修改,并且你想将这些修改应用到不同分支的情况。

What you are asking Subversion to do is this: " Calculate the changes necessary to get [FROM] revision 1 of branch A [TO] revision 7 of branch A, and apply those changes to my working copy (of trunk or branch B). "

If you leave the revision range empty, Subversion uses the merge-tracking features to calculate the correct revision range to use. This is known as a reintegrate or automatic merge.

合并两个不同的树

This is a more general case of the reintegrate method. What you are asking Subversion to do is: " Calculate the changes necessary to get [FROM] the head revision of the trunk [TO] the head revision of the branch, and apply those changes to my working copy (of the trunk). " The net result is that trunk now looks exactly like the branch.

If your server/repository does not support merge-tracking then this is the only way to merge a branch back to trunk. Another use case occurs when you are using vendor branches and you need to merge the changes following a new vendor drop into your trunk code.( vendor 放的都是框架核心代码)

合并指定版本范围

[No000098]SVN学习笔记5-分支,合并,属性,补丁,锁,分支图

在从:文本框中输入分支或标记文件夹的完整 URL,它包含了你想应用到工作副本的修改。你也可以点击...浏览版本库,找到想要的分支。如果你以前已经从这个分支合并过,可以直接从包含历史的下拉列表选择以前使用的 URL。

If you are merging from a renamed or deleted branch then you will have to go back to a revision where that branch still existed. In this case you will also need to specify that revision as a peg revision in the range of revisions being merged (see below), otherwise the merge will fail when it can't find that path at HEAD.(如果分支被重命名或删除了,合并会失败)

在待合并的版本范围文本框中输入你想合并的版本列表。它可以是单一版本,用逗号隔开的指定版本列表,或用横线(-)连接的版本范围,或这些形式的组合。

If you need to specify a peg revision for the merge, add the peg revision at the end of the revisions, e.g. 5-7,10@3. In the above example, the revisions 5,6,7 and 10 would be merged, with 3 being the peg revision.

在 TortoiseSVN 中指定版本范围的方法与命令行客户端大相径庭。用最简单的方法来说明这一点,设想一条栅栏,有支撑柱和栅栏板。

在命令行客户端,你使用两个"支撑柱"版本来指定需要合并的修改,这两个版本指明了修改前和修改后的点。

在 TortoiseSVN,你使用"栅栏板"来指定要合并的修改集。当你使用日志对话框来选择需要合并的版本时这样做的原因就很清晰,每个版本看上去就是一个修改集。

If you are merging revisions in chunks(大块的合并), the method shown in the Subversion book will have you merge 100-200 this time and 200-300 next time. With TortoiseSVN you would merge 100-200 this time and 201-300 next time.这个区别在邮件列表中引起了热烈的讨论。我们知道它与命令行客户端不同,但是我们相信,对于大多数的图形界面用户来说,我们制定的方法更容易理解。选择版本范围最简单的方法是,点击显示日志,列出最近的修改和日志。如果你要合并单个版本的修改,直接选取那个版本。如果你要合并多个版本,就选择范围(使用通常的Shift键)。点击确认,就会为你填写要合并的版本号列表。如果您要将更改往回合并 出 您的工作副本,以还原一个已提交的更改,选择要还原的版本并确保选中了 反向合并 框。Reverse merge

如果你已经从这个分支合并了一些修改,希望你在提交日志中注明最后一个合并的版本号。这时,你可以在工作副本上使用显示日志对话框跟踪日志。记住,我们将版本号视作修改集,你应该使用最后合并的版本之后的版本作为本次合并的开始版本。例如,上次你已经合并了版本37到39,那么本次合并你应该从版本40开始。

如果你在使用 Subversion 的合并跟踪特性,你就不需要记住已经合并了那些版本 - Subversion 将会帮你记录。如果不填写版本范围,所有未合并的版本将被选中。

When merge tracking is used, the log dialog will show previously merged revisions, and revisions pre-dating the common ancestor point, i.e. before the branch was copied, as greyed out. The Hide non-mergeable revisions checkbox allows you to filter out these revisions completely so you see only the revisions which can be merged.

如果其他用户可能提交,那么要小心使用最新版本。如果有人在你最近更新之后提交了,它指代的版本可能就不是你想的那样了。

If you leave the range of revisions empty or have the radio button all revisions(all revisions checked) checked, then Subversion merges all not-yet merged revisions. This is known as a reintegrate or automatic merge.

reintegrate merge. 重新合并需要满足一些条件。首先,服务器必须支持合并跟踪。工作副本必须为完全递归 (不是有限的检出深度),而且它不能具有任何本地修改、交换项目或已更新为最新版本之外的其他版本的项目。分支开发过程中的所有主干更改必须已合并到分支 (或标记为已合并)。要合并的版本范围将自动被计算。点击下一页跳转到"合并选项"

合并两个不同的目录树

[No000098]SVN学习笔记5-分支,合并,属性,补丁,锁,分支图

如果您正使用此方法将一个特性分支feature branch合并回主干,你需要从一个主干工作副本内启动合并向导start the merge wizard from within a working copy of trunk。

在 起始From:: 区域输入 主干 的完整文件夹地址。field enter the full folder URL of the trunk.这听起来像是错了,但请记住主干是要添加分支更改的起始点。trunk is the start point to which you want to add the branch changes.你也可以点击 ... 浏览版本库。

在到In the To::域输入关注的分支中文件夹的全路径。full folder URL of the feature branch

在开始版本和结束版本 域In both the From Revision field and the To Revision field,输入两个树被同步的最后一个版本号。如果你确信没有其他人提交,两个都可是输入 HEAD。如果在同步时可能有人提交的话,使用清楚的版本号以便面丢失最新提交。也可以使用 显示日志 选择版本。Show Log to select the revision

合并选项Merge Options

此向导页可以指定合并进程开始前的高级选项。一般情况下你可以直接使用默认设置。您可以指定合并深度,depth to use for the merge也就是到工作副本的合并程度。默认深度是 工作副本,使用现有的深度设置,并且几乎能满足所需。

[No000098]SVN学习笔记5-分支,合并,属性,补丁,锁,分支图

Most of the time you want merge to take account of the file's history,有时候你只想合并某个账户下的文件历史 so that changes relative to a common ancestor are merged. Sometimes you may need to merge files which are perhaps related, but not in your repository. For example you may have imported versions 1 and 2 of a third party library into two separate directories. Although they are logically related, Subversion has no knowledge of this because it only sees the tarballs you imported. If you attempt to merge the difference between these two trees you would see a complete removal followed by a complete add. To make Subversion use only path-based differences rather than history-based differences, check the Ignore ancestry box. 设置Ignore ancestry 使得Subversion只利用仅基于路径的差异,而不是基于历史差异Read more about this topic in the Subversion book,Noticing or Ignoring Ancestry [http://svnbook.red-bean.com/en/1.8/svn.branchmerge.advanced.html#svn.branchmerge.advanced.ancestry].

您可以指定处理行结束和空白变化的方式。默认情况是把所有的空白和行结束差异当做将被合并的真实更改。The default behaviour is to treat all whitespace and line-end differences as real changes to be merged.

标记为 强制合并 的复选框用于避免树冲突,传入的删除操作会影响到本地修改或不受版本控制的文件。如果删除了该文件,则无法恢复,这就是为什么在默认情况下未选中该选项。

如果您正在使用合并跟踪并且要将一个版本标记为已合并,而实际上并没有执行合并,那么就选中 只记录合并 复选框。您这样做可能有两个原因。合并过于复杂,合并算法表示压力很大,因此您选择手动更改代码,然后将更改标记为已合并,以便于合并跟踪算法也能识别到。或者您可能想要防止某个特定版本被合并,将其标记为已合并就可以用合并跟踪识别客户端来阻止合并的发生。

现在一切就绪,你要做的就是点击 合并 按钮。如果想要预览结果,测试合并Test Merge 可以模拟合并操作,但完全 不会 修改工作副本。它会显示一份会被真正合并的文件列表,并通告那些 可能 发生冲突的文件。因为合并跟踪会使合并过程变得更为复杂,没有任何方法可以事先保证完成合并时是否会出现冲突,所以在测试合并中标记为冲突的文件可能在实际的合并中并不会出现任何问题。

The merge progress dialog shows each stage of the merge, with the revision ranges involved. This may indicate one more revision than you were expecting. For example if you asked to merge revision 123 the progress dialog will report " Merging revisions 122 through 123 ". To understand this you need to remember that Merge is closely related to Diff. The merge process works by generating a list of differences between two points in the repository, and applying those differences to your working copy. The progress dialog is simply showing the start and end points for the diff.

预览合并结果

现在已完成合并。查看合并是否按预期完成是个不错的主意。合并通常是相当复杂的。如果分支跟主干偏差太大,往往会出现冲突。

Whenever revisions are merged into a working copy, TortoiseSVN generates a log message from all the merged revisions. Those are then available from the Recent Messages button in the commit dialog. To customize that generated message, set the corresponding project properties on your working copy.

合并日志是自动生成的,可以更改属性设置

分支管理很重要。如果你要保持这个分支与最新版本同步,你应当经常合并,这样分支和最新版本的差别就不会太大。当然,你仍旧应该遵循上面的说明,避免重复合并修改。如果你刚刚将一个特性分支合并到主干,那么主干现在包含所有新的特性代码,分支就已经无用了。如果需要的话,现在可以从版本库中将其删除。

Subversion 无法用一个文件夹来合并一个文件,反之亦然 - 只能是文件夹对文件夹,文件对文件。如果您点击一个文件并打开合并对话框,然后你必须在对话框中给出一个文件路径。如果您选择一个文件夹并打开对话框,然后您必须为合并指定一个文件夹地址。

合并跟踪

• 您可以避免合并同一版本两次的隐患 (重复合并问题)。一旦一个版本被标记为已合并,将来在版本范围中包含该版本的合并将会跳过它。

• 当您合并一个分支到主干时,日志对话框可以将分支提交作为主干日志的一部分来显示,这样可得到对更改更好的跟踪性。

• 当您从合并对话框内显示日志对话框时,已合并的版本显示为灰色。

• 当显示一个文件的追溯信息时,你可以选择显示已合并版本的原作者,而不是合并者。

• 您可以把版本标记为 不合并,通过把他们包含在已合并的版本列表中而实际上并没有进行合并。You can mark revisions as do not merge by including them in the list of merged revisions without actually doing the merge

执行合并时客户端将合并跟踪信息存储在 svn:mergeinfo 属性中。提交合并时,服务器会将该信息存储在数据库中,而当您请求合并、日志或追溯信息时,服务器可以作出恰当的响应。为了使系统正常工作,您必须确保服务器、版本库和所有客户端都是最新的。较早的客户端将不会存储 svn:mergeinfo属性并且早期版本的服务器端不会提供新版客户端所请求的信息。

子合并期间处理冲突

合并不会总是顺利的。有时会有冲突,如果您正在合并多个范围,您通常要在下一个范围的合并开始之解决冲突。TortoiseSVN 会在进程中通过显示 合并冲突回调 对话框来帮助你解决。

[No000098]SVN学习笔记5-分支,合并,属性,补丁,锁,分支图

很可能某些更改将顺利进行合并,而其他的本地更改会跟已提交到版本库的更改发生冲突。所有可以合并的更改都将被合并。合并冲突回调对话框会给你您三种不同的方法来处理冲突的行。

1. If you are merging text files then these first two buttons allow you to merge non- conflicting lines as normal and always prefer one version where there are conflicts. Choosing Prefer local will select your local version in every conflict, i.e. it will prefer what was already there before the merge over the incoming change from the merge source. Likewise, Prefer repository will select the repository changes in every conflict, i.e. it will prefer the incoming changes from the merge source over what was already in your working copy. This sounds easy, but the conflicts often cover more lines than you think they will and you may get unexpected results.If your merge includes binary files, merging of conflicts in those is not possible in a line-by-line mode. A conflict in a binary file always refers to the complete file. Use Prefer local to select the local version as it was in your working copy prior to the merge, or Prefer repository to select the incoming file from the merge source in the repository.

2. 通常情况下,你会想看看冲突和自己解决他们。在这种情况下,选择 编辑冲突 将启动合并工具。当你对结果满意时,请点击 已解决。

3. 最后一个选项就是延迟解决并继续进行合并。您可以为当前的冲突文件做这样的选择,或者为合并余下部分的所有文件。但是,如果该文件在接下来的合并中有进一步的更改,它将无法完成合并。如果您不想使用交互式回调,在合并进度对话框中有一个 非交互式合并 复选框。如果选中它,若合并

中出现了冲突,该文件会被标记为冲突,然后继续合并。你必须在整个合并完成后解决这些冲突。如果不选中它,那么在冲文件被标记为冲突之前你有机会在合并 过程中 解决冲突。它的优势是如果一个文件获得多个合并 (多个修订版本将更改应用于该文件),后续的合并是否成功取决于受影响的行。但这样在合并期间你可不能离开去尿尿哦get a coffee ;)

特性分支维护

当您在一个特性分支上开发一项新特性并完成时,为其重新整合至主干制定一个策略是一个好主意。如果同一时间 主干 上有其他工作也在继续,您可能会发现随着时间推移,差异会变得更显著,复兴合并将成为一场噩梦。如果新特性较为简单并且开发时间较短,那么您可以采取一种简单的方法,就是将分支完全独立,直到完成该特性,然后将分支更改合并回主干。在合并向导中,选择简单的 合并一个版本范围,该版本范围即是分支的版本跨度。如果该特性需要花费更长的时间,就要考虑到 主干 中的变化,那么你就需要保持分支同步。这仅仅意味着定期地将主干的修改合并到分支,使分支包含所有主干的修改并 加上 新特性。同步过程使用 合并一个版本范围 。当完成新特性时,那么你可以使用 复兴分支 或 合并两个不同的树 将其合并回 主干。

Another (fast) way to merge all changes from trunk to the feature branch is to use the TortoiseSVN → Merge all... from the extended context menu (hold down the Shift key while you right click on the file).

[No000098]SVN学习笔记5-分支,合并,属性,补丁,锁,分支图

Subversion通常不需要锁就可以很好的工作。但是,在某些情况下你可能需要制定某种锁定策略。

• 例如,你使用图形文件等"不能合并"的文件。如果两个人修改同一个这样的文件,合并是不可能的,所以你丢失其中一个的修改。

• 您的公司过去一直使用一个锁定版本控制系统,并且已有一个 "锁定是最好的" 管理决策

The Three Meanings of "Lock"

In this section, and almost everywhere in this book, the words "lock" and "locking"锁和锁定不同 describe a mechanism for mutual exclusion between users to avoid *ing commits. Unfortunately, there are two other sorts of "lock" with which Subversion, and therefore this book, sometimes needs to be concerned.

The second is working copy locks, used internally by Subversion to prevent *es between multiple Subversion clients operating on the same working copy. Usually you get these locks whenever a command like update/commit/... is interrupted due to an error. These locks can be removed by running the cleanup command on the working copy.第二种锁,指的是提交时,要么全部提交,要么都不提交,这时用到的机制就是锁,就是互斥,如果失败,请用 清理 Clear up命令

And third, files and folders can get locked if they're in use by another process, for example if you have a word document opened in Word, that file is locked and can not be accessed by TortoiseSVN. You can generally forget about these other kinds of locks until something goes wrong that requires you to care about them. In this book, "lock" means the first sort unless the contrary is either clear from context or explicitly stated.第三种锁是指文件被第三方程序独占时的锁。

锁定在Subverion中是如何工作的

默认情况下,所有的东西都没有锁定,只要有提交权限的人都可以在任何时候提交任何的文件。其他人 会定时更新他们的工作副本,在库中的改变的东西都会与本地合并。如果你对一个文件 取得锁定,那么只有你可以提交这个文件。其他用户的提交都会被拒绝,直到你释放了这个锁。一个被锁定的文件不能在库中进行任何形式的合并。所以它不能除锁的拥用者之外的人删除或更名。

锁定不是分配给一个特定用户,而是一个特定用户和一个工作副本。工作副本上的锁定也可以防止同一用户从另一个工作副本中提交已锁定的文件。举一个例子,假设用户 Jon 在他的办公室电脑上有一个工作副本。他开始对一个图像进行工作,并因此获得了该文件的锁定。当他离开办公室时还没有完成该文件的工作,所以他不会解除该锁定。回到家里 Jon 也有一个工作副本,并决定继续该项目的工作。但是他却不能修改或提交相同的图像文件,因为该文件的锁定驻留在办公室里的工作副本中。

但是,其他用户不必知道你已经增加了锁定,除非他们定期地检查锁定的状态。这其实没什么意义,因为他们发现提交失败的时候就可以知道锁定了。为了更容易管理锁,而设置了一个新的Subversion属性svn:needs-lock。当一个文件的这个属性被设置(成任意值)的时候,每当该文件检出或更新时,本地的副本都被设成只读,除非该工作副本就是拥有锁的那个用户的。这么做是为了能警告你,你不应该修改这个文件,除非你申请到了锁定。受控只读的文件在TortoiseSVN中用一个特殊的图标来表示你需要在编辑前取得锁定。

锁除了按所有者记录外,还在工作副本中记录。如果你有多个工作副本(在家,在单位),那么在这些工作副本中,只允许对其中一份拥有锁。如果你的合作者之一请求一个锁,但却外出旅游去了,你怎么办?Subversion提供了一种强制锁。释放别人拥有的锁被称为破坏锁定,强制获得别人拥有的锁称为窃取锁定。当然,如果你想要与你的合作者保持良好的关系,轻易不要这么做。锁在库中进行记录,一个锁定令牌建立在你的本地工作副本中。如果有矛盾,比如某人破坏了锁下,那么本地的锁定令牌将不可用。库中的记录将是最权威的参考。

取得锁定

选择工作副本中你想要获取锁定的文件,然后选择命令TortoiseSVN → 取得锁定.... TortoiseSVN → Get Lock... 出现一个对话框,允许你输入注释,这样别人可以知道你为什么锁定这个文件。注释是可选的,并且只用于基于Svnserve的库。当(且仅当)你需要窃取别人的锁的时候,勾选偷取此锁定复选框Steal lock,然后点击确定。

您可以设置项目属性 tsvn:logtemplatelock 给要填写如锁定信息的用户提供一个信息模板。

如果你选择一个文件夹,使用TortoiseSVN → 获取锁定...锁定对话框将显示所有子文件夹中的所有文件 。如果你真的要锁定整个目录,就这么做,但如果你这么做,可能会很不受你的合作者的欢迎。小心使用...

释放锁定

为了确保你不会忘记释放锁,你不需要做别的事,在提交对话框中,总是会显示锁定的文件,并总是默认被选中。如果你继续提交,选中的文件中的锁就被移除了,就算你从没有修改过。如果你不希望释放某文件的锁,你可以取消选中它(如果你没有修改过) keep a lock。如果你希望保持一个修改过的文件的锁,你需要在提交之前选中保持锁定复选框。

要手动释放锁定,选中工作副本中要释放的文件,选择命令TortoiseSVN → 释放锁定TortoiseSVN → Release Lock。不需要输入什么TortoiseSVN会联系版本库并释放锁。你可以对一个文件夹来使用这个命令释放其中的所有锁定项。

检查锁定状态

要查看你和他人所拥有的锁,你可以使用TortoiseSVN → 检查修改... TortoiseSVN → Check for Modifications....命令。本地的锁定令牌会立即显示出来,要查看别人拥用的锁定(或是检查你的锁是否被破坏或窃取)你需要点击检查版本库Check Repository.。从此处的右键菜单中,你可以获取锁或是释放锁,也可以破坏或是窃取别人的锁。

避免破坏和窃取锁定

如果你在破坏或是窃取某人的锁的时候没有告诉他,你可能会丢掉工作。如果你正在写一个不可合并的文件类型,并且你窃取了某人的锁,一旦你释放了锁,他们就可以随意检入他们的修改以覆盖你的。Subversion并不会丢弃数据,但你却失去了锁带来的对团队工作的保护。

让非锁定的文件变成只读

正如上面提到的,最有效的使用锁的方式是对一个文件设置svn:needs-lock属性。带有此属性的文件将总被按只读的方式检出和更新(除非你的工作副本拥有锁定)。

[No000098]SVN学习笔记5-分支,合并,属性,补丁,锁,分支图作为提醒的方式之一,TortoiseSVN使用一个特殊的图标表示。

如果你想实行一个每个文件必须被锁定的策略,那么您可能会发现使用 Subversion 的 auto-props 功能来为你每次新添加的文件自动设置属性是更容易的。自动设置属性每次添加新的文件。

锁定钩子脚本

当你使用Suversion1.2或更新的版本建立新的版本库的时候,建立了四个钩子模板在版本库中的hooks目录下。这些钩子模板在取得/释放一个锁定之前和之后会被分别调用。

安装一个 post-lock和post-unlock钩子,在钩子中为锁定和解锁事件发送邮件,是个好主意 。有了这种脚本,你的所有用户都会在一个文件被锁定/解锁的时候被通知。在你的版本库文件夹下,你可以找到一个示例钩子脚本hooks/post-lock.tmpl。你可能也使用hooks来拒绝破坏或是窃取锁定,或是限制只有管理员可以,或是当一个用户破坏或窃取锁定时通知原来的锁定拥有者

创建并应用补丁

对开源工程(比如本工程)来说,每个人对仓库都有读访问权,并且任何人都可以对该工程做出修改。那么如何控制这些修改呢?如果任何人都可以提交自己的修改,那么这个工程可能永远都会处于不稳定状态,而且很有可能永远的瘫痪下去。在这种情况下,修改需要以补丁文件的形式先递交到有写访问权限的开发组。开发组可以先对该补丁文件进行审查,然后决定将其提交到仓库里或者是退还给作者。补丁文件只是简单地用统一的差异描述文件显示出你的工作副本和基础版本的不同点。

创建一个补丁文件

首先你需要做出修改并测试这个修改的内容。然后在父目录上使用TortoiseSVN → 创建补丁... TortoiseSVN → Create Patch...代替TortoiseSVN → 提交...。TortoiseSVN → Commit...

现在你可以选择要包含在补丁中的文件了,就像你要做一个完整的提交一样。这样会产生一个单一的文件,该文件包括一份自从最后一次从仓库更新后你对所选择文件做的全部修改的摘要。在这一对话框中,纵列和在 检查修改对话框中的纵列同样是可以定制的。

By clicking on the Options button you can specify how the patch is created. For example you can specify that changes in line endings or whitespaces are not included in the final patch file.

你可以创建包含对不同文件集合修改的相互独立的补丁。当然如果你创建了一个补丁文件,对于同一份文件的更多修改会创建另外一个补丁文件,第二份补丁文件包含了全部的修改。

你可以用一个自己选择的文件名来保存这个补丁文件,补丁文件可以有任意的扩展名,但是按人一般习惯,人们都是用.patch或者.diff作扩展名,你现在已经做好提交你的补丁文件的准备了。

Do not save the patch file with a .txt extension if you intend to send it via email to someone else. Plain text files are often mangled with by the email software and it often happens that whitespaces and newline chars are automatically converted and compressed. If that happens, the patch won't apply smoothly. So use .patch or .diff as the extension when you save the patch file.

你也可以将补丁保存到剪贴板,而不是文件。这样你可以粘贴到电子邮件中,让他人审核。或者你在机器上有两个工作副本,想将修改传递到另外的副本。在剪贴板上的补丁就是为这些操作提供便利。

If you prefer, you can create a patch file from within the Commit or Check for Modifications dialogs. Just select the files and use the context menu item to create a patch from those files. If you want to see the Options dialog you have to hold shift when you right click.

应用一个补丁文件

补丁文件应用到你的工作副本。这应该从用来创建补丁的相同层级文件夹中完成。如果你不确定是什么文件夹,只需查看补丁文件中的第一行。例如,如果被执行的第一个文件是 doc/source/english/chapter1.xml 并且补丁文件的第一行是 Index: english/chapter1.xml 那么您需要应用此补丁至 doc/

source/ 文件夹。然而,假如你在正确的工作副本中却选择了错误的层级文件夹,TortoiseSVN 会通知你并提示正确的文件夹。

为了给你的工作副本打补丁,你至少需要对代码库的读权限。因为合并程序必须要参考修订版本中其他开发人员做的修改。

从那个目录的右键菜单,点击TortoiseSVN → 应用补丁... 系统会弹出一个打开文件的对话框,让你选择要应用的补丁文件。默认情况下只显示.patch或者.diff文件,但是你可以选择"所有文件"。如果你以前将补丁保存到了剪贴板Open from clipboard...,可以使用打开文件对话框的从剪贴板打开...如果补丁文件以.patch 或者 .diff 为扩展名的话,你可以选择直接右键点击该补丁文件,选择TortoiseSVN → 应用补丁... 在这种情况下,系统会提示你输入工作副本的位置。这两种方法只是提供了做同一件事的不同方式。第一种方法,你先选择工作副本,然后浏览补丁文件。第二种方法,你先选择补丁文件,然后浏览工作副本。一旦你选定了补丁文件和工作副本的位置,TortoiseMerge就会把布丁文件合并到你的工作副本中。系统会弹出一个小窗口列出所有被更改了的文件。依次双击每一个文件,检查所做的改变,然后保存合并后的文件。远程开发者的补丁现在已经应用到了你的工作副本上,你需要提交它以使每一个人都可以从代码库访问到这些修改。

远程开发者的补丁现在已经应用到了你的工作副本上,你需要提交它以使每一个人都可以从代码库访问到这些修改。

谁修改了哪一行?

有时你不仅要知道哪一行做了修改,还要精确地知道谁修改了一个文件中的哪一行。这就是TortoiseSVN → 追溯.. TortoiseSVN → Blame....命令,有时候也叫做 评注 命令派上用场的时候了。对一个文件中的每一行,这个命令列出了作者和该行修改时的版本。

追溯文件

如果对早期版本的修改不感兴趣,你可以设置从哪个版本开始追溯。如果你想追溯每一个版本,你可以把那个数值设置为1。

默认情况下追溯文件是使用 TortoiseBlame 来查看,突出显示不同的版本以使其更易于阅读。如果你想打印或者编辑追溯文件,选择 使用文本查看器查看追溯文件。你可以指定处理行结束符和空白改变的方法。默认是将行结束符和空白改变视为实际改变,但是如果你想忽略缩进改变和找到原始作者,那么可以在这里选择适当的处理方法。

You can include merge information as well if you wish, although this option can take considerably longer to retrieve from the server. When lines are merged from another source, the blame information shows the revision the change was made in the original source as well as the revision when it was merged into this file. Once you press OK TortoiseSVN starts retrieving the data to create the blame file. Once the blame process has finished the result is written into a temporary file and you can view the results.

TortoiseBlame,包含在TortoiseSVN中,使得追溯文件更加容易阅读。当你的鼠标在追溯信息列的某一行上盘旋时,所有和该列具有相同版本号的行都会用一个比较暗的背景色显示。同一作者修改的其他版本的行会用一个亮一些的背景色显示。如果你的显示设置为256色模式,那么颜色显示的可能不会很清楚。如果在某一行上左击,具有同一版本号的所有行都会高亮显示,同一作者的其他版本的行会用一个更亮的颜色高亮显示。这个高亮具有粘性,也就是说允许你移动鼠标但原先高亮的地方仍然保持高亮。再次点击该版本将关闭高亮显示。

只要鼠标逗留在追溯信息列,版本注释(日志信息)就会作为提示出现。如果你想复制此版本的日志信息,使用在追溯信息列显示的右键菜单。你可以在追溯报告里用编辑 → 查找...来搜索想要的内容。它允许你搜索版本号,作者还有文件的内容。这个搜索不包含日志信息-你可以在日志对话框里搜索日志信息。你也可以使用 编辑 → 转到行 ... 来跳到指定行。当鼠标滑过追溯信息列时,有个上下文菜单可以帮助你比较版本和检查历史,它用鼠标下方行的版本号作为参考版本。上下文菜单 → 追溯以前版本产生同一个文件的追溯报告,它使用以前的版本作为上限,给出了你看到最后修改之前的文件状态追溯报告。上下文菜单 → 显示修改启动差异察看器,显示在参考版本中的修改。上下文菜单 → 显示日志从参考版本开始显示版本日志。如果您需要对最早和最新变化之处有一个更好的视觉指示,选择 View → Color age of lines。这将使用一个颜色渐变来显示新行为红色、旧行为蓝色。默认着色很浅,但你可以使用 TortoiseBlame 设置来改变它。

If you are using Merge Tracking and you requested merge info when starting the blame, merged lines are shown slightly differently. Where a line has changed as a result of merging from another path, TortoiseBlame will show the revision and author of the last change in the original file rather than the revision where the merge took place. These lines are indicated by showing the revision and author in italics. The revision where the merge took place is shown separately in the tooltip when you hover the mouse over the blame info columns. If you do not want merged lines shown in this way, uncheck the Include merge info checkbox when starting the blame. If you want to see the paths involved in the merge, select View → Merge paths. This shows the path where the line was last changed, excluding changes resulting from a merge. The revision shown in the blame information represents the last revision where the content of that line changed. If the file was created by copying another file, then until you change a line, its blame revision will show the last change in the original source file, not the revision where the copy was made. This also applies to the paths shown with merge info. The path shows the repository location where the last change was made to that line.

TortoiseBlame 设置可以使用 TortoiseBlame 选项卡上的 TortoiseSVN → 设置... 来访问。

追溯不同点Blame Differences

One of the limitations of the Blame report is that it only shows the file as it was in a particular revision, and the last person to change each line. Sometimes you want to know what change was made, as well as who made it. If you right click on a line in TortoiseBlame you have a context menu item to show the changes made in that revision. But if you want to see the changes and the blame information simultaneously then you need a combination of the diff and blame reports.

在版本日志对话框里包含了以下几个选项支持你做这样的操作。

追溯版本 在顶部窗口,选择两个版本,然后选择上下文菜单 → 追溯版本。它将取出两个版本的追溯数据,然后使用差异察看器比较这两个追溯文件。Context menu → Blame revisions

追溯修改 在上面的面板里选择一个版本,然后在下面的面板选择一个文件然后选择右键菜单 → 追溯改变。这会为选定版本及其上一个版本获取追溯数据,然后用差异阅读器比较两份追溯文件。Context menu → Blame changes

与工作副本比较并追溯 为一个单一文件显示日志,在上面的面板选择一个版本,然后选择上下文菜单 → 与工作副本比较并追溯。这会为文件的选择版本和工作副本获取追溯数据,然后使用差异阅读器比较两份追溯文件。Context menu → Compare and Blame with Working BASE

版本库浏览器

有时候我们需要在版本库中直接进行操作,而不是在工作副本中。这就是我们的版本库浏览器可以做到的。正如资源管理器和能浏览你的工作副本一样,版本库浏览器允许你浏览版本库的结构和状态。在版本库浏览器中你可以执行比如复制,转移,重命名、、、直接操作在版本库上。除了版本库浏览器不是显示计算机中的文件,而是显示版本库中特定版本的内容之外,它看起来很象Windows 资源管理器。在左边的窗格显示目录树,右边的窗格显示选定目录的内容。在版本库浏览器窗口的顶部,你可以输入你想浏览的版本库 URL和版本。在版本库浏览器中,含有 svn:externals 属性的文件夹也会被显示。这些文件夹上会有一个小箭头,以表明他们不是版本库结构的一部分,而只是链接。就象 Windows 资源管理器一样,如果你想设置排列顺序,可以点击右边窗格中的列首。并且所有窗格都有上下文菜单。

文件的上下文菜单允许你:

• 用默认查看器或你指定的程序打开选中文件的选中版本。

• Edit the selected file. This will checkout a temporary working copy and start the default editor for that file type. When you close the editor program, if changes were saved then a commit dialog appears, allowing you to enter a comment and commit the change.

• 显示此文件的版本日志,或者显示所有版本图,从而你可以知道其来源。

• 追溯这个文件,查看是谁在何时修改哪些行。

• Checkout a single file. This creates a "sparse" working copy which contains just this one file.

• 删除或改名文件。

• 在你的硬盘上保存此文件的一个未版本控制的副本。

• Copy the URL shown in the address bar to the clipboard.

• 复制这个文件,目的可以是版本库中的其它地方,也可以是同一版本库中的工作副本。

• 查看/编辑文件属性。

• Create a shortcut so that you can quickly start repo browser again, opened directly at this location.

目录的上下文菜单允许你:

• 显示此目录的版本日志,或者显示所有版本图,从而你可以知道其来源。

• 导出此目录的未版本控制副本到你的本地硬盘。

• 检出此目录到你的硬盘,产生一个本地工作副本。

• 在版本库创建新目录。

• Add unversioned files or folders directly to the repository. This is effectively the Subversion Import operation.

• 删除或改名文件夹。

• 创建一个文件夹的副本至版本库中的不同部分或根于同一版本库中的工作副本。这也可以用来创建一个分支/标记,而不需要检出工作副本。

• 察看/编辑目录的属性

• 为比较标记目录。已标记的目录用粗体显示。

• 将此文件夹与以前标记的文件夹比较,用统一差异,或者是一个可以用默认比较工具可视化显示差异的文件改变列表。它对于比较两个标签,或者最新版本与分支,查看修改详情时尤其有用。

如果你在右窗格选择两个文件夹,你可以用统一差异,或者是一个可以用默认比较工具可视化显示差异的文件改变列表来查看其区别。

如果你在右边窗格中选择了多个目录,你可以将它们同时检出到同一个父目录之下。

如果你选择两个拥有相同历史的标签(特别是/主干/),你可以使用右键菜单 → 显示日志...来查看

External items (referenced using svn:externals are also shown in the repository browser, and you can even drill down into the folder contents. External items are marked with a red arrow over the item.

您通常可以使用 F5 来刷新视图。这将刷新当前的所有显示。如果你想预取或刷新还未被打开的节点信息,使用 CTRL-F5。之后,扩展的任何节点将会立即出现而没有网络延迟,同时提取信息。

您还可以使用版本库浏览器进行拖放操作。如果您从资源管理器中拖动一个文件夹至版本库浏览器,它将被导入至版本库。请注意,如果你拖动多个项目,他们将以单独的提交导入。

如果你想在版本库内移动一个项目,只需 左键拖拽 到新的位置。如果你想创建一个拷贝而不是移动项目,用 CTRL-左键拖拽 代替。拷贝时,光标上有一个 "+" 符号,就像在资源管理器中那样。

如果你想复制/移动文件或文件夹到另一个位置,并同时命一个新名称,你可以用 右键拖拽 或 CTRL-右键拖拽 而不是使用 左键拖拽。在这种情况下,将会显示一个重命名对话框,您可以为文件或文件夹输入一个新的名称。

无论什么时候对版本库的任意操作,都要求加入它的操作日志。这为你操作失误提供了返回的机会。

有时候当你访问一个路径时,会跳出一个错误信息。也许是不可用的URL,也许是你没有访问权限,或者其他的一些原因,如果你要把这些信息发送出去,只用点击它然后右键 → 复制错误信息到剪贴板,或者简单地用CTRL+C。

Bookmarked urls/repositories are shown below the current repository folders in the left tree view. You can add entries there by right clicking on any file or folder and select Context Menu → Add to Bookmarks. Clicking on a bookmark will browse to that repository and file/folder.

版本分支图

有时候,我们需要知道从哪开始有了分支和标签,同时想知道这条支路是单独的分支还是树型结构。如果需要你可以使用TortoiseSVN → 版本分支图...。

这个版本历史分析图能够显示分支/标签从什么地方开始创建,以及什么时候删除。

为了生成图示,TortoiseSVN 必须从版本库根目录中提取所有的日志信息。无需言明,对于拥有几千个修订版本的版本库来说得需要花上数分钟时间,这取决于服务器速度,网络带宽等。如果您尝试对像超过有 500,000 个修改版本的 Apache 之类的项目来进行此操作,您可能得等待一些时候。好消息是,如果你正使用日志缓存,你只需遇到一次这种延迟。之后,日志数据被保存到本地。日志缓存在 TortoiseSVN 设置中可被启用。

版本图节点Revision Graph Nodes

[No000098]SVN学习笔记5-分支,合并,属性,补丁,锁,分支图

每个版本图节点代表版本库中的一个修订版本,在那儿你可以查看到树状的变化。不同类型的节点可通过形状和颜色来区分。形状是固定的,但颜色可以使用 TortoiseSVN → 设置

新增或复制的项目 已添加或通过复制另一个文件/文件夹而创建的项目使用一个圆角矩形来显示。默认颜色为绿色。标签和主干都被视为一个特殊的情况并使用不同的色调,这取决于 TortoiseSVN → 设置。

已删除的节点 已删除的项目,例如一个不再需要的分支,显示为一个八边形 (切角的矩形)。默认颜色为红色。

重命名的项目 重命名的项目也使用一个八边形,但默认颜色是蓝色的。

分支最新版本 图示通常只限于显示分支点,但通常也可用于查看每个分支各自的 HEAD 版本。如果您选择 显示HEAD 版本,每个 HEAD 版本节点将显示为一个椭圆形。请注意,这里的 HEAD 是指在本路径上所提交的最新版本,而不是版本库的 HEAD 版本。

当前工作副本的版本 如果您从工作副本中调用版本图,你可以使用 显示工作副本的版本号 在图示上选择显示当前版本号,这使用了一个粗体边框来标记当前版本节点。

已修改的工作副本 如果您从工作副本中调用版本图,你可以使用 显示工作副本的本地更新 选择显示附加节点来表明你修改过的工作副本,附加节点默认有一个红色的粗体边框。

一般的文件/文件夹 其他一般的文件用plain rectangle标示来设置。

注意默认情况下图示只显示被添加、复制或删除的项目点。非常状况下显示每一个项目版本将生成一个非常巨大的图示。如果你真的想看到 所有 发生更改的版本,在 查看 菜单和工具栏上的某个选项可以满足您的要求。

默认视图 (分组关闭) 的节点置放主要是让其垂直位置vertical position按照严格的版本顺序排列,所以你会对已完成项目的顺序产生一个视觉提示。同列中两个节点的顺序是非常明显的。当两个节点处于相邻列时偏移量会更小,因为不必防止节点相互重叠,因此顺序并不太明显。这种优化是必要的,可以将复杂的图示保持到一个合理的规模。请注意,这种排序使用了 较老 the older side的一边的节点 边缘 the edge作为参照,也就是当用底部最老的节点显示图示时的节点底部边缘。这种参考的边缘是很显著的,因为节点的形状并不都是相同的高度。

更改视图

因为版本图经常很复杂,所以有很多方法剪裁视图。你可以在视图菜单或工具栏找到它们。

分组分支 默认行为 (分组关闭) 让所有的行严格按照版本号进行排序。结果,只有稀少的提交而有较长寿命的分支仅仅为少数的变化而占据一整列,并且版本图变得非常宽广。Group branches

This mode groups changes by branch, so that there is no global revision ordering: Consecutive revisions on a branch will be shown in (often) consecutive lines. Sub-branches, however, are arranged in such a way that later branches will be shown in the same column above earlier branches to keep the graph slim. As a result, a given row may contain changes from different revisions.

最老的在顶部 正常情况下,在图形底部显示最老的版本,版本树向上生长。使用这个选项,版本树从顶部向下生长。Oldest on top

顶部对齐树 当一个版本图形被拆分成几个较小的树结构时,这些树结构既可能按自然的修订版本顺序显示,也可能对齐于窗口的底部,这取决于您是否使用了 Group Branches 选项。使用该选项可让所有树结构自顶向下延伸。Align trees on top

减少交叉行 This option is normally enabled and avoids showing the graph with a lot of confused crossing lines. However this may also make the layout columns appear in less logical places, for example in a diagonal line rather than a column, and the graph may require a larger area to draw. If this is a problem you can disable the option from the View menu.

差异路径名称 长路径名称会占据大量空间并且让节点框变得非常大。使用此选项可以只显示路径的变化部分,而用小数点来代替共同部分。例如,如果您从 /trunk/doc/html 创建了一个分支 /branches/1.2.x/doc/html,可以用简洁形式将该分支显示为 /branches/1.2.x/..,因为最后两级 doc 和 html 并无变化。

显示所有版本 这会如你所愿并显示每一个发生更改(您正在绘制的树结构中)的修订版本。如果历史版本繁长,这可能会生成一个相当巨大的图形。

显示最新版本 它确保每个分支的最新版本永远在图中显示。

精确复制源 当创建一个分支/标签时,默认行为是将分支显示为取自最后一个发生更改的节点。严格地讲,这并不准确。因为分支往往创建自当前 HEAD 而非某个特定的修订版本。因此,有可能显示更为正确的(但用处不大)用来创建副本的修订版本。请注意,此修订版本可能比源分支的 HEAD 版本更新。

折叠标签 When a project has many tags, showing every tag as a separate node on the graph takes a lot of space and obscures the more interesting development branch structure. At the same time you may need to be able to access the tag content easily so that you can compare revisions. This option hides the nodes for tags and shows them instead in the tooltip for the node that they were copied from. A tag icon on the right side of the source node indicates that tags were made. This greatly simplifies the view. Note that if a tag is itself used as the source for a copy, perhaps a new branch based on a tag, then that tag will be shown as a separate node rather than folded.

隐藏已删除的路径 隐藏掉已经不在最新版本的路径,例如已经删除的分支。If you have selected the Fold tags option then a deleted branch from which tags were taken will still be shown, otherwise the tags would disappear too. The last revision that was tagged will be shown in the colour used for deleted nodes instead of showing a separate deletion revision. If you select the Hide tags option then these branches will disappear again as they are not needed to show the tags.

Hide unused branches 隐藏那些没有更改提交到相应文件或子文件夹中的分支。这并不一定表示该分支不被使用,仅表示它的这部分没有发生更改。

显示最新版本 在图形上标记修订版本,其对应于您抓取图形而得到的该项目的更新修订版本。如果您刚刚更新, 这将会是 HEAD。但如果有其他人自您上次更新后提交了更改,您的工作副本可能会处在一些修订版本之后。该节点用粗边框来标记。

显示工作拷贝的修改 如果您的工作副本包含本地更改,此选项会将它绘制为单独的椭圆形节点,其被链接回您的工作副本最后更新至的节点。默认的边框颜色为红色。您可能需要使用 F5 刷新图形来捕获最近的更改。

过滤器 有时修订版本图形显示的修订版本比您想看的还要多。此选项打开一个对话框,可允许您限制修订版本的显示范围,并通过名称隐藏特定的路径。If you hide a particular path and that node has child nodes, the children will be shown as a separate tree. If you want to hide all children as well, use the Remove the whole subtree(s) checkbox.

修剪树 当版本图中包含不同的版本树时,在背景上用不同的颜色区分是很有用的。

显示概述 将整个图形显示为小图片,当前视图窗口如同可以拖动的矩形。这可以使您更轻松地导航图形。请注意,对于相当大的图形,概览可能会由于极端的缩放系数而变得无用,并且在这种情况下会因此不被显示。

使用图

概览窗口可以使遍历大图更容易。它在小窗口中显示整个图形,高亮显示当前详细显示的部分。你可以通过拖曳高亮区域来改变当前详细显示的部分。任何时候只要鼠标在版本框上滑过,都会显示该版本的日期、作者和备注信息。

选择两个版本(用ctrl+左击),你可以在右键菜单下查看这两个版本的差异。你可以在分支的起始点查看差异,但一般你会在一个分支的结束点来查看,比如,在最新版本。你可以用查看单一差异文件的方式来查看差异,它在单一的文件中显示差异。如果你选右键菜单 → 比较版本所有修改过的文件都会呈现在列表中。双击一个文件名可以返回文件版本号和他们差异。如果右击一个版本你可以使用右键菜单 → 显示日志 来查看它的历史。您也可以将所选修订版本的更改合并到不同的工作副本。可以通过文件夹选择对话框来确定合并到哪一个工作副本中,但是此操作没有确认对话框,也没有尝试测试合并的机会。合并到未修改的工作副本是一个好主意,这样当其行不通时您还可以恢复这些更改!当您想要将所选版本从一个分支合并到另一个分支时,这个功能很有用。

学习怎样看版本关系图

初次使用的用户可能会被修订版本图形不符合用户心理模式的显示所惊倒。比如,如果一个修订版本更改了一个文件或文件夹的多个副本或分支,然后这单个修订版本将会有多个节点。建议您从工具栏最左边的选项开始并一步步自定义图形直到它慢慢接近您的心理模式为止。所有过滤选项都会尝试尽可能漏掉小信息。这可能会导致某些节点更改它们的颜色等。只要结果不符合预期,就应撤销上次过滤操作并尝试理解特定修订版本或分支的特别之处。在大多数情况下,过滤操作的最初预期结果既不准确也可能误导。

刷新视图

如果你想再次检查服务器是否有新的消息,可以使用 F5 键来刷新视图。如果使用日志缓存(默认启用),这将会检查版本库是否有新的提交并且只获取新的。如果日志缓存处于离线模式,这将会尝试回到在线模式。

如果您正在使用日志缓存并且认为消息内容或作者可能已更改,您应该使用日志对话框来刷新所需消息。由于修订版本图形起于版本库根目录,我们将不得不使整个日志缓存失效,而重新填满它可能会花上非常长的时间。

修剪树结构

一个大的树结构可能难以导航,有时您会想隐藏其中一部分,或者把它拆分成更小的树结构集合。如果您将鼠标悬停于节点链接进入或离开节点的地方,您将会看到一个或更多的弹出式按钮来允许您这样做。

[No000098]SVN学习笔记5-分支,合并,属性,补丁,锁,分支图在减号上单击收起关联子树。

[No000098]SVN学习笔记5-分支,合并,属性,补丁,锁,分支图点击加号按钮来展开折叠的树结构。当一个树结构已经折叠时,此按钮将保持可见以表明已隐藏的子树。

[No000098]SVN学习笔记5-分支,合并,属性,补丁,锁,分支图点击十字按钮来拆开所连接的子树,并在图形上将其显示为单独的树。

[No000098]SVN学习笔记5-分支,合并,属性,补丁,锁,分支图点击圆形按钮以重新连接一个拆开的树。当一个树已被拆离时,此按钮将保持可见以表明有一个单独的子树。

点击图形背景以获取主上下文菜单,它可提供选项来 全部展开 和 全部拼合。如果没有分支被折叠或拆开,该上下文菜单将不会被显示。

导出一个Subversion工作副本

Sometimes you may want a clean copy of your working tree without the .svn directory, e.g. to create a zipped tarball of your source, or to export to a web server. Instead of making a copy and then deleting the .svn directory manually, TortoiseSVN offers the command TortoiseSVN → Export.... Exporting from a URL and exporting from a working copy are treated slightly differently.

如果你在未版本控制的目录执行此命令,TortoiseSVN会假定此目录是目标,弹出对话框让你输入要导出的URL和版本。这个对话框有只导出*目录,省略外部引用,以及不管svn:eol-style的取值,重新设置行结束样式等选项。

当然,你也可以直接从版本库导出。使用版本库浏览器浏览有关子树,然后使用右键菜单 → 导出。就出现上面所说的从URL导出对话框。

If you execute this command on your working copy you'll be asked for a place to save the clean working copy without the .svn folder. By default, only the versioned files are exported, but you can use the Export unversioned files too checkbox to include any other unversioned files which exist in your WC and not in the repository. External references using svn:externals can be omitted if required. Another way to export from a working copy is to right drag the working copy folder to another location and choose Context Menu → SVN Export versioned items here or Context Menu → SVN Export all items here or Context Menu → SVN Export changed items here. The second option includes the unversioned files as well. The third option exports only modified items, but maintains the folder structure.

当从一个工作副本导出时,如果目标文件夹已包含了与您所导出的具有相同名称的文件夹,将为您提供此选项来重写现有内容,或者创建一个自动生成名称的新文件夹,例如 目标 (1)。

导出单个的文件

导出更改树

If you want to export your working copy tree structure but containing only the files which are locally modified, refer to SVN Export changed items here above.

从版本控制里移除删除工作副本

Sometimes you have a working copy which you want to convert back to a normal folder without the .svn directory. All you need to do is delete the .svn directory from the working copy root. Alternatively you can export the folder to itself. In Windows Explorer right drag the working copy root folder from the file pane onto itself in the folder pane. TortoiseSVN detects this special case and asks if you want to make the working copy unversioned. If you answer yes the control directory will be removed and you will have a plain, unversioned directory tree.

重新定位工作副本

If your repository has for some reason changed it's location (IP/URL). Maybe you're even stuck and can't commit and you don't want to checkout your working copy again from the new location and to move all your changed data back into the new working copy, TortoiseSVN → Relocate is the command you are looking for. It basically does very little: it rewrites all URLs that are associated with each file and folder with the new URL. 此操作仅适用于工作副本的根目录。所以此上下文菜单项仅显示于工作副本根目录。

您可能会惊讶地发现 TortoiseSVN 会将版本库牵扯到此操作中来。这样做完全是为了执行一些简单的检查以确保新地址确实不会将相同的版本库当作现有的工作副本。

这是一个极少使用的操作.重定位只能 在版本库路径更改时使用。可能的原因是:

• 服务器的IP地址已更改。

• 协议已更改(比如从http://改为 https://)。

• 版本库在服务器的路径已更改。

换种说法,如果你要重定位,只有当你的工作副本仍然还在同一个版本库中定位,但版本库本身已经没有了。

以下情况不支持:

• 你要移到一个完全不同的版本库。这种情况下,你必须从新的版本库里执行一次干净的检出。

• 你要在同一个版本库中切换一个分支或目录。这么做你可以用TortoiseSVN → 切换....

如果你使用以上任意一种重定位方式,它将破坏你的工作副本,在你更新、提交等操作时会提示一些令人费解的错误信息。一旦发生这种情况,唯一的办法就是检出最新版本。

与 BUG 跟踪系统/问题跟踪集成

在软件开发中,修改依赖于一个bug或问题编号是很常见的。bug跟踪系统的用户(问题跟踪者)喜欢在问题跟踪中将Subversion的修改与一个指定编号联系起来。因此很多问题跟踪者提供了一个预提交钩子脚本,分析日志,查找提交相关的bug编号。这稍微有些不可靠,因为它依赖于用户写完全的日志,预提交钩子才能正确分析。

TortoiseSVN可以在两个方面帮助用户:

1. 当用户输入日志信息时,一个定义良好,包含问题编号,与此提交相关的的行,会自动增加。这样减少了用户输入的问题编号不能比bug跟踪系统正确分析的风险。或者TortoiseSVN高亮显示日志消息中能被问题跟踪者识别的部分。这样,用户就知道日志消息能被正确解析。

2. 当用户浏览日志信息,TortoiseSVN在日志信息中创建指向每个bug标示的链接,它可以用浏览器打开。

在日志消息中增加问题号

您可以在 TortoiseSVN 中为您的选择集成一个错误跟踪工具。为此,您必须定义一些属性,用bugtraq: 开头。它们必须设置于文件夹:

[No000098]SVN学习笔记5-分支,合并,属性,补丁,锁,分支图

When you edit any of the bugtraq properties a special property editor is used to make it easier to set appropriate values.

有两种方式将问题跟踪器集成于 TortoiseSVN。一种基于简单的字符串,另一种基于 正则表达式。两种方法使用的属性为:

bugtraq:url 将这个属性设置为你的bug跟踪工具的地址。它必须编码并且包含<literal>%BUGID%</literal>。<literal>%BUGID%</literal>用你输入的问题编号替换。它允许TortoiseSVN 在日志对话框中显示链接,于是你可以在察看版本日志时直接进入bug跟踪工具。你可以不提供这个属性,但是这样TortoiseSVN就不能显示链接了,只能显示问题编号。例如TortoiseSVN 使用 <literal>http://issues.tortoisesvn.net/?do=details&amp;id=%BUGID%</literal>。您也可以使用相对地址来代替绝对地址。当您的问题跟踪器和源版本库在同一域/服务器上时,这非常有用。即使在域名称发生更改的情况下,您也不必调整 bugtraq:url 属性。有两种方式来指定相对地址:

如果它以字符串 ^/ 开头,它被假定为对应于版本库的根目录。例如,如果您的版本库位于http://tortoisesvn.net/svn/trunk/,^/../?do=details&id=%BUGID% 将解析为 http://tortoisesvn.net/?do=details&id=%BUGID%。以字符串 / 开头的地址被假定为相对于服务器的主机名。例如,如果您的版本库位于 http://tortoisesvn.net 的任何地方,/?do=details&id=%BUGID% 将解析为 http://tortoisesvn.net/?do=details&id=%BUGID%。

bugtraq:warnifnoissue 如果你想TortoiseSVN给出空问题编号的警告,就设置为 <literal>真</literal>。有效取值是<literal>真/假</literal>。<emphasis>如果没有定义,那么假定为 <literal>假</literal></emphasis>。true/false

文本框中的问题单编号

在最简单的方法里,TortoiseSVN为用户显示了一个单独的bug ID输入字段,然后后面预计会追加一个用户输入日志信息的行。

bugtraq:message 此属性以输入字段模式激活问题跟踪系统。如果设置了此属性,在提交更改时,TortoiseSVN 将提示您输入问题单编号。它通常会在日志信息后面添加一行。必须包含 %BUGID%,在提交时会被替换为问题单编号。这确保了您的提交日志包含了对总是保持一致格式并且可被问题跟踪工具解析的问题单编号的引用,从而将问题与特定提交相关联。例如,您可能使用 Issue : %BUGID%,但是这取决于您的工具。

bugtraq:label 是TortoiseSVN的提交对话框中用来输入问题单号码的输入项,如果没有设置,将会显示<literal>Bug-ID / Issue-Nr:</literal>,要记住窗口不会为适应标签而改变大小,所以请保持标签的小于20-25个字符。

bugtraq:number 如果设置为 true,在问题单编号文本字段中只允许输入数字。逗号除外,因此您可以使用逗号来分隔多个数字。有效的值为 true/false。如果未定义,假定为 true。

bugtraq:append 这个属性定义了bug-ID。是追加到(true)日志信息的末尾,还是插入到(false)日志信息的开始。有效的值包括true/false,如果没有定义,默认是true ,所以现存的项目不会被打破。

问题号使用正则表达式

在含正则表达式的方法中,TortoiseSVN 不会显示一个单独的输入字段,而是标记用户所输入的日志信息的一部分,这可以被问题追踪工具所识别。这是在用户编写日志信息的时候完成的,这也意味着 bugID 可以出现在日志信息的任何位置!这种方法更为灵活,也是 TortoiseSVN 项目本身使用的方法。

bugtraq:logregex 此属性以正则表达式模式激活问题追踪系统。它既可包含单个正则表达式,也可包含以新行来分隔的两个正则表达式。如果设置了两个表达式,那么第一个表达式用作为一个预过滤器来查找包含 bug ID 的表达式。然后第二个表达式从第一个正则表达式的结果中提取显现出的 bug ID。这允许您使用 bug ID 列表和自然语言表达式,如果您愿意的话。例如,您可能修复几个 bug 并包括像这样的字符串: "This change resolves issues #23, #24 and #25"。如果您想像上述日志信息中的表达式那样捕获 bug ID,您可以使用下面的 TortoiseSVN 项目所使用的正则表达式字符串: [Ii]ssues?:?(\s*(,|and)?\s*#\d+)+ 和 (\d+)。第一个表达式从日志消息中筛选出 "issues #23, #24 and #25"。第二个正则表达式从第一个正则表达式的输出中提取纯粹的十进制数, 因此它将返回 "23", "24" 和 "25" 并用作为 bugID。稍微分解一下第一个正则表达式,它必须以 "issue" 开头,可以大写。其后也可以跟一个 "s"(多个问题) 和一个冒号。这之后跟一个或多个组,每个都有零个或多个前导空格、可选的逗号或"and" 以及更多的可选空格。最后强制使用 "#" 和十进制数。如果只设置了一个表达式,则出现的 bug ID 必须按正则表达式字符串组匹配。例如:[Ii]ssue(?:s)? #?(\d+) 此方法是一些问题跟踪器所必需的,比如 trac,但它构建正则表达式会更难。我们建议您仅使用此方法,如果您的问题跟踪器文档告诉你如此。

It's not always easy to get the regex right so to help out there is a test dialog built into the bugtraq properties dialog. Click on the button to the right of the edit boxes to bring it up. Here you can enter some test text, and change each regex to see the results. If the regex is invalid the edit box background changes to red.如果同时设置了bugtraq:message和bugtraq:logregex属性,日志正则表达式会优先使用。

即使你的问题追踪工具没有pre-commit钩子来解析日志信息,你仍然可以使用这个功能将日志信息中的问题单转化为链接!

即使您不需要链接,问题单编号会在日志对话框中显示为一个单独的列,可更容易找到相对于某特定问题单的变动。

一些 tsvn: 属性需要 true/false 值。TortoiseSVN 也理解 yes 是 true 的同义词,no 是 false的同义词。

设置文件夹的属性

为了系统能够工作,这个属性必须设置到文件夹上。当您提交文件或文件夹时,属性会从文件夹上读取。如果没有发现属性,TortoiseSVN 会向上级搜索整个目录树,直到一个没有版本控制的文件夹或发现根目录(例如C:\)为止。如果您能够确定每个用户只从 trunk/检出,而不是一些子目录,那么您只在 trunk/ 上设置属性就足够了。如果不能确定,您必须为每个子目录设置这些属性。在较深的项目层次结构中的属性设置将重写较高级别上的设置(更靠近 trunk/ 的)。

As of version 1.8, TortoiseSVN and Subversion use so called inherited继承 properties, which means a property that is set on a folder is automatically also implicitly set on all subfolders. So there's no need to set the properties on all folders anymore but only on the root folder. 对于tsvn:属性,例如 tsvn:,bugtraq: 和 webviewer:,你只能对于所有子文件夹使用递归复选框设置属性,不用将这些属性设置在文件上。当你使用TortoiseSVN在工作副本中新建一个子目录, 上层目录的所有项目属性都会自动的被继承。.

当你使用TortoiseSVN在工作副本中新建一个子目录, 上层目录的所有项目属性都会自动的被继承。.

没有来自版本库浏览器的问题跟踪器信息

Because the issue tracker integration depends upon accessing Subversion properties, you will only see the results when using a checked out working copy. Fetching properties remotely is a slow operation, so you will not see this feature in action from the repo browser unless you started the repo browser from your working copy. If you started the repo browser by entering the URL of the repository you won't see this feature。出于同样的原因,当使用版本库浏览器添加子文件夹时,项目属性将不会被自动传递到子文件夹。

从问题跟踪器中获取信息

前一节介绍了在日志信息中添加问题单信息,那如何从问题跟踪器中获取信息呢?提交对话框有一个COM 接口,可允许集成一个能够跟跟踪器交互的外部程序。通常,您可能想查询跟踪器以得到分配给您的开放问题列表,以便于您能选取提交中正在解决的问题。

与基于 WEB 的版本库浏览器集成

webviewer:revision 将这个属性设置为版本库浏览器显示所有本版本修改内容的url,它必须是URI编码的,也必须包含%REVISION%。在问题单中%REVISION%将会被替换成版本号。这允许TortoiseSVN在日志对话框的增加这样的条目右键菜单 → 在版浏览器中查看此修订

webviewer:pathrevision 为您的版本库查看器的地址设置此属性以查看某特定版本中的某特定文件的更改。它必须是完全的URI 编码并且要包含 %REVISION% 和 %PATH%。%PATH% 用相对于版本库根目录的路径来替换。这允许TortoiseSVN 在日志对话框中显示一个上下文菜单项 上下文菜单 → 在网络查看器中查看路径版本例如,如果您在日志对话框的底部窗格中右击一个文件项 /trunk/src/file,那么地址中的 %PATH%将被 /trunk/src/file 所替换。您也可以使用相对地址来代替绝对地址。当您的网络查看器和源版本库在同一域/服务器上时,这非常有用。即使在域名称发生更改的情况下,您也不必调整 webviewer:revision 和webviewer:pathrevision 属性。地址格式与 bugtraq:url 属性的一样

限制使用代码库浏览器

Because the repo viewer integration depends upon accessing Subversion properties, you will only see the results when using a checked out working copy. Fetching properties remotely is a slow operation, so you will not see this feature in action from the repo browser unless you started the repo browser from your working copy. If you started the repo browser by entering the URL of the repository you won't see this feature. 出于同样的原因,当使用版本库浏览器添加子文件夹时,项目属性将不会被自动传递到子文件夹。

常规设置

想知道不同的设置是干什么用的,你只需将鼠标指针在编辑框/选项框上停留一秒钟...一个帮助提示气泡就会弹出来

[No000098]SVN学习笔记5-分支,合并,属性,补丁,锁,分支图

Create Library

On Windows 7 you can create a Library in which to group working copies which are scattered in various places on your system.

全局忽略样式Global ignore pattern

全局忽略模式是用来防止非版本控制的文件被显示出来,比如在提交对话框中等等。那些符合模式的文件在执行导入操作时同样被忽略。通过输入文件名或扩展名来忽略文件或文件夹。模式之间以空格分隔,例如 bin obj *.bak *.~?? *.jar *.[Tt]mp。这些模式不应该包含任何路径分隔符。还请注意没有办法来区分文件和目录。

值得注意的是,你在这里指定的忽略样式将同样作用于你本机上的其他Subversion客户端,包括命令行客户端。

如果你象下面段落那样使用Subversion配置文件来设置一个 全局-忽略 样式,那么它将覆盖你在这里做的设置。该Subversion配置文件可以象下面段落描述的那样,通过编辑 按钮来访问。

This ignore pattern will affect all your projects. It is not versioned, so it will not affect other users. By contrast you can also use the versioned svn:ignore or svn:global- ignores property to exclude files or directories from version control.

将文件日期设置为"最后提交时间" 该选项通知 TortoiseSVN 在做检出或更新操作时,把文件日期设置为最后提交的时间。否则TortoiseSVN 将使用当前日期。如果您正在进行软件开发,总的来说最好使用当前日期,因为软件生成系统通常通过查看时间戳来决定需要编译哪些文件。如果您使用"最后提交时间"并恢复到了一个更旧的文件版本,您的项目可能无法如您预期的那样编译。

Subversion配置文件 Use Edit to edit the Subversion configuration file directly. Some settings cannot be modified directly by TortoiseSVN, and need to be set here instead.

Apply local modifications to svn:externals when updating This option tells TortoiseSVN to always apply local modifications to the svn:externals property when updating the working copy.

右键菜单配置

[No000098]SVN学习笔记5-分支,合并,属性,补丁,锁,分支图

TSVN对话框设置一

[No000098]SVN学习笔记5-分支,合并,属性,补丁,锁,分支图

默认的日志信息数 限制你首次选择 TortoiseSVN → 显示日志 时,TortoiseSVN 从服务器获取的日志信息数。在服务器连接缓慢时很有用。你可以使用 全部获取 或 下100条 来获得更多信息。

日志信息字体 选择日志信息显示的字体样式和大小,作用域为版本日志对话框的中间窗格,以及提交对话框时填写日志信息的窗格。

日志信息使用短日期/时间格式

可以在日志列表中双击以便与以前的版本比较 如果您经常在日志对话框的顶部窗格中进行版本比较,您可以使用此选项来允许双击操作。默认情况下是不启用的,因为获取差异是相当漫长的过程,并且许多人在意外双击后都不愿等待,这就是此选项默认禁用的原因。

自动关闭 当一个动作正确无误地完成时,TSVN可以自动关闭所有的进程对话框。这项设置允许你选择在何种情况下关闭对话框。默认(推荐)的设置是 手动关闭 ,允许你重新浏览所有信息并检查发生了什么。当然,你可能会决定忽略某些类型的信息并在你的操作没做出什么重大改变的情况下让对话框自动关闭。

如无合并、添加、删除操作,自动关闭 意味着如果有简单更新的话,进程对话框将关闭。但如果版本库的更改和你的内容进行了合并,或若有任何文件被添加或删除,对话框将保持打开。若操作中发生什么冲突和错误这些对话框也将同样保持打开。

无冲突时自动关闭 更放宽了标准,即使在无合并、添加、删除操作时也同样关闭对话框。当然,如果操作发生了任何冲突或错误,对话框将保持打开。

如无错误,自动关闭 即使在有冲突发生时也会关闭。维持对话框打开的唯一条件是发生了错误,使得Subversion无法完成任务。举个例子,一个更新操作由于服务器不可达而失败了,或是一个提交操作因为工作副本已经过期而失败。

对本地操作始终关闭对话框

在还原的时候使用回收站

将工作副本 URL 用作默认的 "来源:" URL

缺省检出路径

缺省检出URL

TSVN对话框设置二

[No000098]SVN学习笔记5-分支,合并,属性,补丁,锁,分支图

递归处理未进行版本控制的文件夹

自动完成文件路径和关键词

自动完成分析的超时时间(秒)

仅在设置了 tsvn:projectlanguage 时才进行拼写检查

日志中保留的最大条目数量

自动选择项目 在提交对话框中的正常行为就是选择所有更改的(受版本控制的)项目以备自动提交。如果您想在启动时不选择任何项目并且手动挑选项目以备提交,则不要选择此框。

提交后如果有项目未被提交则重新打开对话框

启动时连接版本库

在锁定文件之前显示加锁对话框

TortoiseSVN Dialog Settings 3

[No000098]SVN学习笔记5-分支,合并,属性,补丁,锁,分支图

预取文件夹以加速浏览

显示外部

TortoiseSVN 颜色设置

[No000098]SVN学习笔记5-分支,合并,属性,补丁,锁,分支图

此对话框允许你按照你喜欢的方式来配置TSVN对话框使用的文本颜色。

版本图设置

[No000098]SVN学习笔记5-分支,合并,属性,补丁,锁,分支图

分类模式

修改颜色

版本图颜色

图标叠加设置

[No000098]SVN学习笔记5-分支,合并,属性,补丁,锁,分支图

此页面允许您选择 TortoiseSVN 要显示图标覆盖的项目。

因为它要花费一段时间来获取工作副本的状态,TortoiseSVN 将使用一个缓存来存储这些状态,从而使资源管理器在显示图标覆盖时,不会消耗太多资源。您可以根据您的系统和工作副本大小来选择让TortoiseSVN 使用哪种类型的缓存:

默认

以一个单独的进程(TSVNCache.exe)来缓存所有的状态信息。该进程监视所有驱动器的更改,并在工作副本中的文件被修改时重新获取其状态。该进程以最低优先级运行,所以其他程序不会被它挤占。这也意味着状态信息并不是 实时 的,因为它需要几秒钟时间处理图标重载的变化。

优点: 图标覆盖递归地显示状态,就是说,如果一个处在工作副本深处的文件被修改了,所有上级目录直到工作副本的根目录都会显示出已修改的覆盖图标。由于该进程可以向 Windows 外壳发送通知,所以资源管理器左侧树视图通常也会更改。

缺点: 即使你已经不在项目下工作了,该进程仍然持续运行。取决于你工作副本的数量和大小,它将占用10-50 MB的RAM内存空间。

Windows 外壳

缓存在外壳扩展dll中直接完成,但仅仅是为那些当前可见的文件夹。每次你浏览到其他文件夹,状态信息就会被重新获取。

优点: 仅仅需要很少的内存(大约 1 MB),并且可以 实时 显示状态。

缺点: 因为仅有一个文件夹被缓存,图标重载不会递归地显示状态。在大一些的工作副本下,它在浏览器中显示一个文件夹将比默认缓存模式花费更多时间。而且 mime-type 列将无效。

在这种设置下,TSVN在浏览器里就完全不去获取状态了。因此,版本控制下的文件将不会获得任何图标重载。文件夹也仅仅有个"正常"状态的图标重载,其他的不会显示,也不会有其他额外的列可用。

优点: 绝对不会占用任何额外的内存,也完全不会减慢浏览器的浏览速度。

缺点: 文件和文件夹的状态信息不会显示在资源管理器中。要获知工作副本是否被修改,您需要使用 "检查修改" 对话框。

默认情况下,覆盖图标和上下文菜单将出现在所有的打开/保存对话框中,就像在 Windows 资源管理器中一样。如果您想让它们仅出现在 Windows 资源管理器中,选择 仅在资源管理器中显示图标覆盖和上下文菜单。

您还可以选择将文件夹标记为已修改,如果它们包含非版本控制的项目。这很有用,可以提醒您已经创建了尚未受版本控制的新文件。此选项仅适用于在使用 默认 状态缓存选项时(见下文)。

图标集选择

启用的图标覆盖

[No000098]SVN学习笔记5-分支,合并,属性,补丁,锁,分支图

网络设置

外部程序设置

[No000098]SVN学习笔记5-分支,合并,属性,补丁,锁,分支图

合并工具%base 没更改的原始文件

%bname 原始文件的窗口标题

%nqbname The window title for the base file, without quotes

%mine 你更改过的新文件

%yname 你新文件的窗口标题

%nqyname The window title for your file, without quotes

%burl The URL of the original file, if available

%nqburl The URL of the original file, if available, without quotes

%yurl The URL of the second file, if available

%nqyur The URL of the second file, if available, without quotes

%brev The revision of the original file, if available

%nqbrev The revision of the original file, if available, without quotes

%yrev The revision of the second file, if available

%nqyrev The revision of the second file, if available, without quotes

%peg The peg revision, if available

%nqpeg The peg revision, if available, without quotes

%fname The name of the file. This is an empty string if two different files are diffed instead of two states of the same file.

%nqfname The name of the file, without quotes

合并工具

外部合并程序被用来解决冲突的文件。像差异查看程序那样,替代参数同样被用在命令行中。

%base 没有被你或他人更改的原始文件

%bname 原始文件的窗口标题

%nqbname The window title for the base file, without quotes

%mine 你更改过的新文件

%yname 你新文件的窗口标题

%nqyname The window title for your file, without quotes

%theirs 档案库中存放的文件

%tname 档案库中文件的窗口标题

%nqtname The window title for the file in the repository, without quotes

%merged 发生冲突的文件,同时将被合并后的文件替换

%mname 合并文件的窗口标题

%nqmname The window title for the merged file, without quotes

%fname The name of the conflicted file

%nqfname The name of the conflicted file, without quotes

差异查看/合并工具的高级设置

在高级设置中,您可以为每种文件类型都定义一个不同的差异比较及合并程序。

已保存数据的设置

[No000098]SVN学习笔记5-分支,合并,属性,补丁,锁,分支图

URL历史记录

日志信息(输入对话框)

日志信息(显示日志对话框)

窗口大小及位置

认证数据

动作日志

日志缓存

[No000098]SVN学习笔记5-分支,合并,属性,补丁,锁,分支图

启用日志缓存

允许不明确的 URL

允许不明确的 UUID

如果不能连接版本库

更新 HEAD 版本之前的超时时间

不活动的小缓存过期天数

删除不活动缓存的最大尺寸

在删除缓存之前的最大失败次数

缓存的版本库

[No000098]SVN学习笔记5-分支,合并,属性,补丁,锁,分支图

在此页面上,您可以看到已经缓存至本地的版本库列表,以及用作缓存的空间。如果您选择一个版本库,您就可以使用下面的按钮。

点击 更新 可完全刷新缓存并填满所有空隙。对于大版本库,这可能会耗用很长时间。但这很有用,比如您转至离线并希望获得最佳的可用缓存。

点击 导出 按钮以导出整个缓存作为 CSV 文件集。这很有用,比如您想使用外部程序来处理日志数据,尽管它主要用于开发人员。

点击 删除 为所选版本库删除所有缓存的数据。这不会禁用版本库缓存,因此您下次请求日志数据时,一个新的缓存将被创建。

日志缓存统计

RAM 缓存服务所需的内存量。

磁盘 用于缓存的磁盘空间量。数据被压缩,因此磁盘使用率通常相当适度。

连接 显示版本库在最后一次使用缓存时是否可用。

最近更新 最后一次缓存内容更改时间。

最后一次HEAD 更新 最后一次我们从服务器请求 HEAD 版本的时间。

作者 缓存中记录的消息的不同作者的数量。

路径 列出的路径数量,正如您使用 svn log -v 所看到的一样。

跳过范围 我们还未获取的版本范围数量,只是因为它们还没有被请求。这是对缓存中空位数量的测量。

最大版本号 缓存中存储的最高版本号。

版本计数 存储在缓存中的版本数量。这是缓存完整性的另一项测量。

客户端钩子脚本

问题跟踪器集成

TortoiseBlame 的设置

TortoiseUDiff Settings

正在导出TSVN设置(同步)

高级设置

一些不常用的设置只在设置对话框的高级页面上,这些设置直接修改注册表.需要知道这些设置是做什么用的以及它们做出了什么改动.除非确定需要修改这些设置,否则不要修改它们.

总结:

check out 意思签出,虽然和Export的效果一样是把代码从服务器下载到本地,但是Checkout有验证的功能,Checkout到某处的代码,将会被TortoiseSVN监视,里面的文件可以享受各种SVN的服务。

每次提交代码需要注意哪些问题

如果你更新了目录中的文件,提交代码需要用到commit功能,commit的功能不仅仅是上传,他会和服务器上面的文件进行对比,假如你更新了某个文件而服务器上面也有人更新了这个文件,并且是在你checkout之后做的更新,那么它会尝试将你的更新和他人的更新进行融合(merge),假如自动merge不成功,那么报告conflict,你必须自己来手动merge,也就是把你的更新和别人的更新无冲突的写在一起。

commit的时候,最好填写Log信息,这样保证别人可以看到你的更新究竟做了写什么。这就相当于上传文件并且说明自己做了那些修改,多人合作的时候log非常重要。

TortoiseSVN的commit只会上传原先checkout然后又被修改了的文件,假如你新加入了某些文件,需要右键点击文件选择Add,然后文件上面会出现一个加号,在下次commit的时候它就会被upload并且被标记为绿色对勾。没有绿色对勾的文件不会被commit。

假如你需要给带有绿色对勾文件改名或者移动它的位置,请不要使用windows的功能,右键点击它们,TortoiseSVN都有相应的操作。想象这些文件已经不在是你本地的东西,你的一举一动都必须让Tortoise知道。

假如修改了某个文件但是你后悔了,可以右键点击它选择Revert,它将变回上次checkout时候的情况。或者Revert整个工程到任意一个从前的版本.

下面描述在使用Commit时的几个注意点:

-------------如有多个文件需要同时提交,同时文件在不同的目录下,必须找到这些文件的最短目录上点击Commit,TortoiseSVN会搜索被点击目录以及该目录下所有的文件,并将修改变动的文件罗列在列表中。

-------------仔细查看列表中的文件,确定哪些文件时需要更新的,如果不需要更新某个已经变化了的文件,只需要在该文件上点击右键,选择还原操作;选择需要新增的文件,不要将临时文件添加到版本库中。

-------------如遇到文件冲突(冲突:要提交的文件已被其他人改动并提交到版本库中)要启用解决冲突功能。

如何保持本地版本和服务器版本同步

使用update来同步本地和服务器上的代码。同样是右键选择SVN update,所有的更改就会从服务器端传到你的硬盘。注意,假如别人删除了某个文件,那么更新之后你在本地的也会被删除。

如果本地的代码已经被修改,和commit一样会先进行merge,不成功的话就会报告conflict

如何在同一个在一个工程的各个分支或者主干之间切换

使用tortoise SVN-->switch,在URL中输入branch或trunk的url地址

如何比较两个版本之间的差别

本地更改

如果你想看到你的本地副本有哪些更加,只用在资源管理器中右键菜单下选TortoiseSVN→ 比较差异。

与另外一个分支/标签之间的差异

如果你想查看主干程序(假如你在分支上开发)有哪些修改或者是某一分支(假如你在主干上开发)有哪些修改,你可以使用右键菜单。在你点击文件的同时按住Shift键,然后选择TortoiseSVN→ URL比较。在弹出的对话框中,将特别显示将与你本地版本做比较的版本的URL地址。

你还可以使用版本库浏览器,选择两个目录树比较,也许是两个标记,或者是分支/标记和最新版本。邮件菜单允许你使用比较版本来比较它们。

与历史版本的比较差异

如果你想查看某一特定版本与本地拷贝之间的差异,使用显示日志对话框,选择要比较的版本,然后选择在右键菜单中选与本地拷贝比较差异

两个历史版本的比较

如果你要查看任意已提交的两个历史版本之间的差异,在版本日志对话框中选择你要比较的两个版本(一般使用 Ctrl-更改),然后在右键菜单中选比较版本差异

如果你在文件夹的版本日志中这样做,就会出现一个比较版本对话框,显示此文件夹的文件修改列表。阅读第 5.9.2 节 "比较文件夹"以便获得更多信息。

提交所有修改

如果你要在一个视窗中查看某一版本的所有更改,你可以使用统一显示所有比较 (GNU 片段整理)。它将显示所有修改中的部分内容。它很难显示一个全面清晰的比较,但是会将所有更改都集中显示出来。在版本日志对话框中选择某一版本,然后在右键菜单中选择统一显示所有比较。

文件差异

如果你要查看两个不同文件之间的差异,你可以直接在资源管理器中选择这两个文件(一般使用 Ctrl-modifier),然后右键菜单中选TortoiseSVN→ 比较差异。

WC文件/文件夹与URL之间的比较差异

如果你要查看你本地拷贝中的任一文件与版本库中任一文件之间差异,

谴责信息之间的比较差异

如果你要查看的不仅是比较差异而且包括修改该版本的作者,版本号和日期,你可以在版本日志对话框中综合比较差异和谴责信息。这里有更多详细介绍第 5.20.2 节 "追溯不同点"。

比较文件夹差异

TortoiseSVN 自带的内置工具不支持查看多级目录之间的差异,但你可以使用支持该功能的外置工具来替代。

如何为一个SVN主工程建立分支或tag

创建分支使用步骤:

1、选择你要产生分支的文件,点击鼠标右键,选择[分支/标记...]

2、在[至URL(T)]输入框中将文件重命名为你的分支文件名,输入便于区分的日志信息,点击确认。

3、在SVN仓库中会复制一个你所指定的文件,文件名称就是你所命名的,但是在你的本地目录上看不到新建的分支文件名,要使你的文件更新作用到你的分支上,你必须选择文件,点击鼠标右键,选择[切换...],选择你重命名的文件,点击确定即可。这样你的本地文件就和分支文件关联上了,不要奇怪,这时本地目录上看到的文件名仍然为旧的文件名。

经验小结:

1、如果操作的文件之前还未提交,而你又想把文件提交到新的分支上,记得一定要选择切换

2、SVN分支的管理实际上就是把不同的分支用不同的文件保存,因此你在取得新版本的时候会发现,不同分支的最新文件也会被获取下来。创建tag操作,相当于把当前的代码版本复制一份到其他地方,然后以这个地方为出发点进行新的开发,与原来位置的版本互不干扰。对于branches、tags、trunk这三个目录,并不是subversion必需的,而是被总结的一种良好的团队开发习惯,其使用方法为:

1、开发者提交所有的新特性到主干。 每日的修改提交到/trunk:新特性,bug修正和其他。

2、这个主干被拷贝到"发布"分支。 当小组认为软件已经做好发布的准备(如,版本1.0)然后/trunk会被拷贝到/branches/1.0。

3、项目组继续并行工作,一个小组开始对分支进行严酷的测试,同时另一个小组在/trunk继续新的工作(如,准备2.0),如果一个bug在任何一个位置被发现,错误修正需要来回运送。然而这个过程有时候也会结束,例如分支已经为发布前的最终测试"停滞"了。

4、分支已经作了标签并且发布,当测试结束,/branches/1.0作为引用快照已经拷贝到/tags/1.0.0,这个标签被打包发布给客户。

5、分支多次维护。当继续在/trunk上为版本2.0工作,bug修正继续从/trunk运送到/branches/1.0,如果积累了足够的bug修正,管理部门决定发布1.0.1版本:拷贝/branches/1.0到/tags/1.0.1,标签被打包发布。

一般建立最初的repository时,就建好这三个目录,把所有代码放入/trunk中,如:要将project1目录下的代码导入repository,project1的结构就是:project1/branches,project1/tags,project1/trunk,project1/trunk/food.c,project1/trunk/egg.pc……,然后将project1目录导入repository,建立最初的资料库。然后export回project1,作为本地工作目录。

从trunk(主干上)创建分支(branch)步骤如下:

1. 右键trunk --> branch/Tag 如下图:

[No000098]SVN学习笔记5-分支,合并,属性,补丁,锁,分支图

在弹出的对话框如下图:

[No000098]SVN学习笔记5-分支,合并,属性,补丁,锁,分支图

点击ok按钮后,就可以在VisualSVN Serval服务器上新增newBranch,是从如上服务器qianduan3上的文件拷贝一份的,如下所示:

[No000098]SVN学习笔记5-分支,合并,属性,补丁,锁,分支图

现在我们可以再来看看本地branch文件夹了,我现在直接进入branch文件下,右键 --> Chenckout下,就可以把newBranch下的所有文件提取出来了,如下所示:

[No000098]SVN学习笔记5-分支,合并,属性,补丁,锁,分支图

[No000098]SVN学习笔记5-分支,合并,属性,补丁,锁,分支图

点击ok按钮就可以把文件提取出来了,如下图所示:

[No000098]SVN学习笔记5-分支,合并,属性,补丁,锁,分支图

分支目前建立在svn的服务器端,本地并没有更新,对本地branch文件夹 右键--> update即可,就可以更新到分支代码,如下所示:

[No000098]SVN学习笔记5-分支,合并,属性,补丁,锁,分支图

四:合并分支到主干上

比如我现在对branch分支上新增3.txt文件,然后提交上去,如下所示:

[No000098]SVN学习笔记5-分支,合并,属性,补丁,锁,分支图

我现在想把分支上的代码3.txt合并到主干上trunk,现在要怎么合并呢?步骤如下:

1. 回到我们刚刚的主干(trunk)文件夹下,鼠标右键该文件夹 --> TortoiseSVN --> Merge 如下图所示:

[No000098]SVN学习笔记5-分支,合并,属性,补丁,锁,分支图

在弹出的窗口,如下图所示:

接着点击【Next】下一步,如下图所示:

[No000098]SVN学习笔记5-分支,合并,属性,补丁,锁,分支图

再接着【Next】下一步,如下图所示:

[No000098]SVN学习笔记5-分支,合并,属性,补丁,锁,分支图

[No000098]SVN学习笔记5-分支,合并,属性,补丁,锁,分支图

就可以看到主干trunk上多加了一个3.txt,就是从分支上合并过来的。

五:合并主干到分支。

如果主干上有一些更新,比如说jar包更新等等,那么这些要更新到分支上去,如何操作呢?比如我现在在主干上新建一个4.txt文件,比如如下:

[No000098]SVN学习笔记5-分支,合并,属性,补丁,锁,分支图

我现在的分支上目录如下:

[No000098]SVN学习笔记5-分支,合并,属性,补丁,锁,分支图

现在是想把主干上的4.txt合并到分支上来,要如何操作?

步骤如下,还是和刚刚操作类似.

1. 我们在分支点击branch --> 右键TortoiseSVN --> Merge 如下图所示:

[No000098]SVN学习笔记5-分支,合并,属性,补丁,锁,分支图

在弹出新窗口后,如下图所示:

接着点击【Next】下一步,如下图所示:

[No000098]SVN学习笔记5-分支,合并,属性,补丁,锁,分支图

继续下一步,如下图:

[No000098]SVN学习笔记5-分支,合并,属性,补丁,锁,分支图

最后直接merge,就可以看到分支branch上也有主干上的4.txt文件了,也就是说,合并主干到分支上也是可以的,如下图所示:

[No000098]SVN学习笔记5-分支,合并,属性,补丁,锁,分支图

想在某个文件夹下建立一个新的brance?在该文件夹上右键如下选择。

[No000098]SVN学习笔记5-分支,合并,属性,补丁,锁,分支图

请先确认From WC at URL: 中的目录是您要复制的来源目录。接着,在To URL中输入您要复制过去的路径。

通常我们会将所有的branch集中在一个目录下面。以上面的例子来说,branch档案都会集中在branch的子目录下面。在To URL中您只需要输入您要的目录即可。目录不存在时,会由SVN帮您建立。特别需要注意的是SVN因为斜线作为目录分隔字符,而非反斜线。

接着在Log message输入您此次branch的目的为何。按下OK就可以了。

[No000098]SVN学习笔记5-分支,合并,属性,补丁,锁,分支图

如果想合并分支到主分支上,选择Merge就ok了!

[No000098]SVN学习笔记5-分支,合并,属性,补丁,锁,分支图