2012-04-23 2 views
8

Мне нужно импортировать огромный репозиторий SVN, который мне нужно передать с одного сервера на другой. Поэтому я экспортировал его от старого сервера:Как исправить ошибку окончания строки импорта SVN?

svnadmin dump . > archive.svn 

и импортировать его на новый:

svnadmin load . < archive.svn 

В середине процесса импорта я получил эту ошибку:

Cannot accept non-LF line endings in 'svn:ignore' property 

Как я могу это исправить? У меня есть полный контроль над обоими серверами.

ответ

3

Вы изменили версию сервера? Это известная проблема в версии 1.6 и вызывает проблемы при переходе от 1.4 или 1.5.

Subversion 1.6 больше не принимает возврат каретки (^ M) в файлах свойств. Вам нужно будет исправить разрывы строк в файле svn: ignore или просмотреть, если это проще.

В качестве альтернативы, вы можете пойти за Subversion 1.7 или использовать uberSVN.

+1

Я обновил старый сервер до последней версии, но я до сих пор получил тот же самый вопрос. – xsl

+0

Что вы использовали раньше? Вы пытались установить свойства файла для обеспечения правильного формата? Там хорошая статья [здесь] (https://mikewest.org/2006/06/working-with-subversion-file-properties), которая объясняет, как ... –

+0

Я закончил тем, что проигнорировал окончание строки параметром, переданным svnadmin load – xsl

11

У вас есть 2 варианта, исправьте источник или отключите проверку прокрутки.

Ремонт источник (SVN: журнал и SVN: игнорировать):

sed -e '/^svn:log$/,/^K/s/^M/ /' -e '/^svn:ignore$/,/^PROPS-END$/ s/^M/\n/' archive.svn > repaired-archive.svn 

svnadmin load . < repaired-archive.svn 

Где ^M является управляющим символом, это означает, что 0D в шестнадцатеричном формате. Для того, чтобы получить его использовать^V^M (контроль управления V M) вместо^M (огибающая M или управление M)

Отключение проп проверки:

svnadmin load --bypass-prop-validation . < archive.svn 
+0

Будьте осторожны, что команда sed выше дает мне эту ошибку 'svnadmin: E200014: Несоответствие контрольной суммы для' при загрузке двоичного файла. @tangens sed работает для меня. – ceilfors

+0

Я только что успешно восстановил файл дампа, см. Ответ ниже –

2

Я столкнулся с этой ошибкой при обновлении 1,6 репо до 1,8. Я нашел ряд «исправлений» в сети.

-bypass-prop-validation не понравился мне, потому что он откладывает проблему, в следующий раз, когда вам нужно восстановить репо, вы попадете в ту же проспект.

Я нашел сценарий bash, чтобы перебирать версии, получая комментарии и настраивая их снова, но это не сработало.

Улучшение решения ventura10 выполнило эту работу. Из-за размера свалки я в конечном итоге с помощью одной команды, чтобы удалить ненужные символы при восстановлении дамп

sed -e '/^svn:log$/,/^K/s/^M/ /' -e '/^svn:ignore$/,/^PROPS-END$/ s/^M/\n/' /path/to/svn.dump | svnadmin load /path/to/repo 

Примечание:

Where ^M is a control character, that means 0D in hex. To get it use ^V^M (control V control M) instead ^M (circumflex M or control M)

5

Первый вариант ответа @ ventura10 звучал хорошо но не работает для меня. Команда sed изменила некоторые версии для версии вне раздела свойств, что привело к несоответствиям md5 при загрузке дампа.

Поскольку у моего репозитория нет свойств с двоичным содержимым, я изменил команду sed, чтобы исправить все свойства, а не только svn:log и svn:ignore. Я также был уверен, что ни один файл с версией не содержал строку, начинающуюся с Prop-content-length:. В противном случае у меня возникла бы ошибка при загрузке дампа.

sed -e '/^Prop-content-length: /,/^PROPS-END$/ s/^M/ /' svn.dump > svn.dump.repaired 

Это важно заменить ^M с [blank], так как размер стоимости имущества не должно измениться.

Нота @ ventura10 остается в силе:

^M is a control character, that means 0D in hex. To get it use ^V^M (control V control M) instead ^M (circumflex M or control M)

Это трудно поверить, что модернизация существующего хранилища из SVN 1.4 до SVN 1.7 делает этот шаг nessecary, но я не нашел никакого другого способа чтобы избавиться от возвратов каретки, которые больше не принимаются с момента svn 1.6.

+0

Вы можете использовать значение HEX в команде 'sed -e '/^Prop-content-length: /,/^ PROPS-END $/s/\ x0D// 'svn.dump> svn.dump.repaired' – ceilfors

2

Использование svndumptool:

svndumptool.py eolfix-prop svn:ignore svn.dump svn.dump.repaired 

решение @tangens тоже работает для меня, но это не так совершенно, как я получаю дополнительный пробел в качестве замены символов возврата каретки. Тем не менее, я тестировал, что svn: ignore все еще работает с этим дополнительным пространством, но я не тестировал другие свойства SVN.

Недостатком использования svndumptool является то, что он может работать только с одним свойством svn за один раз, что требует много времени, если ваши файлы дампа большие.


Некоторые выводы

Вы могли бы быть интересно, почему @tangens не заменит^М с пустым характером. Если попытаться заменить его пустой символ, вы будете получать эту ошибку:

svnadmin: E140001: Dumpstream data appears to be malformed 

свалка файл хранит Prop-content-length собственности, которые будут сопоставлены с содержанием фактического содержания имущества. Замена^M на пустой символ уменьшит длину содержимого свойства, а значит и ошибку.

svndumptool изменит Prop-content-length и Content-length соответственно.

+0

Я только что загрузил и установил svndumptool.py 0.6.1, а команда 'eolfix-prop' нигде не была найдена! –

+0

Похоже, что команда добавляется только после версии 0.6.1. Как вы можете видеть в [этой фиксации] (https://github.com/jwiegley/svndumptool/commit/38673392c1dea29303667fc4ea34726e64d248bf), она была датирована в 2013 году. Даже версия [0.7.0 commit] (https://github.com/ jwiegley/svndumptool/commit/b24dfa481a1f10c923904902a1621b551a756191 # diff-0c5514081fb7b6c087da4a44ae668f7f) было сделано в 2009 году. – ceilfors

+0

Итак, как мне получить эти более поздние версии? Последнее, что я смог найти, было 0.6.1. –

4

С небольшой гимнастикой вы можете обойти это, используя svnsync, который имеет возможность исправить EOL. Предположим, что ваш репозиторий сброшен в archive.svn.

Сначала создайте хранилище для загрузки репо обратно, не обращая внимания на проблемы EOL:

svnadmin create repo 
svnadmin load repo < archive.svn --bypass-prop-validation 

Теперь создать новое хранилище для копирования в:

svnadmin create repo-fixed 

svnsync требует некоторых предварительно совершить крюк, даже если вы его не используете, просто используйте свой редактор для создания пустого в repo-fixed/hooks/pre-revprop-change:

#!/bin/sh 
exit 0 

Инициализировать хранилище назначения для svnsync:

svnsync init file:///path/to/repo-fixed file:///path/to/repo 

Теперь скопируйте весь репозиторий через:

svnsync sync file:///path/to/repo-fixed 

Уф! svnsync даже дать вам хорошие новости: (. Почему команда Subversion не обновлялись svnadmin сделать то же нормализацию является для меня загадкой) NOTE: Normalized svn:* properties to LF line endings

После того, как это сделано, дамп новый репозиторий:

svnadmin dump repo-fixed > archive-fixed.svn 

У вас теперь есть archive-fixed.svn, который должен быть идентичным archive.svn, за исключением того, что EOLs были исправлены по мере необходимости.

(Необязательно) Вы можете теперь удалить временный репозиторий, использованный для svnsync:

rm -rf repo-fixed 

Update Оказывается, если вы загрузите этот новый дамп, клиент Subversion получает ошибку: Repository UUID does not match expected UUID , Вам нужно будет использовать svnadmin setuuid ... до change the UUID ID to what it used to be.

(Это сообщение является кульминацией множества фрагментов и частичных решений, я нашел вокруг сети Спасибо всем, кто знал больше, чем я;. Я просто все это вместе.)

Смотрите также :

+0

Отличная работа! Я обнаружил, что мне нужно было установить бит выполнения: chmod u + x gjbh-fixed/hooks/pre-revprop-change – boes

1

Я только что удалил файл svn dump. Он также имел CRLF в свойствах, что вызвало исключение из импорта дампа SVN Edge (у них очень плохая процедура импорта). Тогда я «установил» Svnserve для тестирования, которое было намного легче, чем ожидалось (инструкции для ОС Windows):

  1. загрузить и установить TortoiseSVN или другое программное обеспечение, которое включает в себя Svn инструменты командной строки. Я уже установил его
  2. начало cmd.exe, пробег svnserve -d.Теперь это cmd-окно занято.
  3. начать другой cmd.exe создать репозиторий: svnadmin create d:\svn_repos\test12
  4. нагрузку на свалку в репо: svnadmin load d:\svn_repos\test12 < d:\temp\svn\backup_test.dump

Svnserve даст вам подробную информацию, что не удалось.

А вот то, что вам нужно отремонтировать (оригинал на левом, отремонтировали на правой стороне): enter image description here

Смежные вопросы