如何恢复 SVN 提交?

Posted

技术标签:

【中文标题】如何恢复 SVN 提交?【英文标题】:How do I revert an SVN commit? 【发布时间】:2012-10-31 01:37:44 【问题描述】:

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

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

svn merge -c -[R] .

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

如何还原修订号为 1944 的提交?如何检查还原是否已完成(无需查看实际文件以了解更改是否已还原)?

【问题讨论】:

您是否从未接受过答案,因为它们都不起作用? 如果你想要一个字面的答案,请使用“svn merge -c -1944”。检查它是否有效:“svn diff” 另见Delete all traces of a SVN commit。 How do I return to an older version of our code in Subversion?的可能重复 如果是这样的话,我有 1943(好提交),然后是 1944(坏提交),然后是 1945(好提交),然后是 1946(好提交)。现在我只想删除 1944(错误提交)并保留 1944 年之后的所有修订,这意味着我想要从所有这些修订中得到类似 1943、1945、1946(仅删除 1944)的结果,我该怎么办?? 【参考方案1】:

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

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

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

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

你想看日志吗?

【讨论】:

@dwjohnston - 是的,合并总是在 WC 中执行,它不是服务器端任务 svn: Merge source required。没有骰子。 @2rs2ts 看起来您忘记了指定“在当前目录中执行此操作”的尾随点。 你也可以同时做多个单次提交:svn merge -c -42587,-42589 . 对于第二个,如果它不起作用,您可能忘记了修订号之前的 -(连字符)。【参考方案2】:

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

【讨论】:

这已经过时了。当前版本中不再有可供客户端使用的上下文菜单。 什么? TortoiseSVN 是一个上下文菜单,加上它产生的对话框。 “不再有上下文菜单”是什么意思?肯定有! 如果你以后看到这个,它(仍然)在那里。在显示日志屏幕中,右键单击修订版,然后有一个“恢复到此修订版”选项。这是在 TortoiseSVN 1.9.4 Build 27285 中。我刚刚使用它,可以告诉你它工作得很好。 @MarkkuK。 OP 没有指定使用的操作系统,上次我检查 TortoiseSVN 是 Windows-only。【参考方案3】:

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

【讨论】:

不起作用,需要合并源。尝试了svn merge -r 1944:1943 .,但没有任何改变。 自 r1944 以来存储库是否有所改进?如果是这样,与 r1943 和 r1944 之间的更改在同一行上是否存在冲突的更改? 我的版本是 1945,似乎没有冲突。 svn statussvn diff 都没有提供任何东西。 错误:svn: Try 'svn help' for more info svn: Merge source required svn merge -r 1945:1943 . 似乎奏效了。我想我理解:您需要将“错误”提交“之前”的版本合并到您的工作存储库中。当您想要对先前的提交进行简单的“还原”时,这是可以的。但是,如果您想恢复对 1900 版所做的更改怎么办?【参考方案4】:

首先,将工作副本恢复到 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.
------------------------------------------------------------------------

【讨论】:

【参考方案5】:

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

【讨论】:

为了令人讨厌的准确,我会评论说,如果您对存储库具有管理员访问权限,则可以“取消提交”。这是通过使用svn dump 然后svn load 创建一个直到给定修订版的克隆存储库。但是,当然,这不应该在正常情况下使用。 我不想取消提交,我想创建一个新的提交号,并将某个提交反转。套装说我已经检查了 1944 版,在 1945 年提交了一个提交,我想“还原”。然后我想要一个 1946 版本,其文件与 1944 版本中的文件相同。(当然历史除外。)但问题仍然存在:如何做到这一点?命令是什么? // ,@Alex,我也对此感兴趣,尤其是类似于$ git revert 的东西。用了Git这么久,学习SVN有点难。【参考方案6】:

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

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

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

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

svn log

【讨论】:

【参考方案7】:
F=code.c
REV=123
svn diff -c $REV $F | patch -R -p0 \
    && svn commit -m "undid rev $REV" $F

【讨论】:

这是否要求本地副本与错误版本不同?【参考方案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>

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

【讨论】:

【参考方案9】:
svn merge -c -M PATH

这救了我的命。

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

【讨论】:

【参考方案10】:

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

【讨论】:

【参考方案11】:

我尝试了上述方法,(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

【讨论】:

另一件事,正如已经说过的,你不能做的是从历史中删除提交,就像你可以在 git 中通过直接破解 refs 一样。您所能做的就是使用存储库将源更改为您想要的方式,并将其作为更改提交。 经过进一步调查,我可以看到可以使用 svnadmin 从历史记录中删除提交,但强烈建议您不要这样做。见***.com/questions/5566327/…【参考方案12】:

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

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

svnrdump 命令执行与 svnadmin dump 相同的功能,但适用于远程存储库。

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

【讨论】:

我发现svnrdump 生成的转储与svnadmin dump 不同。我认为这可能会导致不准确的存储库移动(随更改而移动)。例如,注意到的差异在于哈希值。 svnrdump 创建 md5,而 svnadmin dump 创建 md5+sha* 或类似的东西。另一个区别是转储文件的大小,svnadmin dump 的两倍大。【参考方案13】:

非常旧的线程,但是 Intellij 没有答案。要恢复单个提交:

转到: Subversion -> 集成目录...

【讨论】:

【参考方案14】:

请注意,svn merge 命令会还原一个提交,即让另一个提交撤消您的更改,但将您的错误提交保留在历史记录中。

如果您是 Subversion 系统管理员(具有命令行访问权限)并且您必须恢复一个非常大的错误(例如,某人在世界),如果你想不惜一切代价尝试完全放弃提交,即使冒着破坏回购的风险:

第 1 步。确定服务器上的存储库

首先确定您服务器文件系统上的存储库。

假设路径名是/repo。但它可能是/home/svn/myrepo 或类似的东西。

文件系统结构应该是这样的:

$ ls -la /repo
total 16
drwxr-xr-x.   6 svn svn   86 10 feb  2020 .
drwxrwx---. 145 svn svn 4096 22 giu 16.14 ..
drwxr-xr-x.   2 svn svn   54 10 feb  2020 conf
drwxr-sr-x.   6 svn svn  253 17 giu 11.25 db
-r--r--r--.   1 svn svn    2 10 feb  2020 format
drwxr-xr-x.   3 svn svn 4096 10 feb  2020 hooks
drwxr-xr-x.   2 svn svn   41 10 feb  2020 locks
-rw-r--r--.   1 svn svn  229 10 feb  2020 README.txt

我们还假设您的用户名为svn,如上例所示。

注意:如果您不知道这是在说什么,那么您可能没有自己的 Subversion 服务器,并且此答案可能对您的情况没有用处。请尝试其他答案(您只需要拥有服务器的 URL,无需物理访问)。

第 2 步。导出您的良好历史记录

假设你的错误版本是100,而你的正确版本是99

svnadmin dump -r 1:99 /repo > export.dump

第 3 步。备份并重新初始化您的存储库

创建存储库的备份并再次对其进行初始化:

mv              /repo /repo.bak
mkdir           /repo
svnadmin create /repo

第 4 步。再次导入您的良好历史记录

svnadmin load /repo < export.dump

现在,请确保使用正确的用户修复您的权限:

chown -R svn:svn /repo

一切正常吗? 就是这样!对你有好处!

但是在这一点上,您很可能已经破坏了整个存储库。例如,您可能无法再结帐,或者您的 Subversion Web 应用程序(Phabricator?)可能会发出奇怪的错误消息,或者您可能在此过程中误杀了一千只小猫。

如果出现问题做好灾难恢复的准备:

灾难恢复

如果发生灾难:

mv /repo     /repo.fail
mv /repo.bak /repo

希望有用。

【讨论】:

以上是关于如何恢复 SVN 提交?的主要内容,如果未能解决你的问题,请参考以下文章

如何恢复SVN工作副本中的ONLY目录?

svn删除文件怎么才能不被更新回来

SVN误清理

iOS开发中,如何恢复到某一个版本(Cornerstone)

Cornerstone是mac操作 如何恢复到某一版本

[教程]svn项目导入与提交