Move Subversion repository without svnadmin
Update (2008-11-13)
Okay, so I did actually end up finding a way to move from SF.net for real. It seems they provide read-only rsync access straight to the repository directory. So here is what I did instead.
1 2 3 4 |
$ rsync -av blowpass.svn.sourceforge.net::svn/blowpass/* blowpass $ svnadmin dump blowpass/ > blowpass.dump $ svnadmin create clearpass $ svnadmin load clearpass < blowpass.dump |
Update (2008-11-12)
Made a small performance change then ran it on the ClearPass repository. Worked flawlessly.
I have been having a terrible time trying to figure out how I can get the Subversion repository for ClearPass out of SourceForge. I could not find a single reference to svnadmin on the SourceForge and no examples of exporting without it. So I took matters into my own hands. Below is a quick and dirty shell script that exports and imports a repository one revision at a time, using common Linux command line tools and the svn command. I’m going to do more testing before using it for real, but so far it has done well. Hope this helps someone else in my position.
Download it: svncrossload
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 |
#!/bin/sh ################################################################################ # LICENSE ################################################################################ # Copyright 2008 John Hobbs ################################################################################ # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the # Free Software Foundation, Inc., # 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ################################################################################ ################################################################################ # ABOUT ################################################################################ # # Home: http://www.velvetcache.org/ # # This is a script to cross load subversion repositories (kind of) keeping history # intact without access to svnadmin. Import into a FRESH repository only, and # be sure to do a comprehensive diff at the end. # # Also be sure to do this in an empty directory. Temp files get added and removed # without sincere thought put into them. # # Log messages get eaten and re-inserted as shown below. Edit to taste. # $ svn log -r 1 # ------------------------------------------------------------------------ # r1 | jmhobbs | 2008-11-12 18:19:43 -0600 (Wed, 12 Nov 2008) | 7 lines # # Imported from file:///srv/svn/scs using svncrossload # # |r1 | jmhobbs | 2008-10-27 17:32:44 -0500 (Mon, 27 Oct 2008) | 2 lines # | # |Initial import. # | # # ------------------------------------------------------------------------ # $ echo "Checking out initial revisions" svn co $2 importing > /dev/null svn co -r 0 $1 updateme > /dev/null echo "Getting most recent revision number" LATESTREVISION=$(svn info $1 | grep Revision | sed 's/^Revision: *\([0-9]*\)/\1/') for i in $(seq 1 $LATESTREVISION); do echo -e "\nCopying revision $i" cd updateme svn update -r $i > ../_update echo -e "Imported from $1 using svncrossload\n" > ../_log # The '\-\-\-\-\...' looks ridiculous, but it works. svn log -r $i | grep -v '\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-' | sed 's/\(.*\)/ |\1/' >> ../_log cd .. cat _update | grep -E '^A' | sed 's/^A *//' > _update_add cat _update | grep -E '^D' | sed 's/^D *//' > _update_del cat _update | grep -E '^U' | sed 's/^U *//' > _update_mod echo "$(wc -l _update_add | sed 's/^\([0-9]*\).*/\1/') Files To Add" echo "$(wc -l _update_mod | sed 's/^\([0-9]*\).*/\1/') Files To Modify" echo "$(wc -l _update_del | sed 's/^\([0-9]*\).*/\1/') Files To Delete" # Copy for j in $(cat _update_add | tr ' ' '@'); do if [ -d "updateme/${j//@/ }" ]; then mkdir "importing/${j//@/ }" else cp -f "updateme/${j//@/ }" "importing/${j//@/ }" fi cd importing # We send cerr to null because it warns when we add existing stuff svn add "${j//@/ }" 2> /dev/null cd .. done # Modify for j in $(cat _update_mod | tr ' ' '@'); do if [ -f "updateme/${j//@/ }" ]; then cp -f "updateme/${j//@/ }" "importing/${j//@/ }" fi done # Delete for j in $(cat _update_del | tr ' ' '@'); do cd importing svn rm "${j//@/ }" cd .. done echo "Committing" cd importing svn commit -F ../_log cd .. done echo "Cleaning up" rm -rf importing _log _update _update_add _update_del updateme _update_mod echo "Done!" |