检查已删除文件的历史记录

Ben*_*son 155 svn version-control bazaar

如果我在Subversion中删除文件,我该如何查看它的历史和内容?如果我尝试执行svn catsvn log在不存在的文件上,它会抱怨该文件不存在.

另外,如果我想恢复文件,我应该svn add回来吗?

(我特意询问了Subversion,但我也想听听Bazaar,Mercurial和Git如何处理这个案例.)

Ber*_*ben 146

当你想查看旧文件时,你真的应该知道它们之间的区别:

svn cat http://server/svn/project/file -r 1234
Run Code Online (Sandbox Code Playgroud)

svn cat http://server/svn/project/file@1234
Run Code Online (Sandbox Code Playgroud)

第一个版本看起来那是路径现在可以作为HTTP://服务器/ SVN /项目/文件和检索文件,因为它是在修订1234(所以这句法并没有一个文件后,工作删除).

第二个语法获取可用的文件HTTP://服务器/ SVN /项目/文件在修订1234所以这句法DOES上删除的文件的工作.

您甚至可以组合这些方法来检索版本2345中可用的文件http:// server/svn/project/file, 但其内容与1234中的内容一样:

svn cat http://server/svn/project/file@2345 -r 1234
Run Code Online (Sandbox Code Playgroud)

  • 嗨,谢谢!目前在这个帖子中的最高回应并没有提到这一点,这太棒了! (7认同)
  • @DerrickRice:在这种情况下,`^`表示法很方便:它指的是存储库根目录,所以你可以说`svn cat ^/local/file @ REV`(取决于存储库根目录和URL之间的距离). (2认同)

mjy*_*mjy 92

首先,找到文件被删除的修订号:

svn log -v > log.txt
Run Code Online (Sandbox Code Playgroud)

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

D <deleted file>
Run Code Online (Sandbox Code Playgroud)

并查看是哪个版本.然后,与其他答案一样,使用先前的修订版重新恢复文件.

  • svn log -v | grep D"file.name" (22认同)
  • +1是第一个正确回答问题的人.如果在删除之前不知道修订,则无法查看内容. (18认同)
  • @abatishchev这将获取已删除文件的列表,但会丢弃修订信息,因此它没用.如果您正在使用具有大量更改历史记录的大型/旧存储库,那么它也会很慢. (8认同)
  • 好,很好,@ abatishchev的改进.tchen:使用-B50左右的参数轻松修复grep,看看我的答案. (4认同)
  • 限制非常大/旧存储库的svn log -v输出的另一个好方法是-l选项.所以你可以使用svn log -v -l 100 | grep D"file.name" (2认同)

Ste*_*fan 80

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

svn log -r lastrevisionthefileexisted
Run Code Online (Sandbox Code Playgroud)

如果要恢复文件并保持其版本历史记录,使用

svn copy url/of/file@lastrevisionthefileexisted -r lastrevisionthefileexisted path/to/workingcopy/file
Run Code Online (Sandbox Code Playgroud)

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

svn cat url/of/file@lastrevisionthefileexisted -r latrevisionthefileexisted > file
Run Code Online (Sandbox Code Playgroud)

在任何情况下,不要使用"svn的最高",以获得已删除的文件回来了!

  • 诀窍是:你如何找到lastrevisionthefile存在? (184认同)
  • 简单:使用'-v'开关显示父文件夹的日志:您将为每个条目获取已更改路径的列表.找到前面带有"D"的文件和已删除文件的名称.这是文件被删除的修订版. (71认同)
  • 这似乎不适用于已删除的文件.如果我试试这个,我收到此错误消息:svn cat [url] /trunk/include/syeka/poster_funk.incl.php -r 50> out.txt svn:'/ admintools /!svn/bc/131/trunk/include/syeka/poster_funk.incl.php'找不到路径请参阅@Bert Huijben对该线程的进一步回答以获得有效的解决方案. (7认同)
  • 但是,如何查看文件的整个历史记录? (5认同)
  • 您还可以通过对删除它的修订版进行反向合并来重新生成文件.这是SVN文档中建议的过程.至于使用"svn up",它不是"不要做"的问题,因为"它不会做你想做的事情". (2认同)
  • 如果我有一个100,000次提交的回购,"lastrevisionthefileexisted"不容易找到! (2认同)

Dus*_*tin 27

在git中没什么特别的.如果您知道该文件的名称,则可以找到使用日志删除它的更改:

git log -n 1 -- filename
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用该提交来获取删除前存在的文件.

git checkout [last_revision]^ filename
Run Code Online (Sandbox Code Playgroud)

例:

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
Run Code Online (Sandbox Code Playgroud)

请注意,这实际上并没有将文件放回版本控制中.它只是将文件以其最终状态存在于当前位置.然后,您可以添加它或只是检查它或从那一点开始的任何事情.

  • 精彩的回答.唯一的问题是关于svn的问题! (6认同)

Mar*_*man 16

仅使用GUI的解决方案:

如果您知道文件的名称,但不知道其上一个修订号或甚至其路径:

  1. 从Repo浏览器在根目录上执行"显示日志"
  2. 点击"全部显示"(在日志对话框的底部)
  3. 在Filter文件框中输入文件名(在日志对话框的顶部)

然后,这将仅显示添加/修改/删除文件的那些修订.这是您的文件历史记录.

请注意,如果通过删除其中一个父文件夹删除文件,则日志中不会有"已删除"条目(因此mjy的解决方案将无效).在这种情况下,过滤日志中的最新条目将与删除时的内容相对应.

  • 请注意,上述答案适用于 TortoiseSVN GUI。 (2认同)

Jon*_*röm 13

svn log -v | grep -B50 YourDeletedFileName
Run Code Online (Sandbox Code Playgroud)

将为您提供路径和修订.在git中(也检查重命名):

git log --diff-filter=DR --name-only | grep -B50 YourDeletedFileName
Run Code Online (Sandbox Code Playgroud)


Pie*_*ter 8

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

$ git show 8d4a1f^:slosh.tac
Run Code Online (Sandbox Code Playgroud)

:分隔该修订版中的修订版和路径,有效地要求特定修订版的特定路径.


Ale*_*kin 8

使用此命令:

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

这将列出所有删除任何与模式匹配的文件的修订.也就是说,如果您正在搜索的README文件,那么所有的/src/README,/src/README.first以及/some/deeply/hidden/directory/READMENOT会被发现并列出.

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


dek*_*ard 5

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

  1. 我如何查看Subversion中已删除文件的历史记录?
  2. 如何查看Subversion中已删除文件的内容?
  3. 如何在Subversion中恢复已删除的文件?

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

问题1的答案是:

svn log http://server/svn/project/file@1234
Run Code Online (Sandbox Code Playgroud)

您仍然需要获取文件上次存在的修订版本号,这里其他人显然会回答。


JMB*_*JMB 5

如果您不知道已删除文件的路径,那么您可以在其他所有太重的命令中搜索svn log:

svn log --search <deleted_file_or_pattern> -v
Run Code Online (Sandbox Code Playgroud)

该命令可能与没有搜索选项的情况下的服务器一样多,但至少其余涉及的资源(包括您的眼球)将会有所缓解,因为这将告诉您该文件被删除的修订版本.然后,您可以按照其他提示(主要使用相同的svn log命令,但已经在定义的路径上).

  • http://subversion.apache.org/docs/release-notes/1.8.html#svn-log-search (2认同)