检查已删除文件的历史logging

如果我在Subversion中删除一个文件,我怎么看它的历史和内容? 如果我尝试执行svn catsvn log不存在的文件,它会抱怨文件不存在。

另外,如果我想重新生成文件,我应该只是svn add回来?

(我特别提到了Subversion,但我也想知道Bazaar,Mercurial和Git是如何处理这个案例的。)

要获取已删除文件的日志,请使用

 svn log -r lastrevisionthefileexisted 

如果要重新生成文件并保留其版本历史logging,请使用

 svn copy url/of/file@lastrevisionthefileexisted -r lastrevisionthefileexisted path/to/workingcopy/file 

如果你只是想要文件内容,但没有版本(例如,快速检查),使用

 svn cat url/of/file@lastrevisionthefileexisted -r latrevisionthefileexisted > file 

在任何情况下,不要使用“svn up”来获取删除的文件!

当你想看看旧的文件,你应该知道的区别:

 svn cat http://server/svn/project/file -r 1234 

 svn cat http://server/svn/project/file@1234 

第一个版本查看现在可用的path为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 

首先find文件被删除的版本号:

 svn log -v > log.txt 

然后看看log.txt(不是一个SVN大师,所以我不知道更好的方法)与一条线

 D <deleted file> 

看看是哪个版本 然后,与其他答案一样,使用先前的修订版重新生成该文件。

这在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 

请注意,这实际上并没有将文件放回修订控制。 它只是将文件以其最终状态存在于当前位置。 然后你可以添加它,或者只是检查它或从这一点。

 svn log -v | grep -B50 YourDeletedFileName 

会得到你的path和修订。 在混帐(也检查重命名):

 git log --diff-filter=DR --name-only | grep -B50 YourDeletedFileName 

仅使用GUI的解决scheme:

如果您知道文件的名称,但不知道其最新版本号或甚至path:

  1. 从Repo浏览器在根上执行“显示日志”
  2. 点击“全部显示”(在日志对话框的底部)
  3. 在“filter”文本框中input文件名(在日志对话框的顶部)

这将只显示文件被添加/修改/删除的那些修订。 这是你的文件的历史。

请注意,如果通过删除其父文件夹之一来删除该文件,则日志中将不会有“已删除”条目(因此mjy的解决scheme将不起作用)。 在这种情况下,过滤日志中的最新条目将与删除时的内容相对应。

除了达斯汀的回答,如果你只是想检查内容,而不是检查出来,在他的例子中,你可以这样做:

 $ git show 8d4a1f^:slosh.tac 

:在该修订版本中分离修订版本和path,在特定版本中有效地请求特定path。

使用这个命令:

 svn log -v | awk '/^r[0-9]+/ { rev = $1; }; / D .*filename_escaped_for_regex/ { print rev" "$2; };' 

这将列出删除了与该模式匹配的所有文件的所有修订。 也就是说,如果您正在search文件README,则会find并列出/src/README/src/README /src/README.first/some/deeply/hidden/directory/READMENOT所有文件。

如果您的文件名包含斜杠(path),点或其他特殊的正则expression式字符,不要忘记转义它们以避免不匹配或错误。

啊,因为我正在学习使用集市,这是我尝试过的。 没有成功,看来你不能login和注释当前删除的文件 … 🙁

尝试:

 > bzr log -r 3 Stuff/ErrorParser.hta bzr: ERROR: Path does not have any revision history: Stuff/ErrorParser.hta 

但好奇地(幸好)我可以这样做:

 > bzr cat -r 3 Stuff/ErrorParser.hta 

和:

 > bzr diff -r 2..3 Stuff/ErrorParser.hta 

并按照上面的错误build议:

 > bzr log -v | grep -B 1 ErrorParser 

(根据需要调整-B (– --before-context )参数)。

如果你不知道被删除文件的path,事实certificate,你可以在其他重量过大的svn log命令中search它:

 svn log --search <deleted_file_or_pattern> -v 

这个命令可能会像没有search选项那样敲击服务器,但至less剩下的涉及到的资源(包括眼球)会有所缓解,因为这会告诉你在哪个版本中该文件被删除。 然后,您可以按照其他技巧(主要使用相同的svn log命令,但已经在一个定义的path)。

海报实际上在这里问了3个问题:

  1. 我如何查看Subversion中已删除文件的历史logging?
  2. 我如何查看Subversion中已删除文件的内容?
  3. 如何在Subversion中重新生成已删除的文件?

我在这里看到的所有答案都是针对问题2和问题3的。

问题1的答案是:

 svn log http://server/svn/project/file@1234 

当文件最后存在时,您仍然需要获取修订号,这在这里很明显得到了回答。

您将需要指定一个修订。

 svn log -r <revision> <deleted file> 

如果你想在重命名之前查看一个文件的历史logging,那么在这里的注释中提到,你可以使用

 git log --follow -- current_file_name 

我自己想要一个答案。 尝试以下从svn log只输出删除。

 svn log --stop-on-copy --verbose [--limit <limit>] <repo Url> | \ awk '{ if ($0 ~ /^r[0-9]+/) rev = $0 } { if ($0 ~ /^ D /) { if (rev != "") { print rev; rev = "" }; print $0 } }' 

这通过awk过滤日志输出。 awkcachingfind的每个修订行,只有在find删除logging时才输出它。 每个版本只输出一次,因此修订版本中的多个删除被组合在一起(如在标准的svn log输出中)。

您可以指定一个--limit来减less返回的logging数量。 您也可以根据需要删除 – --stop-on-copy

我知道有关于parsing整个日志的效率的抱怨。 我认为这是一个比grep更好的解决scheme,它的“广泛的networking” -B选项。 我不知道它是否更有效率,但我不能想到一个替代svn log 。 这与@Alexander Amelkin的答案类似,但不需要特定的名称。 这也是我的第一个awk脚本,所以它可能是非常规的。

我写了一个PHP脚本,将我所有仓库的svn日志复制到一个mysql数据库中。 我现在可以对我的评论或文件名进行全文search。

您可以使用二分查找find提供该文件的最后一个版本。 我为此创build了一个简单的/bin/bash脚本:

 function svnFindLast(){ # The URL of the file to be found local URL="$1" # The SVN revision number which the file appears in (any rev where the file DOES exist) local r="$2" local R for i in $(seq 1 "${#URL}") do echo "checkingURL:'${URL:0:$i}'" >&2 R="$(svn info --show-item revision "${URL:0:$i}" 2>/dev/null)" echo "R=$R" >&2 [ -z "$R" ] || break done [ "$R" ] || { echo "It seems '$URL' is not in a valid SVN repository!" >&2 return -1 } while [ "$r" -ne "$R" -a "$(($r + 1))" -ne "$R" ] do T="$(($(($R + $r)) / 2))" if svn log "${URL}@${T}" >/dev/null 2>&1 then r="$T" echo "r=$r" >&2 else R="$T" echo "R=$R" >&2 fi done echo "$r" } 

假设你的文件被命名为〜/ src / a / b / c / deleted.file

 cd ~/src/a/b/c # to the directory where you do the svn rm or svn mv command #cd ~/src # if you forget the correct directory, just to the root of repository svn log -v | grep -w -B 9 deleted.file | head # head show first 10 lines 

样本输出,发现在r90440

 ... r90440 | user | 2017-02-03 11:55:09 +0800 (Fri, 03 Feb 2017) | 4 lines Changed paths: M /src/a/b/c/foo M /src/a/b/c/bar D /src/a/b/c/deleted.file 

将其复制回以前的版本(90439 = 90440-1)

 svn cp URL_of_deleted.file@90439 . 
Interesting Posts