git管理ツールRepoを入れてみよう


# Repo

repoはAndroidのプロジェクト管理用に作られたgitの管理ツールです。
複数のgitリポジトリを一括で管理することが出来ます。
普通に独自のプロジェクトに利用することが可能なため、規模が大きくなり、複数リポジトリを管理する
必要があるようなプロジェクトに使うと良いでしょう。

# Repoのインストール

ここは公式にのっている通りに

```
curl http://commondatastorage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
```

あとはパスを通すなりしてください。

# マニフェストファイルの作成

マニフェストファイルはrepoコマンドでどのリポジトリを取得してくるかを
書く為の設定ファイルのような物です。

## マニフェスト用のgitリポジトリの作成

まずはマニフェスト用に別途gitのリポジトリを作成します。
例えば

```
mkdir HogehogeProject
cd HogehogeProject
mkdir manifest.git
cd manifest.git
git init --bare --shared
```

とか。
gitコマンドはこれで正しいか分かりません。ググってください。

## default.xmlの作成

repoコマンドで取得する場合、default.xmlというxmlファイルに記述した設定で取りにいくようです。
ここに取得するリポジトリやリビジョンなどを指定していきます。

以下は最低限必要と思われるファイルの例です。

```xml
<?xml version="1.0" encoding="UTF-8"?>
<manifest>

  <remote  name="origin"
           fetch="git://hogehoge.com/HogehogeProject"/> 

  <default revision="master"
           remote="origin" />

  <project path="project1"
           name="project1"/>
  <project path="project2"
           name="project2"/>
</manifest>
```

### remote

・name
リモートの名前です。
大抵何も考えないとoriginになるかと思うので、originにしておけばいいでしょう。
好きなようにしてもいいでしょう。

・fetch
repoで一気に取得する時のURIの接頭辞的なものです。
詳しくはprojectのところで説明します。

### default

project要素の各属性値を省略した場合のデフォルト値を設定します。

・revision
取得するリビジョンを設定します。
上記の例ではmasterブランチを取るようにしています。
リビジョン番号を指定して特定のリビジョンを取得することも可能です。

```
<default revision="35ba1ca3d6fa1eca0605bf9a047bf9105a4fa5da"
         remote="origin" />
```

・remote
使用するremote要素のname属性を指定します。

### project

各リポジトリの取得設定をします。
defaultで設定したものを使いたくない場合は各project要素内で属性値を
オーバーライドしてください。

・path
repoで取得してきたときにローカルに自動生成されるディレクトリ名。
ローカルマシンのhogehoge_dirディレクトリでrepoコマンドを実行した場合
hogehoge_dir以下にpathに記述された名前でディレクトリが生成されます。

・name
リポジトリのパスを設定します。
ここに書く物には.gitはいりません。
remote要素のfetch属性と組み合わされ、最終的には以下のように展開されます。

```
${remote_fetch}/${project_name}.git
```

上記のproject1の場合、以下のようになります。

```
git://hogehoge.com/HogehogeProject/project1.git
```

# Repoの初期化

まず、リポジトリ群を展開したいディレクトリを作成、移動します。

```
mkdir HogehogeProject_repos
cd HogehogeProject_repos
```

展開先に移動したらrepo initコマンドを実行します。
repo initは以下のようになります。

```
repo init -u gitのURI -b ブランチ名
```

サンプルのマニフェストでは以下のようになります。

```
repo init -u git://hogehoge.com/HogehogeProject/manifest.git
```

## -uオプション

マニフェストのgitリポジトリを指定します。
先程の例ではHogehogeProjectディレクトリ以下にmanifest.gitというリポジトリで
作成したので

```
-u git://hogehoge.com/HogehogeProject/manifest.git
```

となります。

## -bオプション

取得するブランチ名を設定します。
ここで設定するのは **マニフェスト用のリポジトリのブランチ** です。
取得したいリポジトリ群のブランチを指定しても駄目です。
default.xmlの設定を書き換えてブランチを切っている場合などに使います。
指定しない場合はmaterを取ってきます。

# Repoによるリポジトリの一括取得、更新

repo initをかましたディレクトリ内で今度はrepo syncコマンドを実行します。
repo syncを実行するとマニフェストファイルに記載されているリポジトリを一括で取得してきます。

```
repo sync
```

repo syncが成功するとリポジトリが一括でダウンロードされています。
repo syncでコンフリクトが起きたりした場合の対処はそれぞれコンフリクトが起きた箇所をgitで
修正していくのが基本になると思います。
あまり試していないのでその辺は自分で調べてください。

# ブランチを切る

repoコマンドを使って取得してきたリポジトリに新しく作業用のトピックブランチを
一括で作ることが出来ます。

```
repo branch ブランチ名
```

または普通にgitコマンド、またはsource treeなどを使って各リポジトリ毎にブランチを切って
作業することも出来ます。
全てのプロジェクトを編集するということはなかなかないと思うので、あまり使うことはないかもしれません。　

以上がrepoの基本的な使いかたです。
後はコマンダーな方はコンソールでgitを叩くもよし、GUIっこはSource Treeを使ってボタンポチポチ管理でもよし。
各々好きなように使ってください。

更にrepoを使いこなしたい方は

```
repo help
```

以上のコマンドでrepoのコマンド一覧が見れるので、そちらを参考にしてください。
以上！