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

Posted

技术标签:

【中文标题】从 SVN 恢复已删除文件的正确方法是啥?【英文标题】:What is the correct way to restore a deleted file from SVN?从 SVN 恢复已删除文件的正确方法是什么? 【发布时间】:2010-10-04 04:21:10 【问题描述】:

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

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

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

【问题讨论】:

土库山的回答肯定是对您问题的正确直接回答,应该被接受吗? @JamesMcCormack:在他的回答中看到 NB。 提示,如果您删除了文件并且尚未提交更改,只需右键单击并更新即可恢复它。 【参考方案1】:

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

我在本例中使用了以下内容,效果很好。

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

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

【讨论】:

SVN COPY 是推荐的方法。语法非常简单: svn copy [SVN URL]@[REVISION # WHERE FILE EXISTS] [LOCAL PATH TO RESTORE TO] from visualsvn.com/support/svnbook/branchmerge/basicmerging 。我自己就用过这个。 这对我来说最有意义,我也使用这种方法【参考方案2】:

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

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

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

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

【讨论】:

+1 复制@工作。复制 -r 似乎不适用于在 Mac OSX 下使用 CollabNet svn 1.6.17。 另外,使用的修订应该是删除之前的修订权。【参考方案3】:

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

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

希望对你有帮助

【讨论】:

【参考方案4】:

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

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

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

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

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

【讨论】:

这也可以直接在服务器上执行,如果删除的文件或文件夹很大,则很有用:svn cp -r 1993 http://example.com/svn/trunk/path@1993 http://example.com/svn/trunk/path 这是正确的做法。刚刚尝试使用 TortoiseSVN 1.8.1,它按建议工作。 完美!!简单有效。感谢您的解决方案 这种方法使我更容易将文件恢复到已从其父分支中删除的子分支中。也许有一种方法可以使用merge,但我没有弄明白。 第 3 步中的“就在前面”很重要。在第 4 步中,Tortoise 一直抱怨该文件已经存在,即使我已经使用 Windows 删除删除了它。我必须先更新我的工作副本。 (我的同事使用 Tortoise delete 删除了几个文件,然后提交了更改。) TortoiseSVN 1.8.1。【参考方案5】:

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

    浏览到工作副本中删除文件的文件夹。 转到回购浏览器。 浏览到您删除文件的修订版。 在更改列表中,找到您删除的文件。 右键单击文件并转到“还原此修订版的更改”。 这会将文件恢复到您的工作副本,同时保留历史记录。 提交文件以将其添加回您的存储库。

【讨论】:

好的,在这种情况下,问题是如何做你刚才描述的事情。 (答案:使用向后合并) 我在谈论如何在 Tortoise SVN 中做到这一点。我会添加更多细节。【参考方案6】:

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

Undoing Changes

Resurrecting Deleted Items

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

Undoing Changes

Resurrecting Deleted Items

【讨论】:

只是表明大多数问题是知道要寻找什么。【参考方案7】:

使用 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 版本完美配合。

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

【讨论】:

我在 Windows 上,没有 SVN 的 CLI 版本。你知道如何让 ortoiseSVN 做到这一点吗? 乌龟在右键菜单上有“合并”。它有用于填写转速的框。还有“试运行”,看看你是否设置正确。请记住,在您提交之前,结果不计算在内。如果一切乱七八糟,你可以恢复。 我会说 OP 有一个旧版本的 Tortoise。较新的具有不同的(劣质)合并对话框 我还没有看到任何不糟糕的合并系统。文本、文件、目录、Word 文档,太糟糕了。我认为这不是一个可以解决的问题。 OTOH 的东西或多或少都可能很糟糕。 :) 如果您还原多个文件,然后还原其中一个还原,则无法还原。哎哟!我觉得我只是伤害了一些东西。【参考方案8】:

与Tortoise SVN:

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

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

【讨论】:

不错。下次我会试试的。【参考方案9】:

您应该能够只检出要恢复的一个文件。试试svn co svn://your_repos/path/to/file/you/want/to/restore@rev 之类的东西,其中rev 是文件存在的最后一个修订版。

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

【讨论】:

这不是我想要的。我想将文件修补回 repo 并让 SVN 知道它是同一个文件。

以上是关于从 SVN 恢复已删除文件的正确方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SVN 中查找文件被删除/移动的所有提交(修订号)

如何彻底删除SVN中的文件和文件夹

如何彻底删除SVN中的文件和文件夹

SVN删除本地文件有没有办法恢复?

我可以恢复从未提交的已删除文件吗?

svn删除文件怎么才能不被更新回来