2010-08-23 18 views
1

J'ai une situation particulière où j'ai besoin de supprimer les opérations d'une série de commits dans le dépôt Subversion. Tout le contenu de (/ trunk/tags/branches) a été étiqueté et ensuite supprimé lorsque l'erreur a été réalisée. J'utiliserais simplement svndumpfilter pour supprimer les noeuds incriminés, mais quelqu'un a réutilisé le mauvais nom de tag à un moment ultérieur afin que les exclusions basées sur le chemin puissent causer d'autres problèmes. Je dois éditer manuellement le fichier de vidage qui est 12GB. J'ai une série de 15 révisions successives dont j'ai besoin d'éditer, qui apparaissent dans la décharge dans le format suivant:Comment utiliser sed/awk ou un autre outil pour faciliter la recherche et le remplacement du fichier de vidage de subversion 12GB

Revision-number: 60338 
Prop-content-length: 143 
Content-length: 143 

K 7 
svn:log 
V 41 
Tagging test prior to creating xx branch 
K 10 
svn:author 
V 7 
userx 
K 8 
svn:date 
V 27 
2009-05-27T15:01:31.812916Z 
PROPS-END 

Node-path: test/tags/XX_8_0_FINAL 
Node-kind: dir 
Node-action: add 
Node-copyfrom-rev: 60337 
Node-copyfrom-path: test 

basés sur des tests que je l'ai fait, je sais que je dois la section ci-dessus pour changer la suivant

Revision-number: 60338 
Prop-content-length: 112 
Content-length: 112 

K 7 
svn:log 
V 38 
This is an empty revision for padding. 
K 8 
svn:date 
V 27 
2009-05-27T15:01:31.812916Z 
PROPS-END 

Il y a 14 révisions supplémentaires où le même remplacement doit avoir lieu. Essayer d'éditer les fichiers manuellement dans VIM est sérieusement impraticable. Les fichiers de vidage sont un mélange de texte binaire et ascii. Si quelqu'un a une magie awk/sed qui pourrait m'aider, je serais vraiment reconnaissant.

Répondre

1

J'ai fini en procédant comme suit:

cat dump.file | grep -C 250 "Revision-number: xxxxx" 

Cela m'a donné les numéros de ligne exactes dans le fichier des noeuds-opérations pour le « mauvais » engage. J'ai ensuite utilisé sed pour supprimer l'ensemble des opérations de noeuds (par numéro de ligne) pour chaque validation comme suit:

sed -e "123,456d" -e "234,456d" 

Ce avéré être assez rapide. Pour ceux qui sont curieux, la raison pour laquelle je dois les supprimer complètement était parce que notre scanner de dépôt (Atlassian Fisheye) prenait des jours pour indexer les mauvais commits. J'utilisais des règles d'exclusion qui auraient dû contourner le problème, mais il s'est avéré que j'ai découvert un bug avec les règles d'exclusion qui doit être corrigé dans la prochaine version de Fisheye. Voir: http://jira.atlassian.com/browse/FE-2752

0

Ces validations contiennent-elles des éléments confidentiels ou quelle est la raison de leur suppression? Pourquoi ne pas les laisser dans le référentiel supprimer les tags/branches et c'est tout. EDIT: Supervision que vous avez déjà supprimé les tags/branches ...

2

D'abord un gros avertissement: sed et awk sont conçus pour travailler sur des fichiers de texte pur. Si vos fichiers sont un mélange de binaire et d'ascii, je ne suis pas sûr que ce qui suit fonctionnera (personnellement j'utiliserais Perl).

Je suppose que le "numéro de révision: 60338" est ce que vous voulez utiliser comme déclencheur (et Dieu vous aidera s'il se produit dans le binaire). Mettez votre section révisée ("... Ceci est une révision vide ...") dans un fichier séparé appelé, par exemple, newsection. Ensuite:

sed -e '/^Revision-number: 60338$/r newsection' -e '/^Revision-number: 60338$/,/^Node-copyfrom-path: test$/d' bigfilename 
1

Que diriez-vous de SvnDumpTool? Vous pourriez être en mesure de joindre la "bonne" partie initiale avec les parties éditées de manière incrémentielle.