您正在使用Subversion,并且在准备就绪之前不小心签入了一些代码。例如,我经常:a)签入一些代码,然后b)进行一些编辑,然后c)点击,输入以重复上一个不幸的是签入的命令。
是否可以通过Subversion从服务器撤回这种意外签入?
注意:这可能无法用于当前的Subversion版本,这是一个错误的想法-但我将其保留在此处以供参考
注意: 通常,如果您错误地签入,则应该恢复提交-请参阅此问题的其他答案。但是,如果您想知道如何真正撤消提交的影响并将存储库更改为以前的状态,则下面有一些解释:
这通常不是您想要的,但是,如果您确实要从存储库中删除实际的提交版本,则可以按照以下步骤在存储库上进行讨厌的回滚(假定已将$REV
其设置为最新版本)删除):
请先备份您的存储库,因为这些更改可能会破坏存储库(并阅读以下假设)
将您的本地副本还原到以前的版本,以免混淆(svn revert -r $((REV-1))
)
在存储库中,删除db/revs/$REV
并db/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 .
)
尚未提交其他后续修订
您具有对存储库文件系统的写访问权
执行上述操作时,您不怕其他人尝试访问它
当一个巨大的文件被提交到一个我不想永远保留在历史记录(和镜像等)中的存储库时,我就完成了。这绝不是理想或正常的做法...
请参阅SVNBook,特别是“撤消更改”部分,然后反向合并。
svn merge的另一个常见用途是回滚已提交的更改。假设您正在/ calc / trunk的工作副本上愉快地工作,并且发现在修订版303中进行的更改(更改了integer.c)是完全错误的。它永远不应该被提交。您可以使用svn merge“撤消”工作副本中的更改,然后将本地修改提交到存储库。您需要做的只是指定一个相反的差异:
$ svn merge -r 303:302 http://svn.example.com/repos/calc/trunk
为了澄清起见,您的初始更改仍将在存储库中。但是您现在已经在以后的版本中将其撤消了。即存储库已捕获您的所有更改(这确实是您想要的!除非您输入了纯文本密码或类似密码!)
如果您的意思是,我该如何清除意外签入的历史记录:这很困难。
svn不允许您撤消任何操作,因为它会将修订版本保存为变更集。但是,有些工具可让您在存储库转储中执行几乎所有操作。您可以:
转储您的仓库。
使用过滤流从SVN管理工具来摆脱签入的。
把它放回仓库。
但这可能会完全破坏您的存储库,因此,除非您完全了解自己的工作并备份所有内容,否则永远不要尝试这样做。
举报