GitとSVNの同時運用

@numa08

自己紹介

  • @numa08
  • 人間git-svn
  • アイコンかわいいガチ勢

今日話すこと

  • GitとSubversionが共存する環境下で
  • 両方を同時に運用し
  • リポジトリをぶっ壊さない方法

環境

  • Subversion

    • 社外
    • コミット権保持者が限られてる
    • standartな構成ではない

環境

  • Git

    • 社内
    • Gitlab使ってます
    • master以外は誰でもコミットできる
    • git-flowは使ってないよ

要求

  • SubversionのコードをGitに移動
  • 開発はGitのトピックブランチで開発
  • プルリク後にmasterにマージ
  • マージ後Subversionにもcommit

登場人物

  • 開発者

    • 実装とかする
    • Subversionへのコミット権は無い
    • Gitのmasterへプッシュ権は無い

登場人物

  • 管理者

    • 実装とかする
    • Subversionへのコミット権がある
    • Gitのmasterへのプッシュ権がある

SubversionからGitに移動

git svn cloen ${SVN_URL} --trunck=${trunk} \
--tags=${tags} --braches=${branche1} \
--branches=${branche2} ${dir}
cd ${dir}
git remote add origin ${GIT_URL}
git push origin master

SubversionからGitに移動

  • git-svnで可能
  • オプションの指定でブランチやタグが散らばっててもなんとかなる
  • URLに日本語がある場合は、パーセントエンコード
  • でかいリポジトリだと時間がかかる

    • 指定のリビジョン以降取得とかも検討

開発者が増えたよ

git clone ${GIT_URL} ${dir}
cd ${dir}
git checkout -b ${branch}
git commit
git commit
...
git push origin ${branch}

開発者が増えたよ

  • コミットやプッシュは普通に行える
  • ブランチ名はissueベースで命名してます
  • Gitlabでマージリクエスト、コードレビュー、マージを行います

svnにコミットする

git pull origin master
git svn dcommit
git push -f origin master

svnにコミットをする

  • git svn dcommitをすると、svnに行ったコミットのハッシュが変わる
  • -fをつけてpushを行い、リポジトリを更新する

svnにコミットをする

  • submoduleを利用してはいけない

    • dcommitできない
  • git mvしたログがあるとクラッシュすることがある

    • 再現方法不明
    • “タマに起きる“としか・・・

管理者が増えたよ

git cloen ${GIT_URL} ${dir}
cd ${dir}
git svn init ${SVN_URL} --trunck=${trunk} \
--tags=${tags} --braches=${branche1} \
--branches=${branche2}
git log --pretty=format:"%H" -1 > .git/refs/remotes/trunk
git svn fetch

管理者が増えたよ

  • git svn fetchでsvnのコミットを取得できる
  • 生成されるハッシュはgitのコミットとは対応していない
  • .git/refs/remotes/trunkにtrunkのHEADに対応するコミットのハッシュを記入する

どうしてこうなった

  • 政治的なアレとしか・・・
  • gitに移動するっぽい流れはある

tips,注意事項など

  • masterへのマージは--no-ff

    • svn的にはブランチは無視される
    • git的にはブランチ情報が残る
  • masterの歴史の書き換えはしない
  • git svn dcommit,git push -fを一緒にやるサブコマンドを作ろうと思う
  • 名前募集