我有svn的repo,我已经删除了一个文件在过去的某个地方,我怎么能从svn的历史获取该文件?假设我现在的版本是2000,文件是在1950年删除的
svnbook有一个关于如何处理这个问题的主题。
基本上可以归结为:
- 如果在提交中只删除了文件,可以使用
svn merge -c -revnum
来恢复文件。 - 如果在提交中有其他更改,您可以从删除之前的版本复制文件——
svn copy file@revnum file
如果你只想"获取"文件,你可以这样做:
svn cat -r 1950 file > file
,但是正如已经指出的,这不会检索任何文件历史记录,并且会被SVN视为一个全新的文件。
- 首先,运行
svn log -v
,看看是否可以找到删除文件的版本。 - 一旦你找到了文件被删除的地方,你可以使用
svn merge
或svn cp
来恢复文件。
假设您需要在trunk/proj/mydir
中恢复foo.txt
:
$ svn log -v $REPO/trunk/proj/mydir | less
然后,您可以使用/D .*foo.txt
搜索文件的较小输出。您发现该文件在修订版本1235中被删除:
如果这是1235版本所做的唯一的事情,或者您决定要撤销该版本中的其余内容,您可以使用svn merge -c
:
$ svn co --depth=immediates $REPO/trunk/proj/mydir # No need to checkout sub directories too
$ cd mydir
$ svn merge -c -1235 . # Undoes the delete
$ svn commit -m "Restored file 'foo.txt' deleted in revision 1235"
有时您只是想恢复文件,而不是该修订中的所有其他更改。在这种情况下,使用svn cp
命令。如果您愿意,您可以在不执行checkout的情况下执行此操作:
$ svn cp -r1234 -m"Restored $foo.txt removed in rev 1235"
$REPO/trunk/proj/mydir/foo.txt@1234 $REPO/trunk/myproj
或者你可以通过checkout来完成:
$ svn co --depth=immediates $REPO/trunk/proj/mydir # No need to checkout sub directories too
$ cd mydir
$ svn cp -r1234 foo.txt@1234 . # Undoes the delete
$ svn commit -m "Restored file 'foo.txt' deleted in revision 1235"
请注意,我使用版本1234而不是1235,因为该文件在版本1235中被删除,并且在该版本中不存在。我使用-r
来指定我想要foo.txt
的1234
版本,并在URL的末尾指定@1234
,以指定该文件存在于存储库目录布局的1234
版本中。