首页 文章

如何恢复SVN提交?

提问于
浏览
281

我找到了各种如何恢复SVN提交的例子

svn merge -r [current_version]:[previous_version] [repository_url]

要么

svn merge -c -[R] .

但它们似乎都不起作用 . 我尝试了这些命令并检查了手动更改的文件 .

如何还原修订号为1944的提交?如何检查还原已完成(未查看实际文件中的更改已被还原)?

12 回答

  • 24

    这两个例子都必须有效,但是

    svn merge -r UPREV:LOWREV . 撤消范围

    svn merge -c -REV . 撤消单个修订版

    在这种语法中 - 如果当前目录是WC并且(在每次合并后必须完成),您将提交结果

    你想看日志吗?

  • 56

    如果您正在使用TortoiseSVN客户端,则很容易完成via the Show Log dialog .

  • 1

    svn merge -r 1944:1943 . 应还原工作副本中r1944的更改 . 然后,您可以查看工作副本中的更改(使用diff),但是您需要提交才能将还原应用到存储库中 .

  • 1

    首先,将工作副本还原为1943年 .

    > svn merge -c -1943 .
    

    其次,检查即将提交的内容 .

    > svn status
    

    第三,提交版本1945 .

    > svn commit -m "Fix bad commit."
    

    第四,看看新的日志 .

    > svn log -l 4
    
    ------------------------------------------------------------------------
    1945 | myname | 2015-04-20 19:20:51 -0700 (Mon, 20 Apr 2015) | 1 line
    
    Fix bad commit.
    ------------------------------------------------------------------------
    1944 | myname | 2015-04-20 19:09:58 -0700 (Mon, 20 Apr 2015) | 1 line
    
    This is the bad commit that I made.
    ------------------------------------------------------------------------
    1943 | myname | 2015-04-20 18:36:45 -0700 (Mon, 20 Apr 2015) | 1 line
    
    This was a good commit.
    ------------------------------------------------------------------------
    
  • 38

    无法“取消提交”修订版本,但您可以将工作副本还原为版本1943并将其作为版本1945提交 . 版本1943和1945将完全相同,从而有效地还原更改 .

  • 2

    正如它所说,以下将进行干运行 . HEAD是当前版本,PREV是previous,然后是文件或提交项的路径:

    svn merge --dry-run -rHEAD:PREV https://example.com/svn/myproject/trunk
    

    如果干运行看起来不错,请运行不带--dry-run的命令

    验证修订的更改并重新提交 . 要浏览版本号,请尝试:

    svn log
    
  • 3
    F=code.c
    REV=123
    svn diff -c $REV $F | patch -R -p0 \
        && svn commit -m "undid rev $REV" $F
    
  • 0

    亚历克斯,试试这个:svn merge [WorkingFolderPath] -r 1944:1943

  • 122
    svn merge -c -M PATH
    

    这救了我的命 .

    我有同样的问题,在恢复之后我也没有看到旧代码 . 运行上面的命令后,我得到了一个干净的旧版本代码 .

  • 416

    我尝试了以上,( svn merge ),你是对的,它做杰克 . 然而

    svn update -r <revision> <target> [-R]
    

    似乎工作,但不是永久性的(我的svn只是显示旧版本) . 所以我必须这样做

    mv <target> <target backup>
    svn update <target>
    mv <target backup> <target>
    svn commit -m "Reverted commit on <target>" <target>
    

    在我的特定情况下,我的目标是 interfaces/AngelInterface.php . 我对文件进行了更改,提交了它们,更新了构建计算机运行的phpdoc编译器,发现我的更改是浪费时间 . svn log interfaces/AngelInterface.php 显示我的更改为r22060,之前对该文件的提交是r22059 . 所以我可以 svn update -r 22059 interfaces/AngelInterface.php ,我最终得到的代码就像在-r22059中一样 . 然后 :-

    mv interfaces/AngelInterface.php interfaces/AngelInterface.php~
    svn update interfaces/AngelInterface.php
    mv interfaces/AngelInterface.php~ interfaces/AngelInterface.php
    svn commit -m "reverted -r22060" interfaces/AngelInterface.php
    

    或者,我可以在目录上执行相同的操作,通过在上面的所有内容中指定 . -R 代替 interfaces/AngelInterface.php .

  • 8

    虽然已经给出的建议可能适用于某些人,但它对我的情况不起作用 . 执行合并时, rev 1443 上更新为 rev 1445 的用户仍然会同步 1444 中更改的所有文件,即使它们等于合并中的 1443 . 我需要最终用户根本看不到更新 .

    如果要完全隐藏提交,可以通过在正确的修订版本中创建新分支,然后交换分支 . 唯一的事情是你需要删除并重新添加所有锁 .

    copy -r 1443 file:///<your_branch> file:///<your_branch_at_correct_rev>
    svn move file:///<your_branch> file:///<backup_branch>
    svn move file:///<your_branch_at_correct_rev> file:///<your_branch>
    

    这对我有用,也许对那里的其他人有帮助=)

  • 2

    如果要从历史记录中完全删除提交,还可以在特定修订版本上转储repo,然后导入该转储 . 特别:

    svnrdump dump -r 1:<rev> <url> > filename.dump
    

    svnrdump命令执行与svnadmin转储相同的功能,但适用于远程仓库 .

    接下来只需将转储文件导入您选择的仓库 . 经测试,这在Beanstalk上运行良好 .

相关问题