[エラー解決プロセス説明]Gitのpackfileを削除したらgit pushやgit pullできなくなった

# やりたいこと
ポートフォリオの本番環境で`git push`や`git pull`できなくなったので、再びできるようにしたい。

# 結局どういう手順で解決したのか
長い記事なので先に何をやって解決したのか書いておく。

1. 既存のアプリのディレクトリ名をpfc-masterからpfc-master2に変更し、`$ git clone`した。
2. `$ git clone`を成功させるためにGithubと連携するペアキーを作り直した。
3. `$ git log`でいくつかgit上の履歴が消えていることが問題と推測した。
4. 消失していると表示されたファイルを`$ git add` `$ git commit` `$ git push`しようとしたが、デバイスにスペースが残っていないと言われる。
5. デバイスのスペース不足を解消するために、AWSのEC2の既存ボリュームをデタッチ(EC2との接続を解除)し、新しく作ったボリュームとアタッチ(EC2と接続)した。
6. デバイスのスペース不足は解消し、`$ git pull`は問題なく実行できるようになったが、すでに自動デプロイまで完了していたアプリを、再度unicornによる手動でのデプロイからやり直さなければならなくなった。

# 問題

```
naota7118@Naotas-MacBook-Air-6 pfc-master % git pull origin master
error: refs/heads/add-weight-to-graph does not point to a valid object!
error: refs/heads/ajax-comment-function does not point to a valid object!
error: refs/heads/ajax-favorite-function does not point to a valid object!
error: refs/heads/auto-change-backgroud-image does not point to a valid object!
error: refs/heads/automatic-calculation-function does not point to a valid object!
この後も同じようなエラーがえげつないほど大量に出てくる
```

思い当たる原因は、
`.git/objects/pack`ディレクトリ階下にあったpackfileを全て削除してしまったことだ。


**そもそもpackfileとはなんだったのか？**

考えられる仮説として、packfileはgit log(git上の歴史)をまとめておく貯蔵庫みたいなものな気がする。
てっきりゴミ袋だと思って全部中身を消してしまったのだが、まずかったか・・・。

なぜpackfileの中身を消したのかというと、
.gitの中身が重すぎて自動デプロイができなくなっていたからだ。
packfileを軽量化すれば自動デプロイが通ると考えたのだが、安易に削除してはいけなかったのかもしれない。

# 対策
既存のアプリケーションディレクトリ名を変更して、Github（リモートリポジトリ）から`$ git clone`することにした。
アプリケーションのコード自体に問題があるわけではなく、あくまでgit上の履歴が消失しているという問題だから、`git clone`さえできれば解決すると考えたからだ。

```
naota7118@Naotas-MacBook-Air-6 projects % git clone git@github.com:naota7118/pfc-master.git
Cloning into 'pfc-master'...
git@github.com: Permission denied (publickey).
```

`$ git clone`しようとしたが、許可が降りなかった。

この記事を参考に、Githubにssh接続するための公開鍵と秘密鍵を作り直した。
[GitHubでssh接続する手順~公開鍵・秘密鍵の生成から~](https://qiita.com/shizuma/items/2b2f873a0034839e47ce)

**これは復習だが、公開鍵と秘密鍵の作り直しのやり方**
・公開鍵をGithubに登録する
・~/.ssh/configで下記の設定を行う

```
Host github github.com
  HostName github.com
  IdentityFile ~/.ssh/id_git_rsa #ここに自分の鍵のファイル名
  User git
```
**ペアキーを使ってGithubにアクセスできるか確認する方法**
・`$ ssh -T git@github.com`で接続できればOK

こんな文章が出てきたら、うまくいった証拠だ。

```
`Hi naota7118! You've successfully authenticated, but GitHub does not provide shell access.`
```

`$ git clone`を成功させるために、ペアキーの作成以外に、もう1つエラーを解決した。

```
naota7118@Naotas-MacBook-Air-6 projects % git clone git@github.com:naota7118/pfc-master.git
fatal: destination path 'pfc-master' already exists and is not an empty directory.
```

`$ git clone`しようとすると「すでにそのpathはあるからダメだよ」と言われた。
既存のアプリ名がpfc-masterだったので、それを既存のアプリのディレクトリ名をpfc-master2に変更してから、再度`$ git clone`を行った。

```
naota7118@Naotas-MacBook-Air-6 projects % git clone git@github.com:naota7118/pfc-master.git
Cloning into 'pfc-master'...
remote: Enumerating objects: 976, done.
remote: Counting objects: 100% (976/976), done.
remote: Compressing objects: 100% (752/752), done.
remote: Total 15480 (delta 173), reused 897 (delta 129), pack-reused 14504
Receiving objects: 100% (15480/15480), 209.06 MiB | 6.06 MiB/s, done.
Resolving deltas: 100% (4950/4950), done.
Updating files: 100% (40100/40100), done.
```
今度こそ`$ git clone`できた。
果たしてこれで解決したのだろうか？

この状態で自動デプロイやったらどうなるんだろう？
ということでやってみた。

```
naota7118@Naotas-MacBook-Air-6 pfc-master % bundle exec cap production deploy                
^C(Backtrace restricted to imported tasks)
cap aborted!
Interrupt:
```
自動デプロイのコマンドを実行したが、一向に進まない。
何が問題なんだ？

capistrano.logを確認したが、そこにエラー文は表示されていない。

unicornのプロセスがkillされていないのか？
本番環境を確認しに行く。

```
[naota@ip-10-0-0-32 pfc-master]$ ps -ef | grep unicorn
naota     1057 16769  0 10:50 pts/1    00:00:00 grep --color=auto unicorn
naota    14936     1  0 Oct26 ?        00:00:02 unicorn master -c /var/www/rails/pfc-master/current/config/unicorn.rb -E deployment -D
naota    15004 14936  0 Oct26 ?        00:00:15 unicorn worker[0] -c /var/www/rails/pfc-master/current/config/unicorn.rb -E deployment -D
```
unicornのプロセスをkillする
Nginxを再起動する

```
naota7118@Naotas-MacBook-Air-6 log % cat capistrano.log               
# Logfile created on 2020-10-30 19:44:51 +0900 by logger.rb/61378
  INFO ---------------------------------------------------------------------------
  INFO START 2020-10-30 19:44:51 +0900 cap production deploy
  INFO ---------------------------------------------------------------------------
 DEBUG [f0e5428c] Running [ -d /home/naota/.rbenv/versions/2.5.1 ] as naota@pfcmaster.work
 DEBUG [f0e5428c] Command: [ -d /home/naota/.rbenv/versions/2.5.1 ]
  INFO ---------------------------------------------------------------------------
  INFO START 2020-10-30 19:51:35 +0900 cap production deploy
  INFO ---------------------------------------------------------------------------
 DEBUG [b39f590f] Running [ -d /home/naota/.rbenv/versions/2.5.1 ] as naota@pfcmaster.work
 DEBUG [b39f590f] Command: [ -d /home/naota/.rbenv/versions/2.5.1 ]
```

仮説①：capistranoではないところで問題がある？
調べた結果：ローカルの開発環境のlogはcapistrano.logしかなかった。

仮説②：ローカルの本番環境でもgit cloneすればいいのでは？
試してみたこと
さっきと同じように既存のアプリの名前をpfc-masterからpfc-master2に変更した。

[(デプロイ編①)世界一丁寧なAWS解説。EC2を利用して、RailsアプリをAWSにあげるまで](https://qiita.com/naoki_mochizuki/items/814e0979217b1a25aa3e#git%E3%81%A8%E3%81%AE%E9%80%A3%E6%90%BA%E3%82%A2%E3%83%97%E3%83%AA%E3%81%AE%E3%82%AF%E3%83%AD%E3%83%BC%E3%83%B3)

```
[naota@ip-10-0-0-32 rails]$ git clone git@github.com:naota7118/pfc-master.git
Cloning into 'pfc-master'...
remote: Enumerating objects: 976, done.
remote: Counting objects: 100% (976/976), done.
remote: Compressing objects: 100% (752/752), done.
remote: Total 15480 (delta 173), reused 897 (delta 129), pack-reused 14504
Receiving objects: 100% (15480/15480), 209.06 MiB | 10.49 MiB/s, done.
Resolving deltas: 100% (4950/4950), done.
error: unable to write file releases/20201029081621/releases/20201026220654/shared/bundle/ruby/2.5.0/gems/libv8-8.4.255.0-x86_64-linux/vendor/v8/out.gn/libv8/obj/libv8_monolith.a
error: unable to write file releases/20201029081621/releases/20201026220654/shared/bundle/ruby/2.5.0/gems/libv8-8.4.255.0-x86_64-linux/vendor/v8/out.gn/libv8/obj/third_party/icu/libicui18n.a
error: unable to write file releases/20201029081621/releases/20201026220654/shared/bundle/ruby/2.5.0/gems/loofah-2.7.0/benchmark/www.slashdot.com.html
error: unable to write file releases/20201029081621/releases/20201026220654/shared/bundle/ruby/2.5.0/gems/loofah-2.7.0/lib/loofah/html5/safelist.rb
※同じエラーがかなりの数続いていく
error: unable to write file l-2.7.1/lib/mail/fields': No space left on device
warning: Clone succeeded, but checkout failed.
You can inspect what was checked out with 'git status'
and retry with 'git restore --source=HEAD :/'
```

一応最後までgit cloneはできたのだが、その後で大量のエラーが吐き出された。
これらのエラーは何を意味しているんだ？
`$ git status`で確認できると言われたので`$ git status`してみよう。

```
[naota@ip-10-0-0-32 pfc-master]$ git status
On branch master
Your branch is up to date with 'origin/master'.

Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
	deleted:    .DS_Store
	deleted:    .circleci/config.yml
	deleted:    .gitignore
	deleted:    .rspec
	deleted:    .rubocop.yml
	deleted:    .rubocop_todo.yml
	deleted:    .ruby-version
	deleted:    .zshrc
	deleted:    Capfile
	deleted:    Dockerfile
```
最初はこんな調子でずっと`deleted: 　ファイル名`が続いていく。
仮説①：アプリのディレクトリ名を変えたから？

最後の方でこんな記述が出てきた。

```
Untracked files:
  (use "git add <file>..." to include in what will be committed)
	.DS_Store
	.circleci/
	.gitignore
	.rspec
	.rubocop.yml
	.rubocop_todo.yml
	.ruby-version
	.zshrc
	Capfile
	Dockerfile
	Gemfile
	Gemfile.lock
	README.md
	Rakefile
	app/
	bin/
	config.ru
	config/
	current
	db/
	docker-compose.yml
	lib/
	log/
	package-lock.json
	package.json
	public/
	releases/
```

これらはcommitする内容に含まれていないと言われる。
`$ git add <ファイル名>`という形で指定しなさいと言われる。

仮説①：さっきpackfileで消したのは、これらのファイルに関わるgit logだったのかな？

考え①：言われるがままに`$ git add`する前に本当にこれらのファイルがないのか確かめに行こう
。
調べた結果：Githubでこれらのファイルそのものは消えていないことを確認した（例：Gemfile）。

```
[naota@ip-10-0-0-32 pfc-master]$ ls
app  Capfile  config.ru  db                  Dockerfile  Gemfile.lock  log           package-lock.json  Rakefile   releases
bin  config   current    docker-compose.yml  Gemfile     lib           package.json  public             README.md
```
仮説①：存在はしているけれど、Git上の履歴から消えているから、`$ git add .`する必要がある？

試したこと：`$ git add .`してみた。

```
[naota@ip-10-0-0-32 pfc-master]$ git add .
fatal: Unable to create '/var/www/rails/pfc-master/.git/index.lock': No space left on device
```
deviseにスペースがないと言われた。
そもそも今回のエラーの原因は.git階下のファイルのサイズが大きすぎることだった。
ここにきて最初のエラー原因でつまずくとは…。

ファイルが大きすると言われたので、じゃあどれくらい大きすぎるというんだ？
と気になったので調べた。

**ファイルの大きさの調べ方**
`$ df -h`

```
[naota@ip-10-0-0-32 pfc-master]$ df -h
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        474M     0  474M   0% /dev
tmpfs           492M     0  492M   0% /dev/shm
tmpfs           492M  416K  492M   1% /run
tmpfs           492M     0  492M   0% /sys/fs/cgroup
/dev/xvda1      8.0G  8.0G  324K 100% /　←確かに容量がパンパンだ
tmpfs            99M     0   99M   0% /run/user/1000
```

試したこと：AWSのEC2で別のボリュームを新たに作り、既存のボリュームをデタッチ(EC2インスタンスとの連携を外し)し、新しく作ったボリュームをアタッチ(EC2インスタンスと連携させる)した。

結果：ボリュームを変更したら、今まで通りと同じやり方ではEC2インスタンスに入れなくなった。

https://stackoverflow.com/questions/6151695/ec2-instance-on-amazon-and-i-am-greeted-with-no-space-left-on-the-disk

```
naota7118@Naotas-MacBook-Air-6 .ssh % ssh -i pfcmaster7118.pem ec2-user@176.34.34.208
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the ECDSA key sent by the remote host is
SHA256:A5jJQB1bPqJnhHWdg7pTRe+lKedYqXWT82QvaiXyK6I.
Please contact your system administrator.
Add correct host key in /Users/naota7118/.ssh/known_hosts to get rid of this message.
Offending ED25519 key in /Users/naota7118/.ssh/known_hosts:2
ECDSA host key for 176.34.34.208 has changed and you have requested strict checking.
Host key verification failed.
```
ホストキーの検証に失敗したと言われた。

ホストキーはユーザー認証のサーバー版のといったところか？

```
Add correct host key in /Users/naota7118/.ssh/known_hosts to get rid of this message.
```
エラーメッセージを取り除くには`/Users/naota7118/.ssh/known_hosts`に正しいhost keyを付け足せと言われた。

[SSH接続で WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! って言われて接続を拒否られるとき](https://qiita.com/wnoguchi/items/690f3f4651f8f11e4ed3)

`ssh-keygen -R ElasticIPアドレス`
これで解決できるらしいので実行した。

```
naota7118@Naotas-MacBook-Air-6 .ssh % ssh-keygen -R 176.34.34.208
# Host 176.34.34.208 found: line 1
# Host 176.34.34.208 found: line 2
/Users/naota7118/.ssh/known_hosts updated.
Original contents retained as /Users/naota7118/.ssh/known_hosts.old
naota7118@Naotas-MacBook-Air-6 .ssh % ssh -i pfcmaster7118.pem ec2-user@176.34.34.208
The authenticity of host '176.34.34.208 (176.34.34.208)' can't be established.
```

```
naota7118@Naotas-MacBook-Air-6 .ssh % ssh-keygen -R 176.34.34.208
```
公開鍵を作るときのコマンド`ssh-keygen`に`-R`を付け足している。
`-R`の意味を調べたが、ディレクトリの内容を再帰的に表示するという。
なんかディレクトリの中の1つ1つの処理を永遠にループして行う的な意味らしいが、正直よくわからないな。


ここで再び容量が変化したか確認してみよう。
おお！！確かにさっきのデバイスが容量がめちゃくちゃ減っている！！
サイズが大きすぎる問題は解決した。

```
[naota@ip-10-0-0-32 ~]$ df -h
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        474M     0  474M   0% /dev
tmpfs           492M     0  492M   0% /dev/shm
tmpfs           492M  404K  492M   1% /run
tmpfs           492M     0  492M   0% /sys/fs/cgroup
/dev/xvda1       10G  1.6G  8.4G  16% /
tmpfs            99M     0   99M   0% /run/user/1000
```

# 問題は解決したが、その代償が大きすぎた
代償とは何かというと、再びunicornでのAWSへのデプロイ、Capistranoでの自動デプロイ、Docker-composeの設定、CircleCIの設定をやり直さなければならなくなったことだ。

幸いにしてゼロからやり直すわけではなく、コードは残っているので、多少の変更さえすれば大丈夫だと思うが、本番環境のMySQLのデータはまた1から入力しなければならない。

実はこのポートフォリオ解決でエラー出現などにより今回で4度目のAWSへのデプロイだ。
正直もうお腹いっぱいだ。

MySQLのインストールで少しつまずいたが、この記事のおかげで解決できた。
[【AWS】Amazon Linux2環境にMySQLをインストールしようとしてはまった](https://qiita.com/yut-nagase/items/780d68a15b05c50c0a42)

CentOS7にMySQL公式のyumリポジトリを追加する、というプロセスが必要なことがわかっていなかった。
※CentOSはLinuxの1つ。

```
$ sudo rpm -ivh http://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm
```
MySQL公式のyumリポジトリを追加しないと、yum installコマンドでインストールができない。

```
$ sudo yum install mysql-community-server
```

ここまでやったところで`$ git pull`してみたら、できるようになっていた！！！
（もっと早い時点で確認すればよかった）

```
[naota@ip-10-0-0-32 pfc-master]$ git pull origin master
remote: Enumerating objects: 7, done.
remote: Counting objects: 100% (7/7), done.
remote: Compressing objects: 100% (1/1), done.
remote: Total 4 (delta 3), reused 4 (delta 3), pack-reused 0
Unpacking objects: 100% (4/4), done.
From github.com:naota7118/pfc-master
 * branch            master     -> FETCH_HEAD
   df8fac9..bc13ae6  master     -> origin/master
Updating df8fac9..bc13ae6
Fast-forward
 config/database.yml | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
```