【问题标题】:What's a simple way to undelete a file in subversion?在颠覆中取消删除文件的简单方法是什么?
【发布时间】:2009-01-30 23:23:58
【问题描述】:

这些说明有点令人生畏和困惑:http://svnbook.red-bean.com/en/1.0/ch04s04.html#svn-ch-4-sect-4.3。 而且他们似乎也没有提到如果您在执行“svn rm”[1] 后还没有签到,这会简单得多。

所以我认为这是为那些在谷歌上搜索的人记录一个更简单的答案的好地方。

[1] 对于 svn 新手来说,“svn rm”可能会立即销毁文件。我记得做svn rm 认为这只会将其从源代码控制中删除,并在文件本身实际消失时吓坏了。所以一个子问题是,在不实际删除本地副本的情况下从版本控制中删除文件的正确方法是什么?

【问题讨论】:

  • svn status | grep "^D" | awk '{print $2}' | xargs svn revert

标签: svn version-control


【解决方案1】:

如果你这样做了

svn rm foo.txt

然后你可以简单地撤消它

svn revert foo.txt

如果您在执行“svn rm”后已经签入,那么您可以查看日志 (svn log),找到该文件存在的最后一个修订版,然后从该版本中获取它。

一种方法是合并包含该文件的旧版本。假设当前版本是 123,而该文件的最后一个版本是 120,那么这样做:

svn merge -r123:120

也许先做一次试运行以确保它不会做任何你不想要的事情:

svn --dry-run merge -r123:120

对于子问题,如何在不删除本地副本的情况下从 svn 中删除文件:

svn rm foo.txt --keep-local

或者,当然,您可以在 svn rm'ing 之前复制到一个临时文件,然后再复制回来:

cp foo.txt foo.txt-tmp
svn rm foo.txt
(svn ci -m "just removed foo.txt from the repository")
cp foo.txt-tmp foo.txt

【讨论】:

  • 合并的问题是它丢失了文件以前的历史记录。 Stefan 的答案中详述的 svn cp 可能更好,也更容易理解。
  • 很好的答案,拯救了我的一天。谢谢!请1
  • 我发现如果更改版本顺序,它只是将删除的文件添加到当前工作副本,没有其他更改未删除文件,例如svn merge -r120:123 svn_url .
  • svn revert 没有递归工作,我不得不这样做 svn stat | egrep ^D | cut -c8- | xargs svn revert
  • 我对“反向合并”的问题是它会产生树冲突。
【解决方案2】:

无论出于何种原因,-r 参数对我不起作用(svn 版本 1.6.9)。我在src 之前和之后都尝试过,但一直收到一条消息,指出在当前版本中找不到该文件(duh)。与 --revision 相同。使用 @ 样式语法虽然有效:

svn cp url/to/removed/foo.txt@4 foo.txt

【讨论】:

  • 永远不知道确定最后一个工作版本的最简单方法是什么,但这个声明是黄金。
  • @样式语法是什么?
  • 通常您会使用-r 来指定修订号(请参阅Revision Specifiers)。 @ 表示法用于挂钩修订(请参阅Peg and Operative Revisions
  • 如果您不想担心找到您的存储库的实际 URL,您可以改用 ^/path/from/repo/root。例如,在我的例子中,我使用^/trunk/path/to/my/file.js 来恢复一个文件,该文件最初位于我的工作副本中的path/to/my/file.js(即^/trunk)。
  • 这个答案为我一直很困惑的一个概念提供了很多清晰的信息。我也无法使用 -r 来“取消删除”一个文件,并显示一条错误消息,声称它不在当前版本中。在阅读了上面关于 peg 修订的链接之后,我认为这意味着 subversion 想要我指定一个 peg 修订,其中包含该文件 DID 存在的 at 符号,因此它知道旧文件的 which(潜在)副本。 c 我要。
【解决方案3】:

要删除文件但将其保留在工作副本中,请使用

svn rm foo.txt --keep-local

要在提交删除后取回文件,您可以使用合并命令或复制命令 - 两者都将保留文件历史记录。由于合并方式已经在别处描述,这里是复制方式:

svn rm foo.txt
svn ci foo.txt -m "removed file"
(now at r5 as an example)
svn cp url/to/removed/foo.txt -r4 foo.txt
svn ci foo.txt -m "got file back"

【讨论】:

  • 为了我的工作,复制命令必须有点不同:svn cp url/to/removed/foo.txt@4 -r4 foo.txt ---- 没有@4 我得到“找不到路径”错误
  • 是的,对我来说,我通过在目录中运行svn info 并查看“URL”字段找到了“url/to/removed”。然后我还必须使用“@4”技巧,而“-r4”不是必需的。有趣的是,文件日志历史恢复了,但删除条目除外!
【解决方案4】:

对于 TortoiseSVN 用户,这很容易通过 Repo Browser 完成。在 Repo Browser 中切换到文件被删除之前的版本(您可以使用右上角的“Revision:”按钮更改版本):

然后您应该能够在 Repo Browser 的原始位置看到已删除的文件。右键单击它并选择“复制到工作副本...”:

然后该文件将恢复到准备提交的工作副本(就像添加了 svn 一样),并且其日志历史记录完好无损。

【讨论】:

    【解决方案5】:

    在 SVN 中恢复已删除的文件。在删除之前找到修订号(比如 341)。然后将该文件单独恢复为该修订号。

    svn up -r341 [path_to_deletedFile]
    

    【讨论】:

    • 这会获取另一个本地副本,但该文件在存储库中仍然“已删除”。你的下一个“svn up”会看到它消失。
    【解决方案6】:

    我使用了上一个版本中的复制菜单项,使用 tortoise,为我工作并保留了历史记录。

    【讨论】:

    • 听起来很有希望,你能提供更多细节吗?你究竟从哪里发出复制命令?
    猜你喜欢
    • 2014-04-19
    • 2021-10-12
    • 1970-01-01
    • 1970-01-01
    • 2012-07-11
    • 2021-01-17
    • 2012-02-13
    • 1970-01-01
    • 2017-12-25
    相关资源
    最近更新 更多