| 1 | = How do I remove a file from svn (and all of it's revisions)? = |
| 2 | |
| 3 | This page is designed for MFPL administrators. Special permissions are required to execute these steps. If you have a file you would like removed from our subversion repository, please [/newticket open a ticket to request it's removal]. |
| 4 | |
| 5 | First, check the [ http://subversion.tigris.org/faq.html#removal docs] to see if `svn obliterate` has been implemented. As of this writing, it has not been implemented. |
| 6 | |
| 7 | To manually obliterate a file, follow these steps on `moses.mayfirst.org` (aka `svn.mayfirst.org`). Replace $GROUP with the name of the group whose repo has the file you want to obliterate. |
| 8 | |
| 9 | {{{ |
| 10 | mkdir /srv/backup |
| 11 | cd /srv/backup |
| 12 | cp -rp /srv/svn/$GROUP $GROUP.full.backup |
| 13 | svnadmin dump /srv/svn/$GROUP > $GROUP.dump |
| 14 | grep "file/or/dir/to/delete" $GROUP.dump # check output for exact path to pass to next command |
| 15 | cat $GROUP.dump | svndumpfilter exclude path/to/exclude > $GROUP.clean.dump |
| 16 | grep "file/or/dir/to/delete" mfpl.clean.dump #make sure it's really gone |
| 17 | mv /home/$GROUP/.ssh/authorized_keys{,.off} # make sure nobody uses the repo |
| 18 | rm -rf /srv/svn/$GROUP |
| 19 | svnadmin create /srv/svn/$GROUP |
| 20 | cp $GROUP.full.backup/hooks/* /srv/svn/$GROUP/hooks/ |
| 21 | svnadmin load /srv/svn/$GROUP < $GROUP.clean.dump |
| 22 | chgrp -R $GROUP /srv/svn/$GROUP |
| 23 | find /srv/svn/$GROUP -perm -u+w -exec chmod g+w '{}' ';' |
| 24 | mv /home/$GROUP/.ssh/authorized_keys{.off,} |
| 25 | }}} |
| 26 | |
| 27 | Note: if you are removing a file or directory from the MFPL repo or any repo that is synchronizing to a trac installation, you need to repeat this process on the repo feeding the trac installation. |
| 28 | |
| 29 | Here's a sample output of running these commands on moses, the server running the MFPL trac installation (note - because it's on moses, it's a little different than the commands in the above example which are designed to be run on allende, the svn server). I used the --quiet option so the whole session could be copied with less noise. Also, the initial backup was made earlier in the session. |
| 30 | |
| 31 | {{{ |
| 32 | 0 moses:/srv/svn/backup# ls |
| 33 | mfpl.full.backup |
| 34 | 0 moses:/srv/svn/backup# svnadmin dump --quiet /srv/svn/mfpl > mfpl.dump |
| 35 | 0 moses:/srv/svn/backup# grep "mass_email/log.txt" mfpl.dump |
| 36 | Node-path: trunk/seso/basebuilder/databases/seso/scripts/mass_email/log.txt |
| 37 | Node-path: trunk/seso/basebuilder/databases/seso/scripts/mass_email/log.txt.sample |
| 38 | Node-path: trunk/seso/basebuilder/databases/seso/scripts/mass_email/log.txt |
| 39 | Node-path: tags/seso/4/basebuilder/databases/seso/scripts/mass_email/log.txt |
| 40 | 0 moses:/srv/svn/backup# cat mfpl.dump | svndumpfilter --quiet exclude trunk/seso/basebuilder/databases/seso/scripts/mass_email/log.txt > mfpl.clean.dump |
| 41 | 0 moses:/srv/svn/backup# cat mfpl.clean.dump | svndumpfilter --quiet exclude tags/seso/4/basebuilder/databases/seso/scripts/mass_email/log.txt > mfpl.clean.final.dump |
| 42 | 0 moses:/srv/svn/backup# grep "mass_email/log.txt" mfpl.clean.final.dump |
| 43 | 1 moses:/srv/svn/backup# mv /home/svnsync/.ssh/authorized_keys{,.off} |
| 44 | 0 moses:/srv/svn/backup# rm -rf /srv/svn/mfpl |
| 45 | 0 moses:/srv/svn/backup# svnadmin create /srv/svn/mfpl |
| 46 | 0 moses:/srv/svn/backup# cp mfpl.full.backup/hooks/* /srv/svn/mfpl/hooks/ |
| 47 | cp: overwrite `/srv/svn/mfpl/hooks/post-commit.tmpl'? y |
| 48 | cp: overwrite `/srv/svn/mfpl/hooks/post-lock.tmpl'? y |
| 49 | cp: overwrite `/srv/svn/mfpl/hooks/post-revprop-change.tmpl'? y |
| 50 | cp: overwrite `/srv/svn/mfpl/hooks/post-unlock.tmpl'? y |
| 51 | cp: overwrite `/srv/svn/mfpl/hooks/pre-commit.tmpl'? y |
| 52 | cp: overwrite `/srv/svn/mfpl/hooks/pre-lock.tmpl'? y |
| 53 | cp: overwrite `/srv/svn/mfpl/hooks/pre-revprop-change.tmpl'? y |
| 54 | cp: overwrite `/srv/svn/mfpl/hooks/pre-unlock.tmpl'? y |
| 55 | cp: overwrite `/srv/svn/mfpl/hooks/start-commit.tmpl'? y |
| 56 | 0 moses:/srv/svn/backup# svnadmin load --quiet /srv/svn/mfpl < mfpl.clean.final.dump |
| 57 | 0 moses:/srv/svn/backup# chgrp -R svnsync:svnsync /srv/svn/mfpl |
| 58 | chgrp: invalid group `svnsync:svnsync' |
| 59 | 1 moses:/srv/svn/backup# chown -R svnsync:svnsync /srv/svn/mfpl |
| 60 | 0 moses:/srv/svn/backup# mv /home/svnsync/.ssh/authorized_keys{.off,} |
| 61 | 0 moses:/srv/svn/backup# |
| 62 | }}} |
| 63 | |
| 64 | Thanks to [http://www.robgonda.com/blog/index.cfm/2005/7/10/SVN-Obliterate Rob Gonada for spelling out the steps to take]. |