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

125

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

  • 更新到删除之前的版本
  • 将文件复制到其他地方
  • 更新到最新版本
  • 将文件复制回来
  • 添加它们
  • 提交

这听起来不太好,并且还会损失所有历史记录。一定有更好的方法来做到这一点。我已经查看了SVN Book,但没有找到任何信息,现在正在查看SVN标记列表。


4
吐库山的回答无疑是你问题的正确直接回答,应该被接受吧? - James McCormack
@JamesMcCormack:请看他回答中的NB。 - BCS
2
一个提示,如果您已经删除了文件但尚未提交更改,只需右键单击并更新即可恢复它。 - TheTechGuy
9个回答

185
Sean Bright建议的使用svn合并存在问题,因为它会重新引入与删除相同修订版本中所做的其他更改。svn复制是一种更加有针对性的操作,只会影响已删除的文件。
使用Tortoise SVN,您可以通过以下svn复制步骤从先前的SVN修订中恢复已从工作副本目录和后续SVN修订中删除的文件:
- 浏览到之前包含该文件的工作副本文件夹。 - 在资源管理器中右键单击文件夹,选择TortoiseSVN -> 日志。 - 在删除文件的修订号之前的修订号上右键单击,并选择“浏览存储库”。 - 右键单击已删除的文件,并选择“复制到工作副本...”,然后保存。
现在,已删除的文件将位于工作副本文件夹中。要将其重新添加回SVN,请右键单击恢复的文件并选择SVN提交。
请注意:此方法将保留已还原文件的先前历史记录,但要在TortoiseSVN日志中查看先前的历史记录,需要确保在日志消息对话框中取消选中“停止复制/重命名”。

27
如果要删除的文件或文件夹很大,也可以直接在服务器上执行此操作:svn cp -r 1993 http://example.com/svn/trunk/path@1993 http://example.com/svn/trunk/path - Craig
这是正确的做法。我刚试过 TortoiseSVN 1.8.1,它按照建议的方式工作。 - Dr. Gianluigi Zane Zanettini
完美!简单而有效。感谢您提供的解决方案。 - Hunter
在第三步中,“Just prior” 很重要。在第四步中,Tortoise 经常抱怨文件已经存在,即使我已经使用 Windows 删除了它。我必须先更新我的工作副本,这样才能继续操作(我的同事使用 Tortoise 的删除功能删除了几个文件,然后提交了更改)。使用的是 TortoiseSVN 1.8.1 版本。 - leqid
有点绕,但它能用!在选择“复制到工作副本…”后,我不得不浏览整个项目工作文件夹,才能找到正确的位置。 - yoyo
显示剩余5条评论

60

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

不过这完全没有经过测试。


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

  • 进入删除了东西的文件夹
  • 在资源管理器中右键单击,选择TortoiseSVN -> Merge...
  • 部分输入执行删除操作的修订版本
  • 部分输入删除之前的修订版本。
  • 点击 "合并"
  • 提交

诀窍是进行反向合并。感谢 sean.bright 指导我走上正确的道路!


编辑:我们使用的是不同的版本。 我描述的方法在我的 TortoiseSVN 版本中完美运作。

还值得注意的是,如果您要反向合并的提交中有多个更改,则需要在合并完成后撤消其他更改才能提交。如果不这样做,则这些额外更改也将被撤消。


我使用的是Windows系统,没有CLI版本的SVN。您知道如何让TortoiseSVN来实现吗? - BCS
乌龟有右键菜单上的“合并”功能。它有填写版本的框。还有一个“干跑(Dry Run)”选项,可以查看是否设置正确。请记住,直到提交更改后结果才算数,如果出现问题,可以回退。 - gbarry
我还没有见过任何一个合并系统不糟糕的。文本、文件、目录、Word文档,哎。我认为这不是一个可以解决的问题。另一方面,事情可能会更好或更差。 :) - BCS
1
如果您还原了几个文件,然后又还原了其中一个还原,那么这是否算是取消还原呢?哎呀!我觉得我刚刚伤到了什么。 - BCS
推荐的方法在这里:http://svnbook.red-bean.com/en/1.7/svn.ref.svn.c.copy.html 和这里:http://svnbook.red-bean.com/en/1.1/ch04s04.html#svn-ch-4-sect-4.3 - Prince
显示剩余3条评论

27

3
正好说明大部分问题是知道要寻找什么。 - BCS

18

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

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

希望这有所帮助。


13

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

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

svn copy https://repos/project/modules/module.js@3502 modules/module.js
在项目目录中时,这同样适用于恢复整个目录。

2
+1 复制@起作用了。复制-r似乎在Mac OSX下使用CollabNet svn 1.6.17时无法工作。 - Gray
2
同时,所使用的版本应该是在删除之前的那个版本。 - Gray

6
如果您正在使用Tortoise SVN,则应该能够将特定版本中的更改还原到您的工作副本中(实际上是执行反向合并),然后再提交以重新添加文件。遵循以下步骤:
  1. 浏览到删除文件的工作副本文件夹。
  2. 进入存储库浏览器。
  3. 浏览到删除文件的版本。
  4. 在更改列表中找到您删除的文件。
  5. 右键单击文件,然后转到“从此版本还原更改”。
  6. 这将恢复文件到您的工作副本中,并保留历史记录。
  7. 提交文件以将其重新添加到存储库中。

好的,那么问题是如何执行您刚才描述的操作。(答案:使用向后合并) - BCS
1
我在谈论如何在Tortoise SVN中完成它。我会添加更多细节。 - davogones

5
我最常用的恢复文件并且不会丢失修订历史的方法是使用SVN copy。对我来说,上面的合并示例似乎是实现相同目的的一种更复杂的方式。当你只想恢复一个版本时,为什么需要合并呢?
在这种情况下,我使用以下方法,效果非常好。
svn copy -m 'restoring file' -r <rev_number_file_to_restore> http://from/file.cs http://pathTo/file.cs

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


3
SVN COPY 是推荐的做法。语法非常简单:svn copy [SVN URL]@[REVISION # WHERE FILE EXISTS] [LOCAL PATH TO RESTORE TO],来源于 http://www.visualsvn.com/support/svnbook/branchmerge/basicmerging/。我刚刚自己使用了这个方法。 - amit
这对我来说最有意义,我也使用这种方法。 - Dmitry Pashkevich

4

使用 Tortoise SVN:

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

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


不错,下次我会试试的。 - BCS

1

你应该能够只检出要恢复的一个文件。试试这样做:svn co svn://your_repos/path/to/file/you/want/to/restore@rev 其中 rev 是文件存在的最后修订版本。

我不久前就确实必须这样做了,如果我记得正确,使用 -r 选项到 svn 上行不通;我必须使用 :rev 语法。 (尽管我可能记反了...)


这不是我想要的。我想将文件打补丁并将其放回存储库,让SVN知道它是同一个文件。 - BCS

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接