views:

1965

answers:

4

We've got a situation where someone (not me...really :)) really screwed up a Commit to our SVN server...lot's of files deleted, etc.

Question: What is the technique for making the previous (to the bad Commit) revision the HEAD revision? I've seen discussion here on SO for doing this for 1 file, but we'd like to make it like that last commit never happened. Any ideas?

UPDATE: All of these answers seem to be correct. I marked abatishchev's answer as the correct answer simply because I'm using Tortoise SVN and it's the method I actually used. Wish I could mark all of them as the answer. Thanks to all for the assistance. Feel better now ;)

+1  A: 

You can do this using svnadmin dump and svnadmin load. It's quite a brute force way to do it, but I believe that's the only way to do it.

The answers to this question may help: http://stackoverflow.com/questions/80833/nuking-huge-file-in-svn-repository

Greg Hewgill
This will break workingcopies that are on the head revision, as they can't update to a version from a version the repository doesn't know about.
Bert Huijben
+10  A: 

The cleanest way would be to undo changes

You can use svn merge to “undo” the change in your working copy, and then commit the local modification to the repository. All you need to do is to specify a reverse difference. (You can do this by specifying --revision 303:302, or by an equivalent --change -303.)

I realize it does not "make it like that last commit never happened" in the sense that commit is still part of history, but I believe it is better to keep that bad commit in the history.
It could include some work in progress that can be queried / compared to, in order to easily remake a new proper commit.


Even if:

  • the SVN (1.5) manual mention a future obliterate command that would accomplish the task of permanently deleting information, and
  • mention svndumpfilter as a possible workaround (in that it provides the ability to quickly and easily modify that dumpfile data by acting as a path-based filter)

... It is better to not try twisting a SCM tool into something it is not meant to do in the first place.
Historization (along with parallelization with branching) are the two main features of an SCM.

VonC
We have no problem keeping the commit, just want to update the HEAD to the proper code base. Gonna give this a try. Thanks.
jwalkerjr
+4  A: 

Maybe you can show log, check previous revision (n-1), in context menu choose Revert to this revision and commit the changes (it will becomes n+1, where n is current bad head)

abatishchev
http://stackoverflow.com/questions/217190/how-to-quarantine-a-specific-subversion-revision
Milen A. Radev
A: 

You can svn cp specific revisions, so if there are no intervening operations that you wan to save, you could svn rm the offending directory and then svn cp the old version. See the Peg and Operative Revision section of the book

tjw
This is not the proper way. The proper way is to do a reverse merge as VonC says.
kauppi