5.12. 删除、重命名和移动

不像CVS,Subversion允许重命名和移动文件和目录。因此在TortoiseSVN 的子菜单中有删除和重命名的菜单项。

图 5.25. 版本控制文件的菜单浏览

版本控制文件的菜单浏览

如果你通过TSVN删除了一个文件/目录,吗呢这个文件被移出你的工作副本并标记为删除。该文件的父目录会覆盖上一个"删除"标记。你随时可以通过在父目录调用TortoiseSVNRevert命令来恢复该文件。

如果你想在工作副本中移动文件,那么可以这样使用鼠标拖拽:

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

  2. 拖拽(right-drag)他们到新的工作副本下,

  3. 松开鼠标右键

  4. 在弹出菜单选择上下文菜单SVN 移动文件

[小心]不要使用 SVN 移动外部连接

不应该用TortoiseSVN的移动重命名命令作用在一个已经用svn:externals创建的目录上。因为这个动作可能会导致外部的元素(item)被从他的父版本库中删除,这可能会使其他很多人烦恼。如果你必须移动洋外部的目录,你应该使用一个普通的shell移动,然后调整源文件和目的文件的父目录的svn:externals道具。

如果一个 文件 是通过浏览器而不是使用TortoiseSVN 快捷菜单被删除,提交对话框也会显示这些文件并让你在提交前把他们从版本控制中移除。可是,如果你更新你的工作副本, Subversion 将会混淆这个丢失文件并替换他为版本库中的最新版本。因此,如果你需要删除一个版本控制下的文件,请始终使用TortoiseSVNDelete保证 Subversion不去猜测你到底想干什么。

如果一个 目录 是通过浏览器而不是使用TortoiseSVN 快捷菜单被删除,你的工作副本将回被损坏,并且你将不能提交。如果你更新你的工作副本,如果你更新你的工作副本, Subversion 将用版本库中的最新版本替换已丢失目录。接下来你就可以使用TortoiseSVNDelete这种正确的方法来删除它了。

[小心]提交父目录

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

必须在重命名目录后而在更改目录下的任何文件前进行提交,不然你的工作副本就回真的混淆。

[提示]找回已删除的文件或目录

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

5.12.1. 仅在单一实例中重命名文件

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

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

这里(至少)有两种可能的解决方案来重命名文件而不丢失他的日志记录。在subversion里重命名它是很重要的。仅在浏览器中重命名将会损坏你的工作副本。

解决方案 A)(推荐)

  1. 提交你工作副本中的改变到版本库

  2. 使用版本库的浏览器立即重命名该文件的大写(小写)为小写(大写)

  3. 更新你的工作副本

解决方案 B)

  1. 使用TortoiseSVN子菜单中的重命名命令将UPPERcase重命名为UPPERcase_ 格式

  2. 提交该更改

  3. 将UPPERcase_重命名为upperCASE格式

  4. 提交该更改

[提示]防止两个文件名字相同

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

5.12.2. 修复文件改名

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

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

5.12.3. 删除未版本控制的文件

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

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

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