Как можно использовать Sed / AWK или другой инструмент, чтобы помочь в поиске и замене файла дампа Subversion 12 ГБ - PullRequest
1 голос
/ 23 августа 2010

У меня есть особая ситуация, когда мне нужно удалить операции серии коммитов в хранилище Subversion. Все содержимое (/ trunk / tags / branch) было помечено и впоследствии удалено, когда ошибка была обнаружена. Я бы просто использовал svndumpfilter для удаления узлов, нарушающих работу, но кто-то повторно использовал неверное имя тега на более позднем этапе, поэтому исключения на основе пути вызовут другие проблемы. Мне нужно вручную редактировать файл дампа, который составляет 12 ГБ. У меня есть серия из 15 последовательных ревизий, которые мне нужно отредактировать, которые появляются в дампе в следующем формате:

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

На основании проведенного тестирования я знаю, что для перехода к следующему разделу мне нужно:

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

Есть еще 14 ревизий, в которых требуется такая же замена. Попытка редактировать файлы вручную в VIM серьезно нецелесообразна. Файлы дампа представляют собой смесь двоичного и ascii текста. Если бы у кого-нибудь была какая-нибудь магия awk / sed, которая могла бы мне помочь, я был бы очень благодарен.

Ответы [ 4 ]

2 голосов
/ 23 августа 2010

Сначала большое предостережение: sed и awk предназначены для работы с чистыми текстовыми файлами. Если ваши файлы представляют собой смесь двоичных файлов и ascii, я не уверен, что сработает следующее (лично я бы использовал Perl).

Я предполагаю, что «Номер редакции: 60338» - это то, что вы хотите использовать в качестве своего триггера (и небеса помогут вам, если это произойдет в двоичном виде). Поместите исправленный раздел («... Это пустая редакция ...») в отдельный файл, скажем, newsection. Тогда:

sed -e '/^Revision-number: 60338$/r newsection' -e '/^Revision-number: 60338$/,/^Node-copyfrom-path: test$/d' bigfilename
1 голос
/ 27 августа 2010

Я закончил, используя следующие шаги:

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

Это дало мне точные номера строк в файле операций узла для «плохих» коммитов. Затем я использовал sed для удаления диапазона операций узла (по номеру строки) для каждого коммита следующим образом:

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

Это оказалось довольно быстро. Для любопытных причина, по которой мне нужно было полностью удалить их, заключалась в том, что нашему сканеру хранилища (Atlassian Fisheye) потребовались дни, чтобы проиндексировать плохие коммиты. Я использовал правила исключения, которые СЛЕДУЕТ обойти эту проблему, но оказалось, что я обнаружил ошибку с правилами исключения, которая должна быть исправлена ​​в следующем выпуске Fisheye. Увидеть: http://jira.atlassian.com/browse/FE-2752

1 голос
/ 23 августа 2010

Как насчет SvnDumpTool ?Возможно, вы сможете объединить начальную «хорошую» часть с постепенно изменяющимися отредактированными частями.

0 голосов
/ 23 августа 2010

Содержат ли эти коммиты конфиденциальный материал или какова причина их удаления?Почему бы не позволить им в репозитории удалить теги / ветки и все тут.РЕДАКТИРОВАТЬ: Надзор за тем, что вы уже удалили теги / ветви ...

...