ソフラボの技術ブログ

仕事で使ったプログラミング、サーバー周りで役に立つこと、Webサービス開発に必要な技術情報、モバイル情報を書いてます。わかりやすく見やすくをモットーにしています。

SVNのloadで「non-LF」エラーが出てインポートできないときの対処方法

サーバーの更改に伴いSVNを移行することになりました。
その時に「non-LF」が出てどうしようもなく困ったので対処方法をまとめておきます。

環境

OS SVN
移行前 SUSE Linux ES 9 1.3.0
移行後 CentOS 6.2 1.7.4

エラーと原因

普通に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」を追加してインポートすることで、最初に行ったログの再設定処理は不要になるかもしれません。