MacでSourceTreeからGerritを利用するときのメモ

MacからSourceTreeを通じてGerritを利用する際のメモ

# 前提
以下は実施済み・設定済みとし、本記事では扱わない

- Gerrit上でのユーザ作成と設定
  - 公開鍵登録
  - リポジトリへの権限設定

# 開発の準備
## 秘密鍵の設置場所
クライアントPCに保持している秘密鍵の設置場所は、鍵生成時のデフォルト`~/.ssh/id_rsa`にしておく
この場所でないと、SourceTreeが秘密鍵を見つけられずGerritサーバへの接続に失敗してしまう

## Gitの設定
クライアントPCのGitのデフォルトユーザ名は、Gerritで登録したユーザ名と一致させておく
一致させていないと、Gerritサーバへの接続に失敗してしまう場合がある

### 手順
SourceTreeを起動し、Command+「，」により、設定画面を開き、以下を設定する

- 「ソースツリーにグローバルMerrurialとGitのコンフィグレーション変更を許可する。」をチェックONに設定
- 「デフォルトのユーザー情報」に、Gerrit上で登録したユーザ名を入力する
![settings_general.png](https://qiita-image-store.s3.amazonaws.com/0/125334/9c0afaec-f856-e036-b4d8-24bd117a8c8e.png)

## リポジトリのクローン
ブラウザ上でコマンドを取得し、Terminal上で実行する

### 手順
ブラウザでGerritにログインし、対象リポジトリのページを開く
SSHを選択し、「Clone with commit-msg hook」と表示されているコマンドをコピーし、Terminal上で実行する
![repository_clone.png](https://qiita-image-store.s3.amazonaws.com/0/125334/f1509971-5c67-c2f4-0cc4-5840a590e89e.png)

「with commit-msg hook」のコマンドを利用すると、ローカルの各コミットで、コミットメッセージの末尾にGerritのコードレビューを一意に識別する**Change-Idが自動で付与**されるようになる

# レビュアーに割り当てられた際の操作
## 修正内容をローカルで確認する
コードレビューのページでローカルリポジトリに修正内容を反映するコマンドを取得し、Terminal上で実行する

### 手順
コードレビューのページを開き、右上のメニューから「Download patch」をクリック
![reviewer_patch_download_menu.png](https://qiita-image-store.s3.amazonaws.com/0/125334/0fa4430b-0473-f092-8b9f-a1039d158211.png)

接続方法を「SSH」に変更し、Checkoutのコマンドをコピーして、Terminal上で実行する
![reviewer_patch_download_command.png](https://qiita-image-store.s3.amazonaws.com/0/125334/97550f30-aaf0-4a9e-e3eb-3ec45b1605c7.png)

# レビューを提出する際の操作
## 新しくコードレビューを開始する
ローカルのリポジトリでコミットした内容を、Gerritサーバのレビュー専用のブランチにPUSHする

### 手順
Windowsでは、`.git/config`ファイルの`[origin]`配下にPUSH先を追記（以下参照）した上で、SourceTreeのPUSH機能をそのまま利用する

```config:config
[origin]
...
push = refs/heads/*:refs/for/*
```

一方で、Macではどうやら[上手くいかない](https://community.atlassian.com/t5/Sourcetree-questions/SourceTree-Error-when-pushing-to-Gerrit/qaq-p/219096)ので、代替の手段を利用する

#### PUSHの代替手段：カスタムアクションを用意する
以下スクリプトファイルをクライアントPCの任意の場所に保存しておく

```bash:GerritPush.sh
#!/bin/sh
BRANCH=`git symbolic-ref --short HEAD`
git push origin HEAD:refs/for/$BRANCH --tags
echo "Pushed the branch to gerrit: $BRANCH"
```

以下コマンドで、保存したスクリプトファイルに実行権限を付与する

```bash
chmod 755 GerritPush.sh
```

SourceTreeを起動し、Command+「，」により設定画面を開き、カスタムアクションの項目を選択する
<img width="677" alt="settings_custom_actions.png" src="https://qiita-image-store.s3.amazonaws.com/0/125334/b74af81c-162f-a668-acd8-4ae03e7cefa8.png">

左下の「追加」ボタンを押し、メニューキャプションに「GerritへPUSH」（任意の名前）、実行するスクリプトに先ほど保存したスクリプトファイルを選択し、「OK」ボタンを押す
<img width="677" alt="settings_add_custom_action.png" src="https://qiita-image-store.s3.amazonaws.com/0/125334/d186903c-6743-edb3-fe8f-66fe7179f3be.png">

**PUSH対象のブランチにチェックアウト**した上で、任意のコミットを右クリックし、作成したカスタムアクションを選択する
![select_custom_action.png](https://qiita-image-store.s3.amazonaws.com/0/125334/22a91784-f4e5-9295-59b3-f6af7135a32e.png)

参考：https://github.com/WeiWeiOuO/Using-Sourcetree-on-Gerrit

## コードレビューの指摘を受けてコードを修正する
該当のコミットを、コミットメッセージのChange-Idだけ変えずに修正し、再度GerritサーバにPUSHする

### 手順
以下のように指摘が入った場合
![reviewee_minus.png](https://qiita-image-store.s3.amazonaws.com/0/125334/0db60d9f-77e0-28f5-ee30-07d079e6d9a6.png)

ローカルで修正が完了したら、「最新のコミットを修正」のオプションを選択する
![reviewee_amend.png](https://qiita-image-store.s3.amazonaws.com/0/125334/474e2bf1-1610-5449-922b-4fec8e1b47e1.png)

Change-Id部分以外のメッセージを適宜書き換えてコミット
Change-Id部分は書き換えてしまうと、PUSHしたときに**別のコードレビュー扱い**になってしまうので注意
<img width="1038" alt="reviewee_amend_commit.png" src="https://qiita-image-store.s3.amazonaws.com/0/125334/2f355210-b641-ac1d-a2db-c6ab45e23bd1.png">

カスタムアクションを用いてGerritサーバにPUSHすると、Gerrit上でコードの更新が反映される
![reviewee_update.png](https://qiita-image-store.s3.amazonaws.com/0/125334/f6c2bb2e-b2ae-c3aa-517b-2e87ea946928.png)

修正前のコードの変更はGerrit上に残る一方で、修正前のコミットメッセージは残らないため、注意する必要がある

# その他
## Gerritの練習
Gerritの利用方法は多少癖があると感じるので、ローカルにGerritサーバを立てて練習するのがオススメ
以下の公式が用意しているDockerを用いた構築手順を参考にすると、非常に簡単にローカルにGerritサーバを立てられる
https://github.com/GerritCodeReview/docker-gerrit