【问题标题】: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。
  • 提示,如果您删除了文件并且尚未提交更改,只需右键单击并更新即可恢复它。

标签: svn tortoisesvn restore


【解决方案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 复制功能恢复提交的更改:

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

希望对你有帮助

【讨论】:

    【解决方案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,您应该能够将更改从该修订版还原到您的工作副本(有效地执行反向合并),然后再次提交以重新添加文件。要遵循的步骤是:

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

    【讨论】:

    • 好的,在这种情况下,问题是如何做你刚才描述的事情。 (答案:使用向后合并)
    • 我在谈论如何在 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 知道它是同一个文件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-06
    • 2012-02-11
    • 2013-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-09
    相关资源
    最近更新 更多