svn cat
或svn log
,它会报告文件不存在。此外,如果我想恢复该文件,我只需要使用
svn add
重新添加它吗?(我特别询问了Subversion,但我也想了解Bazaar、Mercurial和Git如何处理这种情况。)
svn cat
或svn log
,它会报告文件不存在。svn add
重新添加它吗?当你想查看旧文件时,你真的应该知道以下两者之间的区别:
svn cat http://server/svn/project/file -r 1234
并且
svn cat http://server/svn/project/file@1234
第一个版本查看现在可用的路径,例如http://server/svn/project/file,并检索该文件在版本1234中的内容(因此此语法不适用于文件删除后)。
第二个语法获取在版本1234中作为http://server/svn/project/file可用的文件。因此,此语法可在删除文件时使用。
您甚至可以结合这些方法,检索在2345版本中作为http://server/svn/project/file可用的文件,但其内容与1234版本相同:
svn cat http://server/svn/project/file@2345 -r 1234
首先,找到文件被删除的修订版本号:
svn log -v > log.txt
那么就查看 log.txt(作为一个SVN非专业人士,我不知道更好的方式)中是否有一行包含
的内容。D <deleted file>
查看是哪个版本,然后像其他答案中一样,使用先前的版本恢复文件。
要获取已删除文件的日志,请使用
svn log -r lastrevisionthefileexisted
如果你想恢复文件并保留其版本历史记录,请使用
svn copy url/of/file@lastrevisionthefileexisted -r lastrevisionthefileexisted path/to/workingcopy/file
如果您只是想获取文件内容,但不需要版本信息(例如进行快速检查),请使用:
svn cat url/of/file@lastrevisionthefileexisted -r latrevisionthefileexisted > file
无论如何,不要使用'svn up'来获取已删除的文件!
在 Git 中并没有什么特别的地方。如果你知道文件的名称,你可以通过日志找到删除它的更改:
git log -n 1 -- filename
那么你可以使用该提交记录来获取文件在删除之前的版本。
git checkout [last_revision]^ filename
dhcp-120:/tmp/slosh 587% ls -l slosh.tac
ls: slosh.tac: No such file or directory
dhcp-120:/tmp/slosh 588% git log -n 1 -- slosh.tac
commit 8d4a1f1a94e4aa37c1cb9d329a140d08eec1b587
Author: Dustin Sallings <dustin@spy.net>
Date: Mon Dec 15 11:25:00 2008 -0800
Get rid of a .conf and replace it with .tac.
dhcp-120:/tmp/slosh 589% git checkout 8d4a1f^ slosh.tac
dhcp-120:/tmp/slosh 590% ll slosh.tac
-rw------- 1 dustin wheel 822 Dec 30 12:52 slosh.tac
请注意,这并没有实际将文件放回版本控制中。它只是将文件以其最终状态的形式丢到当前位置。然后,您可以从那一点开始添加它,检查它或者进行其他操作。仅使用 GUI 的解决方案:
如果你知道文件的名称,但是不知道其最后修订号码甚至路径:
这将只显示该文件被添加 / 修改 / 删除的修订。 这就是该文件的历史记录。
请注意,如果通过删除其中一个父文件夹来删除文件,则它不会在日志中有“已删除”的条目(因此 mjy 的解决方案不适用)。 在这种情况下,它在筛选日志中的最新条目将对应于其删除时的内容。
svn log -v | grep -B50 YourDeletedFileName
这将为你提供路径和版本。在Git中(还会检查重命名):
git log --diff-filter=DR --name-only | grep -B50 YourDeletedFileName
如果您不知道已删除文件的路径,可以在过于繁重的svn log
命令中搜索它:
svn log --search <deleted_file_or_pattern> -v
这个命令可能会像没有搜索选项时一样使服务器繁忙,但是至少其他相关资源(包括你的眼睛)会有所减轻,因为它会告诉你该文件在哪个版本中被删除。然后,您可以遵循其他提示(主要是使用相同的svn log
命令,但已在定义路径上执行)。
使用此命令:
svn log -v | awk '/^r[0-9]+/ { rev = $1; }; / D .*filename_escaped_for_regex/ { print rev" "$2; };'
$ git show 8d4a1f^:slosh.tac
冒号(:)在一个版本和该版本中的路径之间进行分隔,有效地要求在特定版本中获取特定路径。
svn log http://server/svn/project/file@1234
./local
目录不存在时,我的本地svn客户端无法解析./local/file
而出现错误。这可能不是较新版本的SVN的问题。 - Derrick Rice^
符号很方便:它指的是存储库根目录,因此您可以说svn cat ^/local/file@REV
(取决于存储库根目录和URL之间的距离)。 - musiphil