在早期版本位置上使用SVN cat

6
假设我有一个文件,它起始于directory1,并且我将该文件移动到revision 2中的directory2。在转储文件中,Node-copyfrom-rev1。如果只知道文件可能之前所在的位置而不确定它将在最新的工作副本中结束在哪里,如何提取文件的内容?
例如,如果我运行 svn cat -r 1 directory1/file.txt
你将无法找到该文件。您需要执行
svn cat -r 1 directory2/file.txt 

需要知道的是,工作副本中的文件最终存在于directory2目录中。
1个回答

10

有两种不同的指定版本的方法:

  1. 使用版本号:svn -r$rev $URL
  2. 使用“固定”的版本号:svn $URL@$rev

可以将第一种方法(普通版本号)看作是获取一个文件的版本,而第二种方法(“固定”版本号)则是获取目录的版本号。

例如,在版本10中,我执行了以下操作:

$ svn co $REPO/trunk/foo
A foo/foo.txt
A foo/bar.txt
$ cd foo
$ svn delete bar.txt
$ svn commit -m"Removed bar.txt in revision 10"
committed revision 11

现在,已经是第20个版本了,我意识到需要查看bar.txt的内容。如果我执行以下操作:

$ svn cat -r10 $REPO/trunk/foo/bar.txt

由于我的存储库 /trunk/foo/bar.txt 中不再有该元素,所以我会收到一个错误。我需要做的是回到版本10中的存储库结构。我可以通过在URL上“固定”版本10来实现:

$ svn cat -r10 $REPO/trunk/foo/bar.txt@10

这将会在仓库的第10个版本中,给我提供bar.txt文件的内容。


实际示例

让我们来看一下我的日志:

$ svn log -v -r161077 $REPO/trunk/Tools/server_tools/
------------------------------------------------------------------------
r161077 | dweintraub | 2013-05-23 17:02:03 -0400 (Thu, 23 May 2013) | 1 line
Changed paths:
   D /trunk/Tools/server_tools/jdescribe.pl

Deleting -- in wrong repository
------------------------------------------------------------------------
$

你可以看到,在我的代码库的第161077个版本中,jdescribe.pl已被删除。因此,如果我想要它,我需要查看第161076个版本:
如果我这样做:
$ svn ls -r161076 $REPO/trunk/Tools/server_tools       
find-required-jars.pl
jdescribe.pl
jenkins-bin/

这就是在第161076版的目录中:

让我们把jdescribe.pl连接起来:

$ svn cat -r161076 $REPO/trunk/Tools/server_tools/jdescribe.pl
svn: warning: W160013: '/svn/TravelClickPD/!svn/rvr/161264/trunk/Tools/server_tools/jdescribe.pl' path not found
svn: E200009: Could not cat all targets because some targets don't exist
svn: E200009: Illegal target for the requested operation
$ 

没有生效。当前目录下没有jdescribe.pl文件。

让我们添加固定版本:

$ svn cat -r161076 $REPO/trunk/Tools/server_tools/jdescribe.pl@161076 | head 
#! /usr/bin/env perl
# description.pl

use 5.12.0;
use warnings;

use LWP::UserAgent;
use HTTP::Request::Common qw(POST);
use Pod::Usage;
use Getopt::Long;

就是那里!


1
通常术语是“操作”和“peg”修订。请参阅在线书籍《使用Subversion进行版本控制》中的章节Peg and Operative Revisions - nosid
谢谢您提供的信息丰富的回复 :) 问题:您能在存储库上执行svn cat吗?我认为它只能应用于工作副本。例如,当我在repo上执行svn list时,我只会得到默认的svn配置文件:README.txt conf/ db/ format hooks/ locks/ - user1431282
我尝试了你上面提到的方法。我注意到在"directory1@1"上执行"svn list"命令时,返回了file.txt文件,但是当我执行"svn cat -r 1 directory1/file.txt@1"命令时,却出现了节点未找到的错误。 - user1431282
@user1431282 - 我已经在我的代码库中更新了答案,并提供了一个真实的示例。 - David W.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接