Windows10 + heroku + github + Ruby on Rails 事始め④ github編（2020/02版）

# 概要

 - github で複数のアカウントを使い分ける
 - github のcommit間の変更ファイル一覧を取得する
 - github 上にあげられたソースから更新分のファイルのみ抽出する

# サブアカウント作成

## サブアカウント用ディレクトリ作成

サブアカウント用ディレクトリ（以下、サブワークディレクトリ）を適当な場所に作成します。
今回はワークディレクトリの下に作成しました。

```bash
<ワークディレクトリ>
$ mkdir <サブワークディレクトリ名>

<ワークディレクトリ>
$ cd <サブワークディレクトリ名>
```

## 検収用ディレクトリのgit初期化

`git init` でgit用初期化を行います。

```bash
<サブワークディレクトリ>
$ git init
Initialized empty Git repository in <サブワークディレクトリ>/.git/
```

## gitconfig設定

このローカルリポジトリ専用のサブアカウントを設定します。
`git config` の引数に `--local` を使うのがポイントです。

```bash
<サブワークディレクトリ> (master)
$ git config --local user.name <githubアカウント名>

<サブワークディレクトリ> (master)
$ git config --local user.email <githubアカウントメールアドレス>

<サブワークディレクトリ> (master)
$ cat .git/config
[core]
        repositoryformatversion = 0
        filemode = false
        bare = false
        logallrefupdates = true
        symlinks = false
        ignorecase = true
[user]
        name = <githubアカウント名>
        email = <githubアカウントメールアドレス>
```

参考： https://qiita.com/0084ken/items/f4a8b0fbff135a987fea

## サブアカウントのSSH接続設定を行う

サブアカウントをgithubとSSH接続できるように設定を行っていきます。
詳しくは、[事始め①#SSH接続設定](https://qiita.com/miu200521358/items/c65c19e26bd4f99af1cf#ssh接続設定) を参照して下さい。
ここでは、コマンドのみ列挙します。

```bash
<サブワークディレクトリ> (master)
$ cd ../

<サブワークディレクトリ>
$ mkdir .ssh

<サブワークディレクトリ>
$ cd .ssh

<サブワークディレクトリ>/.ssh
$ ssh-keygen -t rsa -b 4096 -C <githubアカウントメールアドレス>
Generating public/private rsa key pair.
Enter file in which to save the key (/<ユーザディレクトリ>/.ssh/id_rsa): ./id_rsa
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in ./id_rsa.
Your public key has been saved in ./id_rsa.pub.
The key fingerprint is:
<フィンガープリント> <githubアカウントメールアドレス>

<サブワークディレクトリ>/.ssh
$ ls -la
total 8
drwxr-xr-x 1 Lunaria 197121    0 2月   4 11:54 ./
drwxr-xr-x 1 Lunaria 197121    0 2月   4 11:53 ../
-rw-r--r-- 1 Lunaria 197121 3326 2月   4 11:54 id_rsa
-rw-r--r-- 1 Lunaria 197121  744 2月   4 11:54 id_rsa.pub
```

github に公開鍵を登録します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254327/dab1ea86-4f45-4158-583e-3a3734a8422a.png)

SSH接続を確認します。
ここで、ログインしたアカウントが、サブアカウントである事を確認します。

```
<サブワークディレクトリ>
$ ssh -T git@github.com -i ./.ssh/id_rsa
Enter passphrase for key './.ssh/id_rsa':
Hi miz21358! You've successfully authenticated, but GitHub does not provide shell access.
```

サブ用SSH接続情報をユーザーディレクトリ＞.sshディレクトリ＞configに登録します。

```bash
$ cat ~/.ssh/config
Host github
  HostName github.com
  IdentityFile /<ワークディレクトリ>/.ssh/id_rsa
  User git


Host github.acceptance
  HostName github.com
  IdentityFile /<サブワークディレクトリ>/.ssh/id_rsa
  User git
```

host名でのSSH接続を確認します。
ホスト名を切り替える事で、SSH鍵も切り替えられます。

```
<サブワークディレクトリ>
$ ssh -T github.acceptance
Enter passphrase for key '/<サブワークディレクトリ>/.ssh/id_rsa':
Hi miz21358! You've successfully authenticated, but GitHub does not provide shell access.

<サブワークディレクトリ>
$ ssh -T github
Enter passphrase for key '/<ワークディレクトリ>/.ssh/id_rsa':
Hi miu200521358! You've successfully authenticated, but GitHub does not provide shell access.
```

# サブアカウントでの作業

## fork

ブラウザからメインアカウントで作業していたリポジトリをforkします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254327/b4943ea6-780c-6674-bfa7-eacfd9104cd5.png)

## clone

clone用URLを確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254327/54503ca7-fd16-1f78-109d-02e05c0d8090.png)

cloneコマンドを実行します。
この時、コピーしたURLの冒頭の `git@github.com` を、SSH設定したサブアカウント用ホスト名 `github.acceptance` に置き換えている事に注意してください。
ホスト名・鍵のペアを指定する事で、サブアカウントでのcloneができます。

```bash
$ git clone github.acceptance:miz21358/ror-sample.git
Cloning into 'ror-sample'...
Enter passphrase for key '/d/Project/20200201_heroku_ror/acceptance/.ssh/id_rsa':
remote: Enumerating objects: 167, done.
remote: Counting objects: 100% (167/167), done.
remote: Compressing objects: 100% (119/119), done.
remote: Total 167 (delta 33), reused 159 (delta 25), pack-reused 0
Receiving objects: 100% (167/167), 30.73 KiB | 178.00 KiB/s, done.
Resolving deltas: 100% (33/33), done.
```

# 更新分のファイル抽出

## 更新履歴確認

master と branchのIDを比較して、更新されたファイルリストを取得します。
この作業は、既にbranchなりcommitなりが数度行われている事が前提条件となります。

```bash
$ git log
commit 99f6830da8e4c8461fe92d0ae645c897472775d0 (HEAD -> work-create-page, origin/work-create-page, heroku/master)
Author: githubアカウント名 <githubメールアドレス>
Date:   Mon Feb 3 17:09:47 2020 +0900

    ユーザー一覧画面追加

commit 125327f9c9039da433144bcae316bdd7e7b13b31 (heroku/work-create-page)
Author: githubアカウント名 <githubメールアドレス>
Date:   Mon Feb 3 14:20:40 2020 +0900

    home>topページ追加

commit 662484075697862b4f66836ae9dc8f9e03a25a98 (origin/master, master)
Author: githubアカウント名 <githubメールアドレス>
Date:   Sat Feb 1 13:00:52 2020 +0900

    config postgresql

commit 3ff8be79294e2f68b6234643da664a61dbdad55f
Author: githubアカウント名 <githubメールアドレス>
Date:   Sat Feb 1 12:21:53 2020 +0900

    first commit
:
```

## 差分ファイルリスト

以下コマンドで、コミット単位の差分ファイルリストが取得できます。
`commitID` は上記の `git log` で出てきたコミット履歴の `commit` の値です。

```
git diff <commitID旧>^..<commitID新> --name-only
```

```bash
$ git diff 662484075697862b4f66836ae9dc8f9e03a25a98^..125327f9c9039da433144bcae316bdd7e7b13b31 --name-only
Gemfile
Gemfile.lock
app/assets/javascripts/blogs.coffee
app/assets/javascripts/home.coffee
app/assets/stylesheets/blogs.scss
app/assets/stylesheets/home.scss
app/assets/stylesheets/scaffolds.scss
app/controllers/blogs_controller.rb
app/controllers/home_controller.rb
app/helpers/blogs_helper.rb
app/helpers/home_helper.rb
app/models/blog.rb
app/views/blogs/_blog.json.jbuilder
app/views/blogs/_form.html.erb
app/views/blogs/edit.html.erb
app/views/blogs/index.html.erb
app/views/blogs/index.json.jbuilder
app/views/blogs/new.html.erb
app/views/blogs/show.html.erb
app/views/blogs/show.json.jbuilder
app/views/home/top.html.erb
config/database.yml
config/routes.rb
db/migrate/20200201042410_create_blogs.rb
db/schema.rb
test/controllers/blogs_controller_test.rb
test/controllers/home_controller_test.rb
test/fixtures/blogs.yml
test/models/blog_test.rb
test/system/blogs_test.rb
```

## 差分ファイルリストをコピーする

以下コマンドで、差分ファイルをフォルダ構造のまま、別ディレクトリにコピーすることができます。
差分抽出先ディレクトリは事前に作っておいてください。

```
cp -pv --parents `git diff --name-only <commitID旧>^..<commitID新>` <差分抽出先ディレクトリ>
```

```bash
<ワークディレクトリ>/ror-sample (work-create-page)
$ cp -pv --parents `git diff --name-only 662484075697862b4f66836ae9dc8f9e03a25a98^..125327f9c9039da433144bcae316bdd7e7b13b31` ../ror-sample-pick/
'Gemfile' -> '../ror-sample-pick/Gemfile'
'Gemfile.lock' -> '../ror-sample-pick/Gemfile.lock'
app -> ../ror-sample-pick/app
app/assets -> ../ror-sample-pick/app/assets
app/assets/javascripts -> ../ror-sample-pick/app/assets/javascripts
'app/assets/javascripts/blogs.coffee' -> '../ror-sample-pick/app/assets/javascripts/blogs.coffee'
'app/assets/javascripts/home.coffee' -> '../ror-sample-pick/app/assets/javascripts/home.coffee'
（略）
```

masterディレクトリには、全ファイルがあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254327/0e4f32c8-a20e-9fe4-6ba1-5cccad72701a.png)

差分抽出先ディレクトリには、更新のあったファイルのみが出力されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254327/c14b2e2b-ed00-6725-b2d6-649d493c521a.png)