[No000098]SVN学习笔记5-分支,合并,属性,补丁,锁,分支图
Posted 文 武
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[No000098]SVN学习笔记5-分支,合并,属性,补丁,锁,分支图相关的知识,希望对你有一定的参考价值。
行结束符和空白选项
在项目的生命周期中,有时可能会将行结束符由 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的原因。
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.
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.
增加和编辑属性
要添加一个新的属性,先点击新建... 。从菜单中选择需要的属性名称,然后在特定的属性对话框内填写所需的信息。
想添加没有自己的对话框的属性,从新建... 菜单中选择高级 。然后从组合框中选择已经存在的属性或者输入自定义的属性名称。
如果你想一次性设置许多文件的属性,在资源管理器中选择文件/文件夹,然后选择右键菜单 → 属性。
如果你想设置当前文件夹内的全部文件和文件夹,选中递归检查框。
如果你想编辑一个已有属性,在已有属性列表中选择它,然后单击编辑...即可。
如果你想删除已有属性,在已有属性列表中选择它,然后单击删除即可。
属性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 genera
以上是关于[No000098]SVN学习笔记5-分支,合并,属性,补丁,锁,分支图的主要内容,如果未能解决你的问题,请参考以下文章