Pages

2009-02-03

Repo って何だろ? -- 複数 git リポジトリーのためのツール

Google が repo というツールをリリースしている。これは、Google が開発している Android プロジェクトのためのツールなのだけど、Android 専用のツールといふわけでもなさそうなので、少し調べてみた。

Repo って何だろ?

repo は、git を補完するツール。

repo の仕事は主に 2 つ。1 つは、「複数の git レポジトリー」を管理すること。もう 1 つは、git のレポジトリーを取って来たり、レビュー・サーバーに変更点を送ったりということ (特に複数レポレトリーをサポートしている点がミソ)。

何が嬉しいの?

普通、バージョン管理ソフトは、一つのリポジトリーで一つのプロジェクトを管理する。開発規模が小さなうちは、これでいい。問題は開発規模が大きくなった時。もっと言えば、複数のプロジェクトが出来るた時。

例えば、複数のアプリを別々のリポジトリーで管理している時とか、(git 管理の) オープン・ソース・プロジェクト (ex. ライブラリー) を使っている時なんかがそう。こんな時、Subversion だったら svn:externals を使う。svn:externals は、メインのリポジトリーに「外部 (external)」のリポジトリーを追加するけど、repo は違う。最初から「複数のリポジトリー」を管理できるよう設計されている。

Repo がどう動くのか、まずは Android で試してみませう

repo のインストール

まずは、repo をインストールする。

$ curl http://android.git.kernel.org/repo >~/bin/repo
$ chmod a+x ~/bin/repo

Working Directory を使る。

作業用のディレクトリーを作る。名前は何でもいい。

$ mkdir working-directory-name
$ cd working-directory-name

準備

最初に、repo init コマンドを実行する。

$ repo init -u git://android.git.kernel.org/platform/manifest.git

このコマンドがやることは 2 つ。

  1. repo コマンドの実体 (Python スクリプト) をダウンロードする
  2. Manifest ファイルを取得する。

実は、repo コマンド自身は sh script で、中で python script を走らせている。で、git を操作するための「本体」部分を、init コマンド実行時にダウンロードしている。

Manifest ファイルは、repo の設定ファイル。以下の内容が書いてある。

  • どこの git リポジトリーから clone するか?
  • どのブランチを取って来るか?
  • 取って来たリポジトリーを、どういう風に配置するか?

Repo sync -- Git Clone in Repo

Manifest を取得したら、repo sync コマンドを実行する。

$ repo sync

このコマンドは、初めて実行する時は git clone と同じことをする。つまり、リモート・リポジトリーを取って来る。二度目以降は、git pull と同じことをする。

Repo start

初めて repo sync した直後は、ブランチが出来ていない。なので、repo start コマンドでブランチを作ってあげる。

$ repo start master --all

repo の説明では「トピック・ブランチ」という用語が使われている。これは、(開発とかコードネームとかの)「トピック」をベースにブランチ名を付けるという考え方。git の世界でも使われる。

repo start コマンドを使わずに、git-branch コマンドで各々のリポジトリーごとにブランチを作ってもかまわない。

あとがき

repo を使うと、複数の git レポジトリーを扱うことが出来るやうになる。複数のリポジトリーを管理していると、clone/pull/branch まわりで混乱してくるので、その部分を肩代りするために「repo」が作られたんだと思う。

ただ、ぼくも repo を見始めたばかりなので、分からないことも多い。例えば

  • repo sync で取得したローカル・リポジトリーを、更に git clone でコピーできない。最近試してみたら、何か普通に通った。ブランチを作ってあげる必要はあったけど。
  • repo でリモート・リポジトリーに push する方法が分からない。

ここら辺は、エントリーを書きながら勉強していこうと思う (誰か教えて!)。次回は、manifest ファイルの書き方!!

4 comments:

  1. 参考にさせてもらいました。
    http://trwtnb.blogspot.com/2010/04/windowsandroideclipse.html

    ReplyDelete
  2. ブログ拝見致しました。
    一つのページに情報が集約されていて、分かり易いですね。参考にして頂けて光栄です。

    ReplyDelete
  3. 有難うございます。噂のAndy Rubinのtweetを理解できました。

    ReplyDelete
  4. ああ、今、噂の Rubin 氏の Tweet ですね。
    repo は最初何をやっているのか分からないコマンドなので、この記事が役に立って良かったです。

    ReplyDelete