如何恢复SVN提交?

时间:2012-11-11 09:42:39

标签: svn revert

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

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

svn merge -c -[R] .

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

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

14 个答案:

答案 0 :(得分:420)

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

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

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

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

你想看日志吗?

答案 1 :(得分:123)

如果您使用的是TortoiseSVN客户端,则可轻松完成via the Show Log dialog

答案 2 :(得分:56)

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

答案 3 :(得分:40)

首先,将工作副本还原为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.
------------------------------------------------------------------------

答案 4 :(得分:24)

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

答案 5 :(得分:8)

如下所述,以下将进行干运行。 HEAD是当前版本,PREV是previous,然后是文件的路径,或者是已提交的项目:

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

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

的命令

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

svn log

答案 6 :(得分:3)

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

答案 7 :(得分:2)

Alex,试试这个:svn merge [WorkingFolderPath] -r 1944:1943

答案 8 :(得分:2)

svn merge -c -M PATH

这拯救了我的生命。

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

答案 9 :(得分: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

或者我可以在目录上做同样的事情,在上面的所有内容中指定. -R代替interfaces/AngelInterface.php

答案 10 :(得分:1)

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

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

1443

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

答案 11 :(得分:0)

如果要从历史记录中完全删除提交,还可以在特定修订版本中转储repo,然后导入该转储。具体做法是:

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

svnrdump命令执行与svnadmin dump相同的功能,但可以在远程仓库上运行。

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

答案 12 :(得分:0)

很旧的线程,但是 Intellij 没有答案。还原单个提交:

前往: Subversion -> 集成目录...

integrate directory view

答案 13 :(得分:0)

请注意,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

希望有用。