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

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

or

svn merge -c -[R] .

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

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


当前回答

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

其他回答

请注意,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 merge -r 1944:1943。应该恢复工作副本中r1944的更改。然后,您可以检查工作副本中的更改(使用diff),但您需要提交才能将恢复应用到存储库中。

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

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

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

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