ラベル hate subversion の投稿を表示しています。 すべての投稿を表示
ラベル hate subversion の投稿を表示しています。 すべての投稿を表示

2012年1月6日金曜日

subversionを辞めるべきm個の理由

m個ってなってるのは数えるのが面倒だからです。

別の記事にねじ込んでたので、分離しました。

開発の現場ではバージョン管理ツールは使ってるだろうと思いますが、
「創業当時からのsubversionです」ってところが殆どでしょう。

しかし、subversionは幾つかの明確な問題があり、
業務に支障を来す恐れがあります。
実際に、今小生は出稼ぎにいっている職場では、
支障を来しています。
  • 設置面
    • 「サーバ」が必ず必要。
    • C++による実装のため、ソースから設置は面倒くさい。
      • rpmアルよ
        • 知ってるよ。ってCentOSだと古かったり、組み合わせるバグトラックシステムが古かったりとか色々。小生はubuntuだから比較的新しいけど。使ってないけど。
  • 運用面では
    • ローカルコピーでもかなり遅い。→実測しました
    • さらにHTTP経由だと更に遅い
      • そのために、.svnディレクトリに、巨大なキャッシュファイルを置いている。
      • 迂闊にディレクトリコピーしようとすると、.svnを上書きしちゃって、ややこしいことに。
        • .svnを削除してからコピー、って※ツールの癖に手間を増やすな
      • 遠隔地にコピーしようとすると、絶望的な時間を要する。
        • .svnを削除してからscp/ftp、って※ツールの癖に手間を増やすな
    • apacheモジュールサーバの場合だと、リポジトリを破損する可能性が高い。
      • 実績&経験を踏まえると、20MB以上のサイズのバイナリを扱うと、壊れる可能性が飛躍的にあがる
      • リポジトリを破損しても
        • 次のリビジョンをcommit出来てしまう。
        • 修復する手段が少ない
        • しかもsvndumpは壊れたリビジョンに引っかかると異常終了する。
          • 信頼性皆無
    • ブランチの実装がヘボイ。
      • branchって掘ってコピーして使ってね♪とか意味判らん。※ツールの癖に手間を増やすな
      • マージの実装がヘボイ。殆ど手伝ってくれない。マージ対象バージョンを必ず人間が指定する、って ※ツールの癖に手間を増やすな

以上の大きなデメリットが、僅かなメリットを凌駕します。

一応、「僅かなメリット」も書いておきましょう。


  • 複数種類のOSで、相互に日本語ファイル名を交換できる。


一方、分散バージョン管理は、自前でリポジトリを持つため、ローカルOSのファイル名キャラクタセットとは無縁では居られません。小生もちょっと考えたけど思いつきませんし。

2011年11月27日日曜日

subversion時代のロック機能って、要らなくね?

出稼ぎ先でsvnを辞めさせてmercurialに移行を推進するときに
反論のうち一つが、次のようなものでした。

svnのファイルロック機能が使えなくなる。

これっておかしくね?
目的と手段を完全に履き違えてます。

ファイルロックってなぜ必要?

バイナリファイルを管理しなきゃならないから。
マージできないからコンフリクトした時に面倒だから。

差分管理の出来ないファイルをバージョン管理って、意味なくね?

EXCEL仕様書を追放しましょう。

と言うのは極論だとしても。

わざわざ「ロックを取得」とかやるのは、CVS以前に逆戻りですよ。

筆者の考え方は真逆です。ファイルロックは要りません。

ある担当者がその作業を完了するまで、他の作業者の作業を止めるのは本質的ではありません。同じ「EXCEL仕様書」の別シートであっても、ファイル全体がコンフリクトします。これはEXCELとsvnの問題であり、作業者がそれに付き合って、作業の直列化をするべきではありません。

何でもいいから作業進捗はcommitするべき。そして作業を続けるべき。

それを「ローカルリポジトリ」という切り口で解決したのが、分散バージョン管理です。ファイルロックは要らないのです。

もちろんcommitしたのが「EXCEL仕様書」であれば、手動マージの手間は残ってるのですが、それを先送りにして作業を続けられるのをメリットとすべきでしょう。最後にまとめて出来ることは、先送りにしても良いはずです。

ちなみに、既に出稼ぎ先ではmercurialの導入が済んでますが、前述の反論はしてません。反論してきた彼を説得するのは、本質的ではないので省きました。

2011年11月1日火曜日

mercurialのススメ、その後

mercurialのススメを書いてから、もう10ヶ月経ってますが、当時からするとだいぶmercurialも普及してきた感があります。グーグルの検索からも、数人来ますしね。

筆者の出稼ぎ先では、新規案件にようやくmercurialを使い始めました。幾つかの些細な反論&反対がありましたが、この手の話は使うより慣れろです。

従業員のほぼ全員がWindowsなので(筆者はlinuxですが、従業員ではないので)、漢字ファイル名を使わないわけには行きません。結論としては

  • プログラマはmercurialで
  • 非プログラマはsubversionで

まあ問題の先送りですね。

非プログラマの成果物は、画像だったりEXCEL仕様書だったりで、どうやってもコンフリクトするので、multiple headのメリットは殆ど有りません。また漢字ファイル名を付けたがるので、これを辞めろというのはかなりの混乱があるだろうという配慮からです。

一方、プログラマは、英数字だけのファイル名にしてね。と徹底しており、それが可能です。

まあ大抵の部署で、こういう運用なら可能なのでは無いでしょうか。

出稼ぎ先ではバグトラックはredmineを昔から使ってました。mercurialでも標準で繋がりますが、リポジトリを1組しか設定できません。こういうのって古いんじゃね?結局mercurialだけを接続しました。

multiple headとpushは、最初はかなりの抵抗があったようです。当面は、トータスhgのpushのforceだけ何とか覚えてもらって、マージは後で考えることにしました。

もともと彼らの実装は、特定ソースのswitch/caseを皆でよってたかって書き足す運用なので、コンフリクトは免れません。subversionだったら簡単だったよという主張。こりゃ弱ったなと思いつつ、色々確認してみましたが、どうやらswitch/caseの増減は、mercurialは苦手なタイプの差分ってことらしい。筆者はそういう書き方をしたことがないので、困ったことがない。と言うわけです。

そりゅあお前ら書き方が悪いよ、という台詞を飲み込んで、当面は一人がマージをすることになった訳です。2週目以降は、徐々に他の作業者にも自分でマージしてもらうようにしました。

なんだかんだと3週間ほど経ちましたが、マージは完全に馴染んだと言ってよいでしょう。特にトラブルも不満も出てません。

2010年12月26日日曜日

mercurialのススメ(2)

筆者は5年ほど前から
バージョン管理はmercurialで統一しました。
http://mercurial.selenic.com/
利用当初は0.6だったと思いますが、今や1.7.2。
あのGoogle Codeですら採用しています。

subversionを使ってる方々は、今すぐgit/mercurialに移行しましょう。

もちろん筆者としてはmercurialを勧める訳ですが

デメリットを先に言っておきましょう。
多分それだけです。
subversionの問題点の殆どが解消します。それがメリット。

  • 「サーバ」が要らない。ってサーバ機能を内包してる。windowsの人はtortoiseHG(http://tortoisehg.bitbucket.org/)で一発インストール。
  • リポジトリ通信が高速。同規模のプロジェクトで、subversionの数倍。
  • リポジトリ同期のプロトコルが豊富。しかも内蔵。httpd, ssh, 
  • ブランチ&マージは半自動的。場合によってはほとんど人手を介さない。
  • 事実上、コンフリクトは起こらない。(マルチプルヘッド扱いになるので先送りできる)
オフィシャルサイトの情報もよくできてますが、
http://mercurial.selenic.com/wiki/JapaneseMercurial
日本語チートシート(アンチョコ)を作ってくれてる人が居たので、これを傍らにおけば、運用は容易でしょう。http://www.textdrop.net/doc/mercurial-cheat-sheet-ja/

bazaarが入ってないのは?
http://bazaar.canonical.com/en/
リポジトリ間同期をするときに、必ずマージをさせるのは
筆者的にはsubversionの反省点ですので。
あと、実際に色々試してみると、激遅い。なんなのコレ。

故に、比較的シンプルなmercurialをお勧めしています。

2010年8月8日日曜日

mercurialとsubversion file:の実行時間測定

出稼ぎ先で、subversionに悩まされてます。

悩んでいる理由はさて置き、とりあえず「遅い」です。
mercurialに慣れた筆者には、20倍は遅く感じます。

具体的に、どの程度遅いのか、測って見ました。

結論から言うと、subversionはローカルで動かしても、
mercurialの2〜3倍遅い。ということに成りそうです。

Cで書いてある筈のsubversionが
pythonで書いてあるmercurialより遅いってどうよ?

普通にベンチマークすると、真逆になる話ですね。

速度に影響するのは、実装言語じゃない。
データ構造とアルゴリズムであるという。
好例ですね。

/usr/bin/timeで簡単に測ってみると、
subversionは、sysの時間が長めに見えます。
disk IOがネックになってる?

カーネルソースは、バージョン管理の「具」としては、
上品な部類だと思います。
これで、巨大なバイナリやらも詰め込んだらどうなることやら。

linuxカーネル2.6.35のソース 66MB

tarの展開
real 1m2.495s
user 0m43.451s

hg init
hg add
real 0m9.517s
user 0m1.940s

hg commit
real 1m12.223s
user 0m54.771s
#更新数 33316

hg clone
real 0m44.199s
user 0m22.597s

svn import linux-2.6.35 file://*/SVFS -q
real 3m47.385s
user 1m7.488s
sys 0m26.194s

svn co file://$PWD/TEST-SVFS linux-co -q
real 2m13.232s
user 0m47.135s
sys 0m18.765s