2014年3月23日日曜日

「mercurialに巨大なファイルをcommitしてpushしたら、誰もpull出来なくなった!」→壊れた??→(と思ってるアナタへ)

っと言うことが出稼ぎ先でありました。ファイル1個1GB。確かにデカイ。
コマンドラインだと、addするときに警告が出るはずですが、これは、TortoiseHG の気が効かないのか、或いは見落としたのか?

  • 結論から言うと、リポジトリは無事なのですが、
  • mercurialは、リポジトリ通信をするときにチェンジセットの圧縮展開をオンメモリでするらしく、
    • 特に hgwebdir.cgi は、メモリの狭いサーバで動かしていたので
    • そこで落ちてました。
  • 幸か不幸かmultiple headは禁止しており、
    • 問題のブランチは誰もチェンジセットを足せてないので、
  • 問題のチェンジセット以降を破棄したほうが良さそう。
特定のチェンジセット「以降」を破棄して良いなら方法はあります。
知らない人が多いかもしれません。 clone/pullはチェンジセットID&ブランチを指定できます。

いずれも -r です。

http://selenic.com/hg/help/clone
http://selenic.com/hg/help/pull

-r --rev REV [+] include the specified changeset
-b --branch BRANCH [+] clone only the specified branch

より若い番号から始めて、指定のチェンジセットまで吸ったら停止します。
  1. 新しいディレクトリに、その他のブランチだけをcloneする
  2. 問題のチェンジセット以前を指定して、pullする。
  3. 新しいディレクトリの .hg を、公開リポジトリの .hg と入れ替える。
    1. ファイルコピーじゃ駄目です。
    2. ディレクトリごと入れ替えます。
  4. apacheを再起動、とかは要りません。hgwebdirはリアルタイプでリポジトリを見てます。

この手のトラブルは、mercuria 1.Xだと思われます。もちろん本家もこれ系の問題は認識しており、2.0では巨大ファイルの通信方法から変えたりしてるらしい。
http://mercurial.selenic.com/wiki/LargefilesExtension