2011-01-12

Gitのbranch付きbundleの扱いがよく分からない

まとめ

まるごと rsync して解決してしまったので分からないままです><

たぶん clone –mirror でうまくいくみたい。

これまでは一直線 master のみの bundle しか扱ったことがない

bundle を使って何をしているかというと目的は大きく二つあって、

  1. 開発者以外の作業スペースのガード
  2. 開発環境のバックアップ

開発だけではサイト、サービスは完成しない。デザインする人もいれば内容を作り込む人もいる。それらの人の作業は残念ながら古き悪しきファイル共有ベースで行っているので、いつどんな事故が起きるとも限らない。そこで開発環境のコードと bundle を使って同期させている。せいぜい日に 1, 2度、手動だが何もしていないことに比べれば安心感は絶大。1

もう一つのバックアップについては git の command をたくさん覚えるより repository 丸ごとパッケージにできてそこから復元できる bundle で十分かなということで一石二鳥だと思って bundle を作っている。

また職場での git の使い方は git + svn ( git-svn じゃなくて別々に使う ) が中心で、ほとんど branch は使わずにやってきた。svn 側で branch を切って作業を始めるので git 側はバックアップ以上の意味があまりないのだ。

branch 付き bundle は意外に面倒くさい

git を使い始めて2年以上経っているのに今さら branch 付きの bundle を試してみた。今回はいつものガード目的ではなくゼロから作業できる Rails 関係のコードを branch も使いながら git に突っ込んでいる。これをいくつかの環境で正しく動くかどうかを確認しようってわけ。

まず今まで通り

$ git bundle create {FILE} HEAD

してみた。でもこれだと current branch しか bundle に入らないうえに branch の情報が残らないみたい。こんな感じ。

$ git clone {FILE}
$ cd {FILE}
$ git branch
* (no branch)

branch の情報がさっぱり残ってない。

$ git bundle create {FILE} HEAD --branches

とすればよいのかと思ったが、この場合も

$ git branch
* master

としか表示されない。topic branch で作業していたのに、master branch しかないことになっている。

$ git bundle create {FILE} --all --branches

として bundle を作ると少し変わる。この場合は

$ git clone {FILE}
$ cd {FILE}
$ git branch
warning: Duplicated ref: refs/remotes/origin/branch1
warning: Duplicated ref: refs/remotes/origin/master
* master

と表示される。うむむ? branch があることは分かっているみたいなんだけど、実際には branch として fetch できていない。のかな?

–mirror 付きで clone すればいいのかな?

[2011-02-12 追記]

bundle の話は Pro Git にも書かれておらず、なかなか情報が見つからない。役に立ちそうなのはこれかな?

git - Backup of github repo - Stack Overflow

なるほど –mirror や –bare 付きで clone するのか。

$ git branch
warning: Duplicated ref: refs/heads/branch1
warning: Duplicated ref: refs/heads/master
  branch1
* master

duplicated ref な warining は出るが、ちゃんと branch の情報を保持したまま clone できたようだ。とりあえずこんな感じかなぁ?

もっと分かる人いたら教えてください。

cf.

  1. 開発用の repository は svn なので git や hg を併用することで「違い」をそのまま吸収できるメリットもある。 

About

例によって個人のなんちゃらです