首页 文章

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

提问于
浏览
105

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

  • 在删除之前更新到修订版

  • 将文件复制到别处

  • 更新到头

  • 将文件复制回来

  • 添加它们

  • 提交

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

9 回答

  • 51

    使用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 a range of revisions",单击“下一步”

    • 在"Revision range to merge"文本框中,指定删除文件的修订版

    • 选中"Reverse merge"复选框,单击“下一步”

    • 单击“合并”

    然而,这完全没有经过考验 .


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

    • 转到相关内容的文件夹

    • 右键单击资源管理器,转到TortoiseSVN - >合并...
      From 部分中的

    • 输入执行删除的修订
      To 部分中的

    • 在删除前输入修订 .

    • 点击"merge"

    • 提交

    诀窍是向后合并 . 感谢sean.bright指出我正确的方向!


    Edit: 我们正在使用不同的版本 . 我描述的方法与我的TortoiseSVN版本完美配合 .

    另外值得注意的是,如果提交中存在多个更改,则您将进行反向合并,一旦在提交之前完成合并,您将希望还原那些其他更改 . 如果不这样做,那些额外的改变也将被逆转 .

  • 15

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

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

    • 浏览到以前包含该文件的工作副本文件夹 .

    • 右键单击资源管理器中的文件夹,转到TortoiseSVN - >显示日志 .

    • 在删除文件的修订版之前右键单击修订版号,然后选择"Browse repository" .

    • 右键单击已删除的文件,然后选择"Copy to working copy..."并保存 .

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

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

  • 162

    为了完整,这是你在svn书中找到的,如果你知道要找什么 . 这是你已经发现的:

    Undoing Changes

    Resurrecting Deleted Items

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

    Undoing Changes

    Resurrecting Deleted Items

  • 11

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

    • 右键单击包含已删除文件/文件夹的父文件夹

    • 选择"show log"

    • 选择并右键单击更改/删除之前的版本

    • 选择"browse repository"

    • 选择需要恢复的文件/文件夹并右键单击

    • 选择"copy to",将文件/文件夹复制到头版本

    希望有所帮助

  • 25

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

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

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

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

  • 4

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

    • 浏览到删除文件的工作副本中的文件夹 .

    • 转到repo-browser .

    • 浏览到删除文件的修订版 .

    • 在更改列表中,找到您删除的文件 .

    • 右键单击该文件,然后转到"Revert changes from this revision" .

    • 这会将文件还原到您的工作副本,保留历史记录 .

    • 提交文件以将其添加回存储库 .

  • 0

    使用Tortoise SVN

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

  • 5

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

    我在这个例子中使用以下内容并且它运行良好 .

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

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

  • 4

    您应该只能查看要还原的文件 . 尝试像 svn co svn://your_repos/path/to/file/you/want/to/restore@rev 这样的地方 rev 是文件存在的最后一个版本 .

    我不得不在不久前做到这一点,如果我没记错的话,使用 -r 选项 svn 不起作用;我不得不使用 :rev 语法 . (虽然我可能已经记住了它...)

相关问题