【isucon】EC2上にあるprivate-isuのソースコードをGit管理する

## はじめに

private-isuの付録を解く際に、EC2のサーバ上で操作やファイル編集をしていたんですが、差分の確認や何ページまで進めたのか把握が難しかったり、ちょっとしたタイポやインデントミスも起きやすくて、大変でした。
ISUCON当日もサーバ上で作業するのではなく、**ローカルで編集→サーバ内でpullして反映**という流れが一般的なこと、学習面でもログを見返せたり、便利だと思い、Git管理する方法を調べて実現してみました。その過程をメモとして残したいと思います。

ちなみに、private-isuの付録っていうのは、以下の書籍の内容になります。

https://gihyo.jp/book/2022/978-4-297-12846-3

そして、Git管理の方法は以下の記事を参考にしました：

https://isucon-workshop.trap.show/text/chapter-3/0-Github.html

---

## ① private-isuの環境構築
この記事では、すでに**環境構築が終わっている前提**で、Git管理の方法に絞って説明していきます。  
もし、環境構築がわからない方は、下記の記事がとてもわかりやすいので参考にしてください！

https://qiita.com/masayasviel/items/353024f7f2e292572942#%E3%83%99%E3%83%B3%E3%83%81%E3%83%9E%E3%83%BC%E3%82%AF%E3%82%A4%E3%83%B3%E3%82%B9%E3%82%BF%E3%83%B3%E3%82%B9

---

## ② サーバからGitHubにアクセスするために、公開鍵と秘密鍵を作る

### キーファイルを置く`.ssh`ディレクトリに移動

private-isu（iscogram）のサーバ内には、すでに`.ssh`ディレクトリがあるので、まずはそこに移動します。

```bash
$ cd ~/.ssh
```

**注意点**  
デフォルトだとパーミッションの問題で、コマンド実行やディレクトリの移動ができないかもしれません。  
この場合は、スーパーユーザ（管理者権限）に切り替えるか、ログインユーザに権限を付与する必要があります。

**スーパーユーザに切り替える方法**：

```bash
$ sudo -s
```

### sshディレクトリのパーミッション（権限）を設定

```bash
$ chmod 744 ~/.ssh/
```

権限が正しく反映されているか確認：

```bash
drwxr--r--  2 root root 4096 Jun  2 14:00 .ssh
```

### 公開鍵と秘密鍵の作成

`.ssh`ディレクトリ直下で、次のコマンドを実行します。

```bash
$ ssh-keygen -t ed25519
```

- `ssh-keygen`: SSHキーの生成や管理を行うコマンド
- `-t`: 鍵の種類（アルゴリズム）を指定
- `ed25519`: EdDSAという公開鍵アルゴリズム

### `config`ファイルにGitHubのSSH設定を追加

```bash
$ cat >> ~/.ssh/config <<EOL
Host github.com
  HostName github.com
  IdentityFile ~/.ssh/id_ed25519
  User git
EOL
```
- `cat`：ファイルの内容表示、データを追加するためのコマンド
- `>>` ：追記するためのリダイレクトオペレータ、指定したファイルの末尾にデータを追加する
- `<<[任意の文字列]`：ヒアドキュメントというシェルの機能。指定した文字列が現れるまでの行をファイルに追記する。今回は`EOL`(エンドマーカー)が現れるまで、入力されたテキストを追加するという意味になる

- `Host`：コマンド実行時に指定する短縮名やエイリアスを指定[任意の名前を設定できる]今回は実際のホスト名と同一の`github.com`を指定
- `HostName`: 実際に接続するサーバーのホスト名や IP アドレスを指定
- `IdentityFile`：SSH 接続に使用するファイルパスを指定
- `User`：SSH で接続する際のユーザ名。GitHub では`git`を使用する

### `config`ファイルのパーミッションを変更

```bash
$ chmod 644 config
```

設定ファイルなので、実行権限は不要です。なので読み取りと書き込みだけ付与します。

---

## ③ GitHubにリポジトリを作成し、公開鍵を登録して認証できるようにする

この手順は、こちらの記事を参考にしてください：

[GitHubリポジトリ作成＆公開鍵登録手順](https://isucon-workshop.trap.show/text/chapter-3/0-Github.html#:~:text=https%3A//github.com/new%20%E3%81%AB%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%81%97%E3%81%A6%E3%80%81%E6%96%B0%E3%81%97%E3%81%84%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E3%82%92%E4%BD%9C%E6%88%90%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%0A%E4%BB%8A%E5%9B%9E%E3%81%AF%E7%B7%B4%E7%BF%92%E3%81%AA%E3%81%AE%E3%81%A7%E3%83%91%E3%83%96%E3%83%AA%E3%83%83%E3%82%AF%E3%81%A7%E3%82%82%E8%89%AF%E3%81%84%E3%81%AE%E3%81%A7%E3%81%99%E3%81%8C%E3%80%81%E6%9C%AC%E7%95%AA%E3%81%AF%E5%BF%85%E3%81%9A%E3%83%97%E3%83%A9%E3%82%A4%E3%83%99%E3%83%BC%E3%83%88%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%20%E3%81%A7%E4%BD%9C%E3%82%8A%E3%81%BE%E3%81%97%E3%82%87%E3%81%86%E3%80%82)

---

## ④ GitHubにアップロードする
どこまでを対象にするか迷ったのですが、とりあえず設定ファイルや各言語のソースがある`private_isu`配下のソースをアップロードしていきたいと思います。(多分本当は使用する言語のソースとかに絞った方が良いのかもしれない)

**対象ディレクトリ**: `/home/isucon/private_isu/`
巨大なバイナリが含まれる`app`などはアップロード対象から外したいと思います。

### `.gitignore`の編集

```bash
$ echo "app" >> .gitignore
```

### Gitリポジトリを作成

```bash
$ git init
```

この状態で`git add`や`git status`を実行しようとしたら、以下のエラーが発生。

```bash
fatal: detected dubious ownership in repository at '/home/isucon/private_isu'
To add an exception for this directory, call:
git config --global --add safe.directory /home/isucon/private_isu
```

所有者が異なる、みたいなことが記載されています。
おそらく、ディレクトリの所有者が`isucon`ユーザなのに、`root`ユーザで操作しているからなのかな？
ログインユーザをisuconに変えても同様に出たので
ログの指示通りに、次のコマンドを実行して、安全なディレクトリとして設定することにしました。
ちゃんとした原因は後日調べたいですね。

```bash
$ git config --global --add safe.directory /home/isucon/private_isu
```

無事設定できたので、コミットします。

```bash
$ git commit -m "init"
```

### ブランチ名を`main`に変更
デフォルトでブランチ名がmasterになっていたので変えます
```bash
$ git branch -M main
```

### リモートリポジトリと連携（`origin`の部分は置き換えてください）

```bash
$ git remote add origin git@github.com:hoge/private-isu.git
```

### リモートにプッシュ

```bash
$ git push -u origin main
```
### ローカルにクローン
リモートのリポジトリを見て、反映されているのを確認したらローカルにクローンして完了です！

---

## まとめ
以上で、Git管理によってローカルで作業できるようになりました！  
好きなエディタも使えるし、差分も見やすいし、かなり作業が楽になりそうです！