我使用SmartSVN作为Subversion的前端。有时,存储库控制下的源文件变得多余 - 我根本不再需要它。在这种情况下,我想删除它,因为更新工作副本不再从存储库中提取文件。但我仍然希望文件的历史记录(即先前提交的修订版)保留在存储库中。
如果我没记错的话,SmartSVN的Remove
命令会删除文件的历史记录(我显然对此进行验证犹豫不决)。如果我弄错了,请纠正我。否则:我怎样才能达到预期效果?
编辑:使用虚拟文件,确认Remove
完全从SVN控件中删除文件,并且其历史记录不再可见。所以问题是真的。
答案 0 :(得分:4)
Subversion永远不会从存储库中完全删除文件。事实上,这是一个很好的功能。
您执行svn delete
或svn rm
,该文件不再位于工作副本中。但是,它肯定还在那里。什么可能使你确信该文件已被永久删除,就是你正在做这样的事情:
$ svn co http://repo/svn/project
[...]
$ cd project
$ svn del foo.txt
$ svn commit -m "Removed foo.txt"
committed version 12345
$ svn ls http://repo/svn/project/foo.txt
No such file
这是事实。文件foo.txt
不再是最新版本的Subversion。
也许你做过这样的事情:
您知道该文件不在修订版12345中,因为您将其删除了。但是,让我们看一下修订版12344.该文件应该仍然存在于那个版本中:
$ svn ls -r12344 http://repo/svn/project/foo.txt
No such file
看,修订版不在修订版12344中。因此,它已被永久删除。
没那么快,Bunky。您请求的是存储库布局的当前版本中的文件的修订版12344。您需要做的是了解文件修订版和存储库修订版之间的区别。这称为revision pegging,可能是Subversion中比较困难的概念之一。
您希望看到的是REPOSITORY的第12,344次修订版中的文件。为此,您将@
放在存储库URL的末尾:
$ svn ls http://repo/svn/project/foo.txt@12344
foo.txt
现在,我们可以看到该文件,因为它位于该存储库布局的第12,344个修订版中。如果您需要取消删除该文件,您始终可以从存储库布局的挂钩修订版中复制所需文件的修订版本:
$ svn cp -r12344 -m"undeleting foo.txt" \
http://repo/svn/project/foo.txt@12344 \
http://repo/svn/project
这会将存储库的第12,344个版本的文件foo.txt
的修订版12344复制到存储库的当前版本。
查找已删除文件的最简单方法是查看svn log
:
$ svn log -rHEAD -v http://repo/svn/project/foo.txt
r12345 | dweintraub | [...]
Removed foo.txt
D /project/foo.txt
-----------------------------------------------------
我删除了修订版12345中的文件`foo.txt。因此,它仍然存在于修订版12344中。很高兴知道我是否需要取消删除该文件。
是的,在这种情况下,我必须请求修改文件和Subversion布局似乎很愚蠢,因为它们都是相同的。然而,事情并非总是如此。文件被移动并复制,删除和取消删除。我想要的文件版本可能与我正在寻找的存储库版本不同。
答案 1 :(得分:1)
在SmartSVN中:
选择文件/文件夹 - >右键单击 - > "在资源库浏览器中打开" - >右键单击要删除的文件/文件夹 - > "删除..."
答案 2 :(得分:0)
我接受了David W.的答案 - 它从Subversion的观点(基于命令行)正确描述了事物的状态。由于我使用SmartSVN作为GUI前端,我想从这个角度添加适当的信息。
使用SmartSVN查看已删除文件的历史记录,
Repository | Show Revision
命令Revision
单选按钮;然后单击Select
按钮然后,您将看到该文件,前提是该文件存在于您选择的存储库版本中。
请注意,所选文件夹确定显示哪些文件(似乎没有像在项目窗口中那样显示所有文件的方式),以及显示哪些存储库修订以供选择。