检查已删除文件的历史logging
如果我在Subversion中删除一个文件,我怎么看它的历史和内容? 如果我尝试执行svn cat
或svn 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:
- 从Repo浏览器在根上执行“显示日志”
- 点击“全部显示”(在日志对话框的底部)
- 在“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个问题:
- 我如何查看Subversion中已删除文件的历史logging?
- 我如何查看Subversion中已删除文件的内容?
- 如何在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 .