从SVN恢复已删除文件的正确方法是什么?

时间:2009-01-29 04:59:01

标签: svn tortoisesvn restore

我从回购中删除了一个文件,现在想把它放回去。我能想到的最好的是:

  • 更新到删除前的修订
  • 将文件复制到别处
  • 更新到头
  • 将文件复制回来
  • 添加
  • 提交

这只是闻起来很糟糕而且它失去了所有历史记录。必须有一个更好的方法来做到这一点。我已经查看The SVN Book但没有找到任何内容,现在正在查看SVN标记列表。

9 个答案:

答案 0 :(得分:164)

Sean Bright建议进行svn合并的问题是重新引入与删除相同的修订版中的其他更改。 svn副本是一种更有针对性的操作,只会影响已删除的文件。

使用Tortoise SVN,您可以通过svn副本恢复已从工作副本目录和后续SVN版本中删除的文件,如下所示:

  • 浏览到之前包含该文件的工作副本文件夹。
  • 右键单击资源管理器中的文件夹,转到TortoiseSVN - >显示日志。
  • 在删除文件的修订版之前右键单击修订版号,然后选择“浏览存储库”。
  • 右键单击已删除的文件,然后选择“复制到工作副本...”并保存。

删除的文件现在将位于工作副本文件夹中。要重新添加回SVN,请右键单击已恢复的文件,然后选择SVN Commit。

注意:此方法将保留已恢复文件的先前历史记录,但要查看TortoiseSVN日志中的先前历史记录,您需要确保在“日志消息”对话框中取消选中“停止复制/重命名”。

答案 1 :(得分:53)

使用svn merge:

svn merge -c -[rev num that deleted the file] http://<path to repository>

这是一个例子:

svn merge -c -12345 https://svn.mysite.com/svn/repo/project/trunk
             ^ The negative is important

对于TortoiseSVN(我认为......)

  • 在资源管理器中右键单击,转到TortoiseSVN - &gt;合并...
  • 确保选中“合并一系列修订”,然后单击“下一步”
  • 在“要合并的修订范围”文本框中,指定删除文件的修订
  • 选中“反向合并”复选框,然后单击“下一步”
  • 点击合并

然而,这是完全未经测试的。


由OP 编辑:这适用于我的TortoiseSVN版本(没有下一个按钮的旧版本)

  • 转到
  • 所涉及的文件夹
  • 在资源管理器中右键单击,转到TortoiseSVN - &gt;合并...
  • 发件人部分输入执行删除的修订
  • 部分中输入删除前的修订。
  • 点击“合并”
  • 提交

诀窍是向后合并 。感谢 sean.bright 让我指向正确的方向!


编辑我们正在使用不同的版本。我描述的方法与我的TortoiseSVN版本完美配合。

另外值得注意的是,如果提交中存在多个更改,则您将进行反向合并,一旦在提交之前完成合并,您将需要还原其他更改。如果不这样做,那些额外的改变也将被逆转。

答案 2 :(得分:26)

为了完整起见,这是你在svn书中找到的,如果你知道要找什么。这是你已经发现的:

Undoing Changes

Resurrecting Deleted Items

同样的事情,来自本书的最新(和详细)版本:

Undoing Changes

Resurrecting Deleted Items

答案 3 :(得分:16)

使用Tortoise SVN复制功能还原提交的更改:

  1. 右键单击包含已删除文件/文件夹的父文件夹
  2. 选择“显示日志”
  3. 选择并右键单击已完成更改/删除的版本
  4. 选择“浏览存储库”
  5. 选择需要恢复的文件/文件夹,然后右键单击
  6. 选择“复制到”,将文件/文件夹复制到主要版本
  7. 希望有所帮助

答案 4 :(得分:11)

我似乎总是使用svn copy作为服务器操作,所以不确定它是否适用于两个工作路径。

以下是将已删除的文件还原到项目的本地工作副本中的示例:

svn copy https://repos/project/modules/module.js@3502 modules/module.js

在项目目录中。这也适用于恢复整个目录。

答案 5 :(得分:5)

如果您正在使用Tortoise SVN,您应该能够将更改从该修订版还原到您的工作副本(有效执行反向合并),然后再执行一次提交以重新添加该文件。要遵循的步骤是:

  1. 浏览到删除文件的工作副本中的文件夹。
  2. 转到repo-browser。
  3. 浏览到删除文件的修订版。
  4. 在更改列表中,找到您删除的文件。
  5. 右键单击该文件,然后转到“从此修订版还原更改”。
  6. 这会将文件还原到您的工作副本,保留历史记录。
  7. 提交文件以将其添加回存储库。

答案 6 :(得分:4)

使用Tortoise SVN

  

如果您尚未提交更改,则可以对删除文件或目录的父文件夹进行还原。

     

如果您已提交已删除的文件,则可以使用存储库浏览器,切换到文件仍然存在的修订版本,然后使用上下文菜单中的“复制到...”命令。输入工作副本的路径作为目标,删除的文件将从存储库复制到工作副本。

答案 7 :(得分:4)

我能够恢复文件而不是丢失修订历史记录的最简单方法是使用 SVN copy ,上面的合并示例对我来说似乎是一种更复杂的方法来实现同样的目的。当您只想恢复修订时,为什么需要合并?

我在这个例子中使用以下内容并且效果很好。

svn copy -m 'restoring file' -r <rev_number_file_to_restore> http://from/file.cs http://pathTo/file.cs

我似乎总是使用svn copy作为服务器操作,所以不确定它是否适用于两个工作路径。

答案 8 :(得分:0)

您应该只能查看要还原的文件。尝试类似svn co svn://your_repos/path/to/file/you/want/to/restore@rev的内容,其中rev是文件存在的最后修订版。

我不得不在不久前做到这一点,如果我没记错的话,使用-r svn选项不起作用;我不得不使用:rev语法。 (虽然我可能已经记住它倒退了......)