サーバーの更改に伴いSVNを移行することになりました。
その時に「non-LF」が出てどうしようもなく困ったので対処方法をまとめておきます。
エラーと原因
普通にsvnadminのload、dumpを使ってリポジトリの移行を行うと次のエラーが出てインポートできません。
svnadmin: E125005: Invalid property value found in dumpstream; consider repairing the source or using --bypass-prop-validation while loading. svnadmin: E125005: Cannot accept non-LF line endings in 'svn:log' property
SVNの1.6からログの文字コードをチェックするようになったようで、改行コードもLFで終わってないとエラーとなるようです。
調べるとRevの日記: Subversionのリポジトリ移行に対応方法のスクリプトが書かれていたので、
それを環境に応じて修正して実行しました。
ログの改行コードをLFにするために変換作業が必要かと思いきや、
ログを一旦ファイルに出力して、何も修正せずに再度ログを設定してあげればいいようです。
対処方法
次のスクリプトを移行元のリポジトリのあるサーバーで実行します。
ログの再設定用スクリプト
#!/bin/sh # 開始リビジョン REV=1 # レポジトリパス REPO=/svn/repo # テンプパス TMP=/svn/tmp # 最新のリビジョン数分処理 while [ ${REV} -lt `svnlook youngest ${REPO}` ] do # 指定のリビジョンのログを取得し、ファイルに出力 svnlook pget ${REPO} svn:log --revprop -r ${REV} > ${TMP}/svn${REV}.log # ログの行数が2行以上のとき if [ `cat ${TMP}/svn${REV}.log | wc -l` -gt 0 ]; then echo convert ${REV} # ファイルに出力したログを再設定する svnadmin setlog ${REPO} -r ${REV} ${TMP}/svn${REV}.log --bypass-hooks else # 1行のものは不要なので削除 rm ${TMP}/svn${REV}.log fi # リビジョン加算 REV=`expr ${REV} + 1` done ※エラーになる場合、コメントを削除して下さい
ログの行数が2行以上の場合、再設定の対象としていますが、
ログの行数のカウントがなぜが1行少なく出るので0以上となっています。
それぞれの環境に応じてそこは修正してください。
ログの再設定が終わったら「svnadmin dump」でエクスポートし、移行先のサーバーに移動させます。
先ほどのスクリプトを流すことでログの改行コードがおかしいものは問題なくインポートできました。
しかし、ものによっては次のエラーが出てインポートが止まってしまいます。
svnadmin: E125005: Invalid property value found in dumpstream; consider repairing the source or using --bypass-prop-validation while loading. svnadmin: E125005: Cannot accept non-LF line endings in 'svn:ignore' property
いろいろ調べてみましたが、これといった解決方法がなかったので、
コマンドのヘルプを再度見てみると、チェック処理をスキップするオプションがあったのでそれを追加してインポートします。
svnadmin load --bypass-prop-validation /svn/repo < /tmp/svnYYYYMMDD.dmp
これでインポート完了です。
「--bypass-prop-validation」を追加してインポートすることで、最初に行ったログの再設定処理は不要になるかもしれません。