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

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

  • update to the revision before the delete
  • 把文件拷贝到别处
  • 更新到头部
  • copy the files back
  • 加上他们
  • 承诺

只是闻起来很糟糕,而且它失去了所有的历史。肯定有更好的办法。我已经在 SVN 书中找过了,但是没有找到任何东西,现在我正在查看 SVN 标签列表。

126673 次浏览

使用 svn 合并:

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-> Merge..。
  • 确保“合并一系列修订”被选中,单击“下一步”
  • 在“ Revisionrange to merge”文本框中,指定删除文件的版本
  • 选中“反向合并”复选框,单击“下一步”
  • 单击“合并”

然而,这是完全未经检验的。


编辑 OP : 这个工作在我的 TortoiseSVN 版本(没有下一个按钮的旧版本)上

  • 去那个文件夹看看那些东西是从哪里删除的
  • 右键单击资源管理器,转到 TortoiseSVN-> Merge..。
  • 部分输入删除的修订
  • 部分中,在删除之前输入修订。
  • 点击“合并”
  • 承诺

技巧是合并 倒过来。值得称赞的是 Sean Bright为我指出了正确的方向!


编辑: 我们使用了不同的版本。

另外值得注意的是,如果在反向合并的提交中有多个更改,那么在合并完成之后提交之前,需要恢复这些其他更改。如果您不这样做,那些额外的变化也将被逆转。

您应该能够只签出要还原的一个文件。尝试使用类似于 svn co svn://your_repos/path/to/file/you/want/to/restore@rev的代码,其中 rev是文件存在的最后一个版本。

刚才我不得不这样做,如果我没有记错的话,对 svn使用 -r选项不起作用; 我必须使用 :rev语法。(虽然我可能记得倒过来...)

乌龟 SVN:

如果还没有提交更改,可以对删除文件或目录的父文件夹进行恢复。

If you have already committed the deleted file, then you can use the repository browser, change to the revision where the file still existed and then use the command Copy to... from the context menu. Enter the path to your working copy as the target and the deleted file will be copied from the repository to your working copy.

如果您正在使用 Tortoise SVN,那么您应该能够将修订中的更改恢复到您的工作副本中(有效地执行逆向合并) ,然后再次提交以重新添加文件。下面的步骤是:

  1. 浏览到删除文件的工作副本中的文件夹。
  2. 进入回收浏览器。
  3. Browse to revision where you deleted the file.
  4. 在更改列表中,找到已删除的文件。
  5. 右键单击该文件,并进入“恢复修订后的更改”。
  6. 这将恢复文件到您的工作副本,保持历史记录。
  7. 提交文件以将其添加回存储库。

为了完整起见,如果您知道要查找什么,那么这就是您在 svn 手册中可以找到的内容。而是你已经发现的东西:

撤销改变

恢复已删除项

同样的道理,从这本书的最新版本(以及详细版本)来看:

撤销改变

恢复已删除项

The problem with doing an svn merge as suggested by Sean Bright is that is reintroduces other changes made in the same revision as the deletion. An svn copy is a more targeted operation that will only affect the deleted files.

使用 Tortoise SVN,你可以通过一个 SVN 拷贝从你的工作拷贝目录和之后的 SVN 修订版本中恢复一个被删除的文件,如下所示:

  • 浏览到先前包含该文件的工作副本文件夹。
  • 右键单击资源管理器中的文件夹,转到 TortoiseSVN-> Show log。
  • Right click on the revision number just prior to the revision that deleted the file and select "Browse repository".
  • 右键单击已删除的文件,选择“拷贝到工作拷贝...”,然后保存。

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

注意: 这个方法将保留已恢复文件的以前历史记录,但是要查看 TortoiseSVN 日志中的以前历史记录,您需要确保在日志消息对话框中未选中“ Stop on copy/rename”。

我能够恢复文件并且不丢失修订历史的最简单的方法是使用 SVN 收到,上面的合并例子对我来说似乎是一个更复杂的方法来实现同样的事情。如果只是想恢复修订,为什么还需要进行合并?

我在这个实例中使用了下面的代码,它工作得非常好。

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

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

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

  1. 右键单击包含已删除文件/文件夹的父文件夹
  2. 选择“显示日志”
  3. 选择并右键单击完成更改/删除之前的版本
  4. 选择“浏览存储库”
  5. Select the file/folder which needs to be restored and right click
  6. 选择“ copy to”,将文件/文件夹复制到头版本

希望能帮上忙

I always seem to use svn copy as a server operation so not sure if it works with two working paths.

Here is an example of restoring a deleted file into a local working copy of the project:

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

当在项目目录中时。这对于还原整个目录也同样有效。