如何恢复SVN的提交?

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

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

svn merge -c -[R] .

但这两种方法似乎都不管用。我尝试了这些命令,并检查了手动更改的文件。

如何恢复修订号为1944的提交?我如何检查恢复已经完成(没有在实际文件中查看已恢复的更改)?

573207 次浏览

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

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

两个例子都必须成立,但是

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

svn merge -c -REV .撤销单个修订,在您的情况下REV将是1944,即您希望撤销的修订。

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

您想查看日志吗?

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

如果你正在使用TortoiseSVN客户端,它很容易完成通过显示日志对话框

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

下面将做一个演练,正如它所说。HEAD是当前版本,PREV是之前的版本,然后是文件或提交项的路径:

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

如果试运行看起来不错,那么运行命令时不要使用——dry-run

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

svn log

我尝试了上面,(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

虽然给出的建议可能对某些人有用,但对我的情况不适用。当执行合并时,更新到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>

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

首先,撤销1944年修订中所做的更改。

> svn merge -c -1944 .

其次,检查将要提交的内容。

> 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.
------------------------------------------------------------------------
svn merge -c -M PATH

这救了我的命。

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

如果您希望完全从历史记录中删除提交,还可以在特定修订时转储回购,然后导入该转储。具体地说:

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

svndump命令与svnadmin dump功能相同,但工作在远程repo上。

接下来,只需将转储文件导入您所选择的回购。这种方法在《豆茎》上被测试效果很好。

非常老的线程,但是Intellij没有答案。还原一次提交:

< p >去: Subversion→集成目录…< / p >

 integrated directory view

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

希望能派上用场。