プログラマーのメモ書き

伊勢在住のプログラマーが気になることを気ままにメモったブログです

svn -> git へ移行(補足):期限切れの証明書、空ディレクトリ への対応

以前、

blog.mori-soft.com

として、SVN から git へ移行する手順をまとめました。

最近、久しぶりに昔のSVNのリポジトリをGitに移行した際に、SSLの証明書の期限が切れていて、対応に若干手間取ったので、対応方法を書いておきます。 あと、svn にある空ディレクトリの話もです。

期限切れの証明書

エラーの内容

さきほどの記事のAuthor情報の抽出時に、こんな感じのエラーが出ました。

mor@DESKTOP-V2DMDRJ:~/git_migration$ java -jar ../svn-migration-scripts.jar authors https://サーバーIPアドレス/svn/repos_name/ username password
About to create the authors file.
svn: E170013: Unable to connect to a repository at URL 'https://サーバーIPアドレス/svn/repos_name'
svn: E230001: Server SSL certificate verification failed: certificate has expired, certificate issued for a different hostname, issuer is not trusted
Could not communicate with Subversion: check the URL of the repository, the username and the password are all valid
Error written to /tmp/error-script-9134608188443191433.txt
mor@DESKTOP-V2DMDRJ:~/git_migration$

昔のSVNリポジトリが入っているサーバーを久しぶりに起動したので、証明書がオレオレ証明書の上、期限が切れているようです。

このとき、使っている移行ツールは、 Bitbucket 謹製の svn-migration-scripts.jar なのですが、これ自体には、証明書に関するオプション等がないようです。

対応方法

どうしたものかと思っていたのですが、要はSVNが接続先のサーバーを信頼すればいいだけなので、下記のようにしました。

mor@DESKTOP-V2DMDRJ:~$ svn ls https://サーバーIPアドレス/svn/repos_name/
'https://サーバーIPアドレス:443' のサーバ証明書の認証中にエラーが発生しました:
 - 証明書は信頼のおける機関が発行したものではありません。証明書を手動で認証
   するためにフィンガープリントを用いてください!
 - 証明書のホスト名が一致しません。
 - 証明書の期限が切れています。
証明書情報:
 - ホスト名: xxxxx.mori-soft.com
 - 有効範囲: Dec  6 01:05:05 2012 GMT から Dec  6 01:05:05 2013 GMT まで
 - 発行者: xxxxx.mori-soft.com, Private, Ise, Mie, JP
 - フィンガープリント: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
拒否しますか (R)、一時的に承認しますか (t)、常に承認しますか (p)? p

サーバー上のリポジトリを svn ls で表示しようとすると、当然証明書でエラーが起こるので、信頼する?と聞かれます。それを使って、『常に承認する (p)』を選択してやる、というものです。

続いて、リポジトリのパスワードを聞かれるので、

認証領域: <https://サーバーIPアドレス:443> Subversion repository
'mor' のパスワード: *******
-----------------------------------------------------------------------
ATTENTION!  Your password for authentication realm:

   <https://サーバーIPアドレス:443> Subversion repository

can only be stored to disk unencrypted!  You are advised to configure
your system so that Subversion can store passwords encrypted, if
possible.  See the documentation for details.

You can avoid future appearances of this warning by setting the value
of the 'store-plaintext-passwords' option to either 'yes' or 'no' in
'/home/mor/.subversion/servers'.
-----------------------------------------------------------------------
暗号化されていないパスワードを保存しますか (yes/no)? no
branches/
tags/
trunk/
mor@DESKTOP-V2DMDRJ:~$

パスワードを入力してやると、このように svn ls が実行できました。

これで、svnとして、接続先のサーバーが信頼できたので、問題なくAuthorの抽出ができます。

mor@DESKTOP-V2DMDRJ:~/git_migration$ java -jar ../svn-migration-scripts.jar authors https://サーバーIPアドレス/svn/repos_name/ username password
About to create the authors file.
admin = admin <admin@mycompany.com>
mor = mor <mor@mycompany.com>
mor@DESKTOP-V2DMDRJ:~/git_migration$

あとは手順通りにgitにい公図ればOKです。

ちなみに、自分で考えたように書いてますが、元ネタはこちらです。ありがとうございます。

eichisanden.hateblo.jp

空ディレクトリ

git では空ディレクトリはリポジトリに登録できません。svnではできていたのにね。 プログラムにもよりますが、空でもそのディレクトリがあることを前提にしていると困るので、git でも空ディレクトリを登録してやる必要があります。

簡単には、

$ find . -type d -empty

として、空ディレクトリを調べます。 今回は、見つかった空ディレクトリのうち、ごく一部だけを登録すればよかったので、手作業で touch .gitignore として、空ディレクトリに空の .gitignore を作ってやりました。

参考情報

その他にも、

空のディレクトリに.gitkeepを配置するコマンドラインツール - Qiita

のように、自動化したり、

git svn 実行時に自動で空の .gitignore をつけてくれるオプション (--preserve-empty-dirs) もあるそうです。

urashita.com

次はこれ試してみたいな。