Subversion 永远不会从存储库中完全删除文件。事实上,这是一个很好的功能。
您执行svn delete
or 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版本里没有revision,所以已经永久删除了。
没那么快,邦基。您请求的是存储库布局的当前修订版中文件的修订版 12344。您需要做的是了解文件修订版和存储库修订版之间的区别。这被称为修订挂钩,并且可能是 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 修订版的文件的修订版 12344 复制foo.txt
到存储库的当前修订版。
查找已删除文件的最简单方法是查看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 布局可能看起来很愚蠢,因为它们都是相同的。但是,情况并非总是如此。文件被移动和复制、删除和取消删除。我想要的文件版本可能与我正在寻找的存储库版本不同。