从 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 恢复已删除文件的正确方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章