2012-11-11 281 views
231

我已经找到了如何恢复一个SVN各种实例犯类似如何恢复SVN提交?

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

svn merge -c -[R] . 

但他们都不似乎工作。我尝试了这些命令并检查了手动更改的文件。

如何恢复版本号为1944的提交?如何检查恢复已完成(没有查看实际文件中的变化已经恢复)?

+11

你从来不接受答案,因为他们都没有工作? – 2rs2ts

+8

懒惰獾的答案应该被接受。 – Jeff

+4

如果你想要一个字面的答案,使用“svn merge -c -1944”。检查它是否工作:“svn diff” –

回答

38

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

+4

不起作用,需要合并源。试过'svn merge -r 1944:1943 .',而没有任何改变。 – Alex

+0

自r1944以来版本库是否已升级?如果是这样,那么r1943和r1944之间的变化在相同的线上是否存在冲突? – onon15

+0

我正在修订1945年,似乎没有冲突。 'svn status'和'svn diff'都不提供任何东西。 – Alex

23

不可能“取消”提交修订,但可以将工作副本恢复到版本1943,并将其提交为版本1945.版本1943和1945将是相同的,可有效恢复更改。

+17

只是令人讨厌的准确性,我会评论如果您有管理员访问存储库,则可以“不提交”。通过使用'svn dump'然后'svn load'创建一个克隆库直到给定的修订版本。但是,当然,这不应该在正常情况下使用。 – onon15

+4

我不想取消提交,我想创建一个新的提交编号,并反向进行某个提交。集合说我已经检出了1944年的版本,在1945年做了一个承诺,我想'恢复'。然后我想要一个1946年的版本,其文件与1944年的版本相同。(当然除历史以外)但问题依然存在:如何做到这一点?什么是命令? – Alex

+0

//,@Alex,我也对此感兴趣,特别是在类似'$ git revert'的东西中。我发现在使用Git这么久之后学习SVN有点困难。 –

361

两个例子都必须工作,但

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

svn merge -c -REV .在这个语法撤消单一版本

- 如果当前目录是WC及(如必须在每次合并后进行)你” ll commit results

你想查看日志吗?

+2

您是否需要在工作副本中执行此操作? – dwjohnston

+8

@dwjohnston - 是的,合并**总是在WC **中执行,它不是服务器端任务 –

+12

'svn:合并源所需'。没有骰子。 – 2rs2ts

2

亚历克斯,试试这个:SVN合并[WorkingFolderPath] -r 1944年:1943年

111

如果您使用的TortoiseSVN客户端,它是很容易做到via the Show Log dialog

+5

这是迄今为止最简单的方法 –

+2

这已过时。在当前版本中不再有可用于客户端的上下文菜单。 – user1789573

+14

什么? TortoiseSVN是一个上下文菜单,加上它产生的对话框。 “不再有上下文菜单”是什么意思?绝对有! – Ben

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

这是唯一对我有用的东西。 –

5

正如它所说的那样,以下操作将进行空运行。 HEAD是当前版本,上一个是以前的,那么路径到您的文件,或提交的资料:

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

如果空转看起来不错,没有--dry运行运行命令

验证修改并重新提交。要浏览的版本号尝试:

svn log 
1

我试过以上,(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 

我也可以做同样的事情上的目录,通过在所有上述代替interfaces/AngelInterface.php指定. -R

+1

另外一件事,就像已经说过的那样,你不能做的就是从历史记录中删除提交,就像你可以通过直接黑客攻击一样在git中执行。你所能做的就是使用存储库将源代码改变为你的意图,并将其作为一个改变。 – sibaz

+0

经过进一步调查,我可以看到可以使用svnadmin从历史记录中删除提交,但强烈建议您不要这样做。请参阅http://stackoverflow.com/questions/5566327/delete-all-traces-of-a-svn-commit – sibaz

1

虽然已经提出的建议可能适用于某些人,但它不适用于我的情况。执行合并时,更新为rev 1445rev 1443的用户仍然同步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> 

这个工作对我来说,也许会有所帮助别人那里=)

25

首先,恢复工作拷贝到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. 
------------------------------------------------------------------------ 
1
svn merge -c -M PATH 

这救了我的命。

我遇到了同样的问题,恢复回来后,我还没有看到旧的代码。 运行上述命令后,我得到了一个干净的旧版本代码。

0

如果您想从历史记录中完全删除提交,也可以在特定修订版本中执行repo转储,然后导入该转储。具体来说:

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

svnrdump命令执行与svnadmin转储相同的功能,但在远程repo上工作。

接下来只需将转储文件导入您选择的回购。这已经过测试,在Beanstalk上运行良好。