121

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

  • 更新到删除前的修订
  • 将文件复制到别处
  • 更新到头部
  • 将文件复制回来
  • 添加它们
  • 犯罪

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

4

9 回答 9

181

按照 Sean Bright 的建议进行 svn 合并的问题在于,它重新引入了与删除相同的修订版中所做的其他更改。svn 复制是一种更有针对性的操作,只会影响已删除的文件。

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

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

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

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

于 2009-08-05T04:42:34.480 回答
60

使用 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 -> 合并...
  • 确保选中“合并一系列修订”,单击“下一步”
  • 在“要合并的修订范围”文本框中,指定删除文件的修订
  • 勾选“反向合并”复选框,点击下一步
  • 点击合并

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


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

  • 转到删除内容的文件夹
  • 在资源管理器中右键单击,转到 TortoiseSVN -> 合并...
  • From部分输入执行删除的修订
  • To部分输入删除前的修订。
  • 点击“合并”
  • 犯罪

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


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

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

于 2009-01-29T05:01:59.183 回答
27

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

撤消更改

复活已删除的项目

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

撤消更改

复活已删除的项目

于 2009-01-29T18:41:25.203 回答
17

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

  1. 右键单击包含已删除文件/文件夹的父文件夹
  2. 选择“显示日志”
  3. 选择并右键单击完成更改/删除之前的版本
  4. 选择“浏览存储库”
  5. 选择需要恢复的文件/文件夹并右键单击
  6. 选择“复制到”,这会将文件/文件夹复制到头版本

希望有帮助

于 2010-10-12T09:53:16.397 回答
13

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

这是将已删除文件恢复到项目的本地工作副本的示例:

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

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

于 2012-09-17T10:59:07.617 回答
6

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

  1. 浏览到您删除文件的工作副本中的文件夹。
  2. 转到回购浏览器。
  3. 浏览到您删除文件的修订。
  4. 在更改列表中,找到您删除的文件。
  5. 右键单击该文件并转到“还原此修订版的更改”。
  6. 这会将文件恢复到您的工作副本,并保留历史记录。
  7. 提交文件以将其添加回您的存储库。
于 2009-01-29T05:13:14.247 回答
5

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

我在这种情况下使用以下内容,效果很好。

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

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

于 2009-09-09T21:18:54.647 回答
4

使用乌龟 SVN

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

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

于 2009-01-29T05:09:11.197 回答
1

您应该能够只签出要恢复的一个文件。尝试类似文件存在的最后一个修订版在svn co svn://your_repos/path/to/file/you/want/to/restore@rev哪里。rev

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

于 2009-01-29T05:02:37.747 回答