如何从svn存储库中删除文件

时间:2014-03-25 13:20:33

标签: file svn restore

我有svn repo并且我在过去的某个地方删除了一个文件,如何从svn历史记录中获取该文件?假设我现在正在使用rev 2000,该文件已于1950年删除。

3 个答案:

答案 0 :(得分:2)

如果您只想“获取”该文件,可以执行以下操作:

svn cat -r 1950 file > file

但正如已经指出的那样,这将不会检索任何文件历史记录,并且SVN会将其视为一个全新的文件。

答案 1 :(得分:2)

svnbook有topic关于如何处理这个问题。

它基本归结为:

  • 如果文件删除是提交中的唯一内容,则可以使用svn merge -c -revnum恢复文件。
  • 如果提交中有其他更改,您可以在删除文件之前复制该文件 - svn copy file@revnum file

答案 2 :(得分:1)

  1. 首先,运行svn log -v,看看是否可以找到删除该文件的修订版。
  2. 找到文件的删除位置后,您可以使用svn mergesvn cp来恢复该文件。
  3. 我们假设您需要在foo.txt中恢复trunk/proj/mydir

    $ 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命令。如果您愿意,可以在不办理结账的情况下执行此操作:

    $ svn cp -r1234 -m"Restored $foo.txt removed in rev 1235" \
           $REPO/trunk/proj/mydir/foo.txt@1234 $REPO/trunk/myproj
    

    或者你可以通过结账来做到这一点:

    $ 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指定我需要1234的修订版foo.txt,并在网址末尾指定@1234以指定文件存在于修订版1234中存储库目录布局。