Wednesday, April 20, 2011

How to undo an 'svn copy'

I've accidentally overwritten an old branch by copying trunk over it using 'svn copy'. More specifically, for every release, trunk is branched and kept as a tag, using:

svn copy svn://machine/REPOS/trunk svn://machine/REPOS/tags/$RELEASENR

But this time the value of 'RELEASENR' was that of an old existing branch instead of a new one. Anybody have any ideas on how to undo this mistake? Thanks already!

From stackoverflow
  • Make again your copy, this time with the correct tag. Then retrieve a previous revision of your existing tag and overwrite the incorrect revision. I don't remember the exact syntax for doing this but it can easily be found in svn book.

  • Subversion doesn't work that way. You haven't actually overwritten it. If the target of the copy or a move exists and is a directory, then the copied or moved item is placed in that directory:

    svn copy svn://machine/REPOS/trunk svn://machine/REPOS/tag/EXISTS_ALREADY
    

    If you look, you should find:

    svn://machine/REPOS/tag/EXISTS_ALREADY/trunk
    

    Which is a copy of the trunk you just tried to tag. The fix in this case is easy:

    svn mv svn://machine/REPOS/tag/EXISTS_ALREADY/trunk \
           svn://machine/REPOS/tag/CORRECT_TAG_NAME
    

    (In case you're not *nix conversant: The \ means I've broken one logical line into two physical lines to spare your horizontal scrollbar from overwork.)

    mouviciel : I suspect that if his procedure is identical for all releases, he has actually overwritten the existing trunk in EXIST_ALREADY directory.

0 comments:

Post a Comment