你正在使用Subversion,但不小心在代码还没准备好时就提交了。例如,我经常会这样操作:a) 提交一些代码,然后 b) 进行一些编辑,接着 c) 按上箭头和回车键来重复之前的命令,但不幸的是那个命令是一个提交。
有没有可能从Subversion服务器中撤销这种意外提交呢?
你正在使用Subversion,但不小心在代码还没准备好时就提交了。例如,我经常会这样操作:a) 提交一些代码,然后 b) 进行一些编辑,接着 c) 按上箭头和回车键来重复之前的命令,但不幸的是那个命令是一个提交。
有没有可能从Subversion服务器中撤销这种意外提交呢?
NB: 可能在当前版本的Subversion上不起作用,这是一个坏主意——但我还是把它留在这里供参考。
NB: 通常当你因为错误而check in之后,你应该撤销commit——请参见其他回答。但是,如果你想真正撤消已提交的更改并将仓库恢复为之前的状态,下面有一些解释:
这不是你通常想要的,但如果你真的想从仓库中删除实际提交的版本,则可以对仓库进行粗暴的回滚,具体操作如下(假设$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
的权限,以防止出现attempt to write a readonly database错误这一切都假设:
fsfs
类型的仓库1.5.0
(否则你需要手动编辑db/current
并更改修订号,而不是运行svnadmin recover .
)我曾经在将一个巨大的文件提交到仓库时做过这件事,因为我不希望它永久留在历史记录(以及镜像等)中;这绝不是理想或正常的做法...
警告:接受的答案(作者为David Fraser)可以用于SVN 1.5仓库,但对于SVN 1.6,您还必须在下一次提交之前删除db/rep-cache.db
否则会破坏您的仓库并且可能直到下一次尝试完整检出时才会意识到。我曾看到过后续的完整检出失败,并出现“Malformed representation header”的错误。
你可能会问rep-cache.db是什么?FSFS布局的文档说明指出,如果删除此文件,您将失去"rep-sharing capabilities";然而,它会在您下一次提交时重新创建。表示共享在1.6中添加。
您无法删除修订版本 - 这里的一些答案似乎完全误解了您想要的内容。但是,您可以更改签入消息以表示它是无意的。签入不会花费太多时间,因此有偶尔多出来的签入并不是什么大问题。
svnadmin dump -r 0:N > reponame.dump
svnadmin dump -r 0:6610 > reponame.dump
将删除6611及以后的版本svnadmin create reponame
svnadmin load reponame < reponame.dump
svn checkout
。是的,这确实是Subversion的用途。
你需要做的就是在SVN仓库中用之前的版本替换你的副本。
有几个选项:
但我强烈建议在替换本地副本之前执行以下操作:
Last login: Mon Apr 13 16:01:34 on ttys004
[wlynch@orange ~] cd /tmp
[wlynch@orange /tmp] svnadmin create foo
[wlynch@orange /tmp] svn co file:///tmp/foo foo-repo
Checked out revision 0.
[wlynch@orange /tmp] cd foo-repo/
[wlynch@orange foo-repo] ls
[wlynch@orange foo-repo] touch blah
[wlynch@orange foo-repo] touch repl
[wlynch@orange foo-repo] touch bar
[wlynch@orange foo-repo] svn add *
A bar
A blah
A repl
[wlynch@orange foo-repo] svn ci
Adding bar
Adding blah
Adding repl
Transmitting file data ...
Committed revision 1.
[wlynch@orange foo-repo] echo "hi" > bar
[wlynch@orange foo-repo] echo "oh no" > blah
[wlynch@orange foo-repo] svn ci
Sending bar
Sending blah
Transmitting file data ..
Committed revision 2.
[wlynch@orange older-foo] svn diff -r 1:2 file:///tmp/foo
Index: bar
===================================================================
--- bar (revision 1)
+++ bar (revision 2)
@@ -0,0 +1 @@
+hi
Index: blah
===================================================================
--- blah (revision 1)
+++ blah (revision 2)
@@ -0,0 +1 @@
+oh no
[wlynch@orange foo-repo] svn diff -r 1:2 file:///tmp/foo | patch -R
patching file bar
patching file blah