撤回意外登记

mar*_*cog 57 svn

您正在使用subversion并且在准备好之前意外地检查了一些代码.例如,我经常:a)检查一些代码,然后b)编辑一点,然后c)点击,输入重复上一个命令,不幸的是签入.

是否有可能通过颠覆从服务器撤回这种意外登记?

Bri*_*new 70

请参阅SVNBook,特别是"撤消更改"部分,并反向合并.

svn merge的另一个常见用途是回滚已经提交的更改.假设您正在愉快地处理/ calc/trunk的工作副本,并且您发现在更改integer.c的修订版303中所做的更改完全错误.它永远不应该被承诺.您可以使用svn merge来"撤消"工作副本中的更改,然后将本地修改提交到存储库.您需要做的就是指定反向差异:

$ svn merge -r 303:302 http://svn.example.com/repos/calc/trunk

为了澄清,您的初始更改仍将在存储库中.但是你现在已经在以后的版本中撤回了它.即存储库已捕获所有更改(这实际上是您想要的!除非您已检入明文密码或类似密码!)

  • 做同样的事情,但我更喜欢svn merege -c -303来撤消更改.似乎人们更容易理解. (8认同)

Dav*_*ser 17

注意:这可能不适用于当前版本的次级版本并且是一个糟糕的想法 - 但我已将其留在此处以供参考

注意: 通常当您错误地检入时,您应该恢复提交 - 请参阅此问题的其他答案.但是,如果您想知道如何实际撤消提交的效果并将存储库更改为之前的状态,则下面会有一些解释:

这不是您通常想要的,但如果您真的想要从存储库中删除实际提交的版本,那么您可以按如下方式对存储库执行令人讨厌的回滚(这假设$REV设置为最新版本,您是删除):

  • 首先备份您的存储库,因为这些更改可能会破坏它(并阅读下面的假设)
  • 将本地副本还原为以前的版本,以免混淆(svn revert -r $((REV-1)))
  • 在存储库中,删除db/revs/$REVdb/revprops/$REV
  • 在存储库中,删除db/current和(对于subversion 1.6或更高版本)db/rep-cache.db,然后运行svnadmin recover .
  • (可能)调整权限db/rep-cache.db以防止尝试写入只读数据库错误

这一切都假定:

  • 您正在使用fsfs基于存储库的存储库
  • Subversion版本大于1.5.0(否则你必须手动编辑db/current和更改版本号而不是运行svnadmin recover .)
  • 没有其他后续修订已经提交
  • 您具有对存储库的文件系统的写访问权
  • 在执行上述操作时,您不会害怕尝试访问它的其他人

当一个巨大的文件被提交到一个我不想永远留在历史(和镜像等)的存储库时,我已经完成了它; 它绝不是理想或正常的做法......

  • 因此,上面的*讨厌*!我给出了答案,因为提问者询问实际上是否撤回了签到; 当然,提交合并的回滚通常是你想要做的.使用更智能的版本控制系统也使这些选择更容易:) (4认同)
  • -1使用此方法进行repo损坏.我同意有时需要以丢失数据的方式更改repo,而svn revert不会这样做.然而,这个过程......我们只是尝试了它并且它破坏了repo(svnadmin:E200002:序列化散列缺少终止符).我们发现,由于我们刚刚删除了最新版本,svnadmin转储到倒数第二个版本,然后svnadmin加载到一个新的回购中,完全符合我们的要求并且完全没有破坏性. (2认同)

Pet*_*ete 14

警告:接受的答案(由David Fraser提供)应该与SVN 1.5存储库一起使用,但是对于SVN 1.6,您还必须db/rep-cache.db在下次提交之前删除,否则您将损坏您的存储库,并且可能在下次尝试完成之前无法实现查看.我看到后续的完整检查失败,出现"格式错误的表示标题"错误.

什么是rep-cache.db,你可能会问?在对FSFS布局文件说,你将失去"代表共享功能",如果你删除此文件; 但是,它将在您下次提交时重新创建. 表示共享在1.6中添加.


Jam*_*Ide 12

使用TortoiseSVN,选择"显示日志"并找到要还原到的修订版本.从上下文菜单中,选择"还原为此修订".这会将反向合并执行到您的工作副本中,因此您必须提交工作副本才能完成操作.

另请参阅我们如何跟踪工作副本的分支?:-)


And*_*asT 6

如果你的意思是,我如何干净地删除意外登记的历史:这很困难.

svn不允许您撤消任何内容,因为它将修订版本保存为更改集.但是,有一些工具可以让您在转储存储库时执行几乎任何操作.你可以:

  1. 转储你的回购.

  2. 使用过滤流SVN管理工具来摆脱签入的.

  3. 把它放回回购.

但这可能完全破坏你的回购,所以永远不要试图这样做,除非你完全知道你在做什么,并备份所有东西.

  • 哦,你正在寻找的工具是"svndumpfilter",IIRC (2认同)