我找到了各种如何恢复 SVN 提交的示例,例如
svn merge -r [current_version]:[previous_version] [repository_url]
或者
svn merge -c -[R] .
但它们似乎都不起作用。我尝试了这些命令并检查了手动更改的文件。
如何恢复修订号为 1944 的提交?如何检查还原是否已完成(无需查看实际文件以了解更改已还原)?
这两个例子都必须有效,但是
svn merge -r UPREV:LOWREV .
撤消范围
svn merge -c -REV .
撤消单个修订
在这种语法中 - 如果当前目录是 WC 并且(如每次合并后必须完成的那样),您将提交结果
你想看日志吗?
如果您使用的是 TortoiseSVN 客户端,那么很容易做到 via the Show Log dialog。
svn merge -r 1944:1943 .
应该恢复工作副本中 r1944 的更改。然后,您可以查看工作副本中的更改(使用差异),但您需要提交才能将恢复应用到存储库中。
svn merge -r 1944:1943 .
,但没有任何改变。
svn status
和 svn diff
都没有给出任何东西。
svn: Try 'svn help' for more info svn: Merge source required
svn merge -r 1945:1943 .
似乎奏效了。我想我理解:您需要将“错误”提交“之前”的版本合并到您的工作存储库中。当您想要对先前的提交进行简单的“还原”时,这是可以的。但是,如果您想恢复使用 1900 版所做的更改怎么办?
首先,将工作副本恢复到 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.
------------------------------------------------------------------------
不可能“取消提交”修订,但您可以将工作副本恢复到版本 1943 并将其提交为版本 1945。版本 1943 和 1945 将相同,有效地还原更改。
svn dump
然后 svn load
创建一个克隆存储库直到给定修订版。但是,当然,这不应该在正常情况下使用。
$ git revert
的东西。在使用 Git 这么久之后,我发现学习 SVN 有点困难。
正如它所说,以下将进行试运行。 HEAD 是当前版本,PREV 是以前的版本,然后是文件的路径或提交的项目:
svn merge --dry-run -rHEAD:PREV https://example.com/svn/myproject/trunk
如果试运行看起来不错,请运行不带 --dry-run 的命令
验证修订中的更改并重新提交。要浏览版本号,请尝试:
svn log
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>
这对我有用,也许它会对那里的其他人有所帮助=)
svn merge -c -M PATH
这救了我的命。
我遇到了同样的问题,在恢复后我也没有看到旧代码。运行上述命令后,我得到了一个干净的旧版本代码。
亚历克斯,试试这个:svn merge [WorkingFolderPath] -r 1944:1943
我尝试了上述方法,(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
来对目录执行相同的操作。
如果您想从历史记录中完全删除提交,您还可以在特定修订版处转储 repo,然后导入该转储。具体来说:
svnrdump dump -r 1:<rev> <url> > filename.dump
svnrdump 命令执行与 svnadmin dump 相同的功能,但适用于远程存储库。
接下来只需将转储文件导入您选择的存储库。经测试,这在 Beanstalk 上运行良好。
svnrdump
生成的转储与 svnadmin dump
不同。我认为这可能会导致不准确的存储库移动(随更改而移动)。例如,注意到的差异在于哈希值。当 svnadmin dump
创建 md5
+sha*
或类似的东西时,svnrdump
创建 md5
。另一个不同之处在于转储文件的大小,svnadmin dump
的两倍大。
非常旧的线程,但是 Intellij 没有答案。要恢复单个提交:
转到:Subversion -> 集成目录...
https://i.stack.imgur.com/y89Lh.png
请注意,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 source required
。没有骰子。svn merge -c -42587,-42589 .