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


119

我从存储库中删除了一个文件,现在想放回去。我能找出的最好办法是:

  • 在删除之前更新到修订版
  • 将文件复制到其他地方
  • 更新到头
  • 复制文件
  • 添加他们
  • 承诺

这只是难闻的气味,并且会丢失所有启动历史记录。必须有一个更好的方法来做到这一点。我已经看过SVN书,但是什么也没找到,现在正在看SVN标签列表。


4
tukushan的回答肯定是对您的问题的正确直接回答,应该接受吗?
詹姆斯麦考马克2012年

@JamesMcCormack:请参见NB。
BCS 2012年

2
提示:如果您删除了文件但尚未提交更改,只需单击并更新即可恢复它。
Hammad Khan 2013年

Answers:


57

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

但是,这完全未经测试。


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

  • 转到资料来源的文件夹
  • 在资源管理器中右键单击,转到TortoiseSVN->合并...。
  • 来自部分中,输入执行删除的修订
  • 部分中,输入删除前的修订版本。
  • 点击“合并”
  • 承诺

诀窍是向后合并。向sean.bright致以正确的方向指示我!


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

还要注意的是,如果要反向合并的提交中有多个更改,则在提交之前,一旦合并完成,您将希望还原其他更改。如果您不这样做,那么这些额外的更改也将被撤消。


我在Windows上,没有CLI版本的SVN。您知道如何让ortoiseSVN做到这一点吗?
BCS

乌龟在右键菜单上具有“合并”功能。它具有要填写转速的方框。另外,请执行“空运行”以查看设置是否正确。请记住,直到您提交结果,结果才算在内。您可以将其恢复原状。
gbarry

我会说OP具有较旧的Tortoise版本。较新的版本具有不同的(较低级)合并对话框
1800信息

我还没有看到任何不烂的合并系统。文本,文件,目录,Word文档,。我认为这不是一个可以解决的问题。OTOH的东西或多或少会吸引人。:)
BCS

1
如果还原多个文件然后还原,则还原之一就是不可还原。哎哟! 我的事我只是在痛。
BCS

176

正如Sean Bright所建议的那样,进行svn合并的问题在于重新引入了与删除相同版本中所做的其他更改。svn副本是更具针对性的操作,只会影响已删除的文件。

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

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

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

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


26
这也可以直接在服务器上执行,如果删除的文件或文件夹很大,则很有用: svn cp -r 1993 http://example.com/svn/trunk/path@1993 http://example.com/svn/trunk/path
Craig

这是正确的方法。刚刚尝试过TortoiseSVN 1.8.1,它可以按照建议的方式工作。
Gianluigi Zane Zanettini博士

完善!!简单有效。感谢您的解决方案
Hunter

通过这种方法,我可以更轻松地将文件还原到已从其父分支删除的子分支中。也许有一种方法可以解决这个问题merge,但是我没有弄清楚。
arr_sea 2014年

步骤3中的“刚好在先”很重要。在第4步中,即使我已使用Windows Delete删除了文件,Tortoise仍然抱怨该文件已存在。我必须先更新我的工作副本。(我的同事使用Tortoise删除功能删除了几个文件,然后提交了更改。)TortoiseSVN 1.8.1。
leqid 2014年


16

使用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副本@有效。在Mac OSX下使用CollabNet svn 1.6.17时,copy -r似乎不起作用。
2013年

2
同样,所使用的修订应该是删除之前的修订。
2015年

6

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

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

好的,在这种情况下,问题是如何执行您刚刚描述的操作。(答案:使用向后合并)
BCS

1
我在谈论如何在Tortoise SVN中进行操作。我将添加更多细节。
davogones

5

我能够还原文件且不丢失修订历史记录的最简单方法是使用SVN复制,对我而言,上面的合并示例似乎是实现同一件事的更复杂的方法。当您只想还原修订版本时,为什么需要合并?

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

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

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


3
推荐使用SVN COPY。语法非常简单:从visualsvn.com/support/svnbook/branchmerge/basicmerging svn复制[SVN URL] @ [版本号,文件存在的位置] [要还原到的本地路径] 。我自己就用这个。
阿米特2012年

这对我来说最有意义,我也使用这种方法
Dmitry Pashkevich 2012年

4

使用Tortoise SVN

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

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


很好 下次我会尝试的。
BCS

1

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

前一阵子我必须做这个,如果我没记错的话,使用-r选项svn无效。我必须使用:rev语法。(尽管我可能倒想起了……)


那不是我想要的 我想将文件修补回存储库,并让SVN知道它是同一文件。
BCS
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.