2013年1月3日木曜日

mercurial のサブリポジトリをgitにしてブランチ貼りまくるとトラブる(?)

うーん、この運用は駄目だな。

小生、個人的に作ってるスクリプト群が幾つかあり、それらは総て基本mercurialで保管しています。まあ当然ですね。小生はmercurial押しです。

そのうち、やや自信作のものをgist/githubに貼り直して、subrepoにしたりしてます。全体ではないです。pythonでいうと、パッケージ単位。__init__.pyのある単位ですね。

前者の個人的スクリプト本体は、試行錯誤を繰り返してそのままcommit忘れ、がよくあるので、cronで勝手にブランチ貼って、勝手にcommitするような運用にしてます。いやこれなかなか便利ですよ。
https://gist.github.com/3065657#file-repositorysafe-sh

この「勝手にブランチ」は、本質的には「作りかけ」です。故に、小生の気がすんだらdefaultにマージするのが前提です。
マージも、対default専用のを作りました。
https://gist.github.com/3065657#file-mergebranch-sh

gitのサブリポジトリも、ブランチやらマージやらは、ちゃんと掛かってる様でした。

そんな事を続けていたある日、事件はpushしようとした時に起こりました。

cannot push revision 0aa01b55dba9603009f5b0426fa284dfe714ea19

結論から言うと、こいつは、mercurialは「有るはず」と言ってるチェンジセットが、gitサブリポジトリに無くなってると、こうなるようです。事実、gitリポジトリ単体のpush/pullは成功します。

小生の嫌いなアレ、「gitは、参照してないチェンジセットをガベージコレクションにて、抹消する」
これですよ。喰らいましたよ。

コイツのお陰で、このリポジトリは、誰にもどこにもclone/pushできない奴になってしまったではありませんか。勝手に消して、トボけるとか、酷くね?>git

とは言え、よくよく調べてみると、小生のgit resetの使い方が間違ってたらしい。
http://d.hatena.ne.jp/murank/20110327/1301224770
revertのつもりで使ってたけど違うのね。危なくね?

こりゃ、git初心者はハマるなあ。とてもじゃないが、仕事じゃ使えない。
おっと、厳密に言いましょう。中級者以上を要求するツールは、仕事には使えません。

  • mercurial同士なら平和
  • git同士もおそらく平和
  • mercurial親、git子がハマる
  • git親、mercurial子はおそらく平和
    • ただし、前述の通り、親リポジトリの操作でハマる可能性が出てくる

何度も書いてるけど、gitは概念が高度過ぎる。流石linusの設計とでも言いましょうか。
resetとかの語彙も、微妙に違うんだよなー。

結局、本来の問題の「clone/push出来ない件」は、ブランチ指定cloneで回避しました。無くなってるチェンジセットは、前述のスクリプトが自動的に貼るものの筈で、大前提で、既にマージ済みの筈だから。