PC メモ

SVNからGitへの移行

Subversionで管理しているプロジェクトをGit管理に乗り換える手順。検索すればいくらでも参考になるサイトはあるが、同じ動きをしないことがあり、古い情報にヒットしたのかもしれないので、備忘録的にメモしておこう。

大まかな流れはこんな感じ。

  1. リモートのsvnリポジトリをローカルのgitとしてとりこむ。
  2. git のoriginとして動くように、リモートにgitの共有リポジトリを作る。
  3. ローカルのgitにoriginの情報を追記する.
  4. local_gitの内容をoriginにpushする。
  5. originをリポジトリとして、ローカルに取得する。
  6. hooksなどの整備など

  1. リモートのsvnリポジトリをローカルのgitとしてとりこむ。
    実はsvnからgitへの変換自体は最初に行っている。

    git svn clone --stdlayout --authors-file=users.txt svn+ssh://user@example.com/repository.svn temporary_repository.git

    users.txtは以下のようなフォーマットで、svnのユーザー情報を列挙しておく。

    user = user <user@example.com>
  2. リモートにgitの共有リポジトリを作る。
    git init --shared --bare repository.git
  3. ローカルのリポジトリに、リモートの共有リポジトリの情報をoriginとして追記する。
    git remote add origin git+ssh://user@example.com/repository.git
  4. ローカルのgitの内容をリモートのgitにpushする。
    オプション–allをつけることで、master以外のbranchesなどもpushする。とりあえずmasterだけならオプションは不要。

    git push -u origin --all
  5. リモートの共有gitリポジトリから取得し直す。
    git clone git+ssh://user@exmaple.com/rerpository.git repository.git

    今後はローカルのrepository.gitで作業すればいい。

  6. git pushしたら本番環境や、テスト環境にデプロイされるようにhooksを整備する。
    リポジトリと本番(テスト)環境が別のコンピュータにあるので、リポジトリが更新されたらwgetで本番(テスト)環境のcgiにアクセスして、そこからgit pullするスクリプトを動かす。

    1. ./hooks/post-updateをこんな感じで。
      #!/bin/sh
      /usr/local/bin/wget --http-user=user --http-passwd=password -O - http://www.example.com/trigger.cgi
    2. 本番(TEST)環境用にリポジトリを取得
      git clone git+ssh://user@example.com/repositroy.git repository.git
    3. 本番(テスト)環境のcgiスクリプトはこんな感じ。
      #!/bin/sh
      set -f
      echo "Content-type: text/plain; charset=iso=8859-1"
      echo ""
      GIT_WORK_TREE="/home/user/repository.git"
      cd $_GIT_WORK_TREE
      sudo -u user /usr/bin/git --git-dir=$GIT_WORK_TREE/.git pull

      これがhttp://www.example.com/trigger.cgiでアクセスされる内容。

    4. これでうまくいくはず!と試してみると、本番環境のwwwのログには、trigger.cgiのアクセスログがちゃんと残るが、リポジトリのファイルが更新されない。はて?
      visudoでapacheがsudoできるように設定が必要でした。
      visudoして、以下の行を追加

      apache ALL=(user) NOPASSWD:/usr/bin/git
    5. 微調整
      http://www.example.com/trigger.cgiは偶然だとしてもアクセスされちゃこまるんで、
      uuidgenで得られた値をディレクトリにつけると良いね。
      こんな感じ。
      http://www.example.com/b6cd0a16-93a5-4b33-815f-3a76f00812e1/trigger.cgi

実は最後のデプロイのところでつっかかり手間取った。
リポジトリと本番(テスト)環境が同じなら、検索したらすぐ出てくるように、wgetとかしなくて良いかららくちん。

返信を残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください