明日の自分のために

moon indicating dark mode
sun indicating light mode

Repoの使い方とWindows Subsystem for Linux(Ubuntu20.04)のセットアップ方法。

June 04, 2020

Repoの使い方を整理します。試しにWindows Subsystem for Linux(WSL)でやってみます。

久しぶりにVirtualBox上のLinuxで実行しようと思ったのですが、AMD-VとHyper-Vが競合するようでVMの起動ができませんでした。 そこでHyper-Vを無効化するくらいならWindows Subsystem for Linux(WSL)を使ってみようと思いました。
なので、ここではRepoの使い方をWSL上で説明します。

Repo

Repoは、複数のGitリポジトリを管理するためのツールです。Android OSの開発で利用されています。

WSLの環境設定

まずWSLのセットアップします。

“Windows 機能の有効化または無効化”でWindows Subsystem for Linuxを有効化します。
続いてMicrosoft StoreでUbuntuを検索してインストールします。 Ubuntu20.04をインストールしました。

Ubuntuのインストールができるとターミナルが開くのでアップデートしておきます。

sudo apt-get update
sudo apt-get updgrade

Gitは予め入っているので設定だけします。

git config --global user.email "email@example.com"
git config --global user.name "username"

pythonもインストールしておきます。repoのためにシンボリックリンクも作成しておきます。

sudo apt install python3 python3-pip -y
sudo pip3 install pip -U
sudo ln -s /usr/bin/python3 python

Repoのインストール

Repoをインストールします。(Google)[https://source.android.com/setup/build/downloading]から入手します。

curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo

Repoの使い方

以下のリポジトリを使って説明します。中身はrepoに必要なmanifestのxmlファイルとmarkdownファイルが置いてあるだけです。

構成

以下のようなディレクトリ構成で考えます。 dir_a、dir_b、dir_cはそれぞれ別のgitリポジトリで管理されているとします。

.
├── dir_a/
│   └── dir_c/
└── dir_b/

上記ディレクトリと対応するgitリポジトリは以下です。

  • repo-test-a dir_a配下のプロジェクトのリポジトリ
  • repo-test-b dir_b配下のプロジェクトのリポジトリ
  • repo-test-c dira/dir_c配下のプロジェクトのリポジトリ

Repoを使うことでこれらのgitリポジトリ / ディレクトリに対する操作を横断的に行う事ができます。

manifest

Repoはmanifestによってgitリポジトリとディレクトリの管理を行います。 そして、このmanifestもGitリポジトリで管理します。このリポジトリの名前は以下のようにします。

manifestはxmlファイルで、今回の例では以下のように記載します。

<?xml version="1.0" encoding="UTF-8"?>
<manifest>
<remote name="origin"
fetch="https://git@github.com"/>
<default revision="master"
remote="origin" />
<project path="dir_a"
name="Gan0803/repo-test-a"/>
<project path="dir_b"
name="Gan0803/repo-test-b"/>
<project path="dir_b/dir_c"
name="Gan0803/repo-test-c"/>
</manifest>
  • remoteのnameにリモートリポジトリの名前を記述し、fetchに取得先サーバの情報を記載します。
  • defaultのrevisionにmasterブランチを指定して、remoteはoriginを指定します。(事前にgit remote set originしておきます。)
  • projectのpathにリポジトリを配置するディレクトリを記載し、nameにリポジトリを記載します。ここでremoteなどを記述しない場合はdefaultが使用されます。

フォーマットの詳細はrepoのWEBページを確認してください。

動作確認

実際に複数のリポジトリからRepoでソースコードを取得し、ローカルのディレクトリに展開します。

まずはマニフェストを指定してrepo initします。このコマンドでRepoのmanifestをGitリポジトリから取得してディレクトリをrepo用に初期化しています。

mkdir ~/repo-test
cd ~/repo-test
repo init -u git@github.com:gan0803/repo-test-manifest.git

もし自分のリポジトリで確認する場合は、環境に応じてgitコマンドが通るよう事前に~/.ssh配下の設定を適切にしておきます。

次に取得したmanifestに基づいてリポジトリからソースコードを取得します。

repo sync

repo syncの途中で秘密鍵のパスワードを聞かれて止まってしまう場合は、ssh-addしておきます。

ssh-add ~/.ssh/id_rsa

repo syncが成功すると、manifestの記載通り、リポジトリの内容が指定されたディレクトリに展開されます。 確認すると以下のようになっているはずです。

~/repo-test
├── dir_a
│   ├── [files]
│   └── dir_c
│   └── [files]
└── dir_b
└── [files]

各ディレクトリはgit cloneされているだけですので、それぞれのディレクトリでgit commit, git pushなど普段どおりに作業することができます。

repoにはsync以外にも様々なコマンドがあります。複数リポジトリの差分を表示したり、複数リポジトリに対するシェルコマンドの実行ができたりします。 Repo コマンド リファレンスに簡単な説明があるので確認してみてください。

おっと……、Windowsでも動くみたいですね。 https://gerrit.googlesource.com/git-repo/+/refs/heads/master/docs/windows.md

タグ:RepoWSL