ここでは、エンジニアなら誰もが知っている、あのコマンドの恐ろしいお話をお届けします。
過去のトラウマがよみがえってしまったとしても、私は責任を負えませんのでご了承ください。
ある日、開発中の自分
わ「APIの検証、うーんいちいち確認するのめんどいな、やること増えるし…」
わ「そうだ、検証環境のサーバーに直接はいってログ仕込んじゃえばいいか」
[root@ip-000-00-00-000 bin]# cd /home/hoge.jp/huga/
わ「huga直下からGit管理されてるやろ?」
わ「ここから、各ファイルにログvi
でログを仕込みながら開発しちゃお」
[root@ip-000-00-00-000 bin]# cd /home/hoge.jp/huga/
[root@ip-000-00-00-000 huga]# vi application/....
わ「お!ログ見れるようになっとるやんけ!」
わ「ここでこういうjsonがレスポンスとして帰ってくるんやな、」
わ「じゃあ次は、このレスポンスを使ってPostmanで確認していこうかな・・・・」
確認のつもりが・・・
わ「どのくらいログがたまってるか一旦確認するか。」
わ「確か、/home/hoge.jp/huga/data/tmp/
直下にlogファイルがたまってるはずや!」
[root@ip-000-00-00-000 huga]# cd /home/hoge.jp/huga/data/tmp/
[root@ip-000-00-00-000 tmp]# ll
hoge2.log
hoge3.log
hoge14.log
hoge15.log
hoge16.log
hoge17.log
hoge18.log
hoge11.log
hoge1.log
わ「100ファイルぐらいたまっとるやんけ」
わ「ログためている場所わかってるし、rm -rf でで全部消しちゃおうかな」
[root@ip-000-00-00-000 huga]# rm -rf *
わ「これを打てばいいはずや!!!!」
わ「ポチ!」。。。。。。
[root@ip-000-00-00-000 huga]# rm -rf *
[root@ip-000-00-00-000 huga]#
おわかりいただけただろうか。。。
自分はてっきり、/home/hoge.jp/huga/data/tmp/
に移動しているものと思い、rm -rf
のコマンドをたたいたが、
今いるディレクトリは/home/hoge.jp/huga/
だったのだと、、、、
時すでに遅し
[root@ip-000-00-00-000 huga]# ll
0
わ「 (。´・ω・)ん?? 」
わ「 (。´・ω・)ん???????? 」
わ「huga
直下全部消えてね!!?!🐎!🐏!?🐒」
さー、まずいことなった
わ「まあ、当然のように画面は開かないよな」
わ「まず落ち着いて、報告してから復元方法を考えよう」
わ「じょうちょー。ま、まずいことになりました……(かくかくしかじか)」
じ「・・(#^ω^)そんな奴ホントにいるんだな##」
復元方法の選定
わ「い、一旦報告終わったし、復元方法をかんがえよ・・」
わ「この検証サーバーはAWS上で稼働してるよな」
わ「なら、AMIからEC2立ち上げる方法があるな」
わ「ただ、運よく /home/hoge.jp/huga/
直下はGit管理されてるから」
わ「Gitでも復旧できるか」
Gitで復元する
わ「検証環境のAMIがいつのかわかんないし、起動と設定に時間かかりそうだな」
わ「Gitで復元するのが早そうだし、その方法で復元しようか」
わ「googleとGPT先生によると、git status
とかgit log
使ってやるんやな」
とりあえずやってみる
わ「手順としてはこうや!」
-
git status
コマンドを使って、削除されたファイルを確認 -
git log
コマンドを使って、コミット履歴から最新のcommit_hashを確認 -
git checkout <commit_hash> -- <deleted_file_path>
コマンドを使って、削除されたファイルを特定のコミットから復元 - 念のため最後に
git pull
- git 管理されてないファイルとか、他のサーバーとかcomposerを使って元に戻す。
※ commit_hash:git log コマンドで表示されるコミットのID
※ deleted_file_path:削除されたファイルのパス
1. git status
コマンドを使って、削除されたファイルを確認
[root@ip-000-00-00-000 huga]# git status
deleted: huga/application/1.php
deleted: huga/application/2.php
deleted: huga/application/3.php
deleted: huga/application/4.php
deleted: huga/application/5.php
deleted: huga/application/6.php
deleted: huga/application/7.php
deleted: huga/application/8.php
deleted: huga/application/9.php
deleted: huga/application/0.php
・
・
・
・
わ「3000ファイルぐらい消えてるわ、、、」
2. git log
コマンドを使って、コミット履歴から最新のcommit_hashを確認
-- 下記いろいろ省略してます
[root@ip-000-00-00-000 huga]# git log
commit <<commit_hash1>>
Author: kurieight
Date: Mon Nov 27 15:06:52 2023 +0900
【テスト】コミットコメント1
commit <<commit_hash2>>
Author: kurieight
Date: Mon Nov 27 15:05:58 2023 +0900
【テスト】コミットコメント2
わ「一旦最新の状態に戻ればいいから、commit_hash1
を使ってそれぞれ復元させよう。」
3. git checkout <commit_hash> -- <deleted_file_path>
コマンドを使って、削除されたファイルを特定のコミットから復元
わ「1で出した[deleted: huga/apploication/1.php]
みたいなパスを全部コピー!」
わ「サクラエディタとかで、[git checkout <commit_hash> -- <deleted_file_path>]
の形に成形!」
-- 完成したのがこちら
git checkout commit_hash1 -- huga/application/1.php
git checkout commit_hash1 -- huga/application/2.php
git checkout commit_hash1 -- huga/application/3.php
git checkout commit_hash1 -- huga/application/4.php
わ「出来上がったものを消しちゃったEC2に流す!!!」
[root@ip-000-00-00-000 apploication]# ll
drwxr-xr-x 7 root root 0 Nov 23 16:22 1.php
drwxr-xr-x 7 root root 0 Nov 23 16:22 2.php
drwxr-xr-x 7 root root 0 Nov 23 16:22 3.php
drwxr-xr-x 7 root root 0 Nov 23 16:22 4.php
drwxr-xr-x 7 root root 0 Nov 23 16:22 5.php
・
・
・
わ「戻ってきてる!!!!!!!!」
わ「あとは4と5の手順をやって完了か。」
わ「意外と簡単に戻せたけど、寿命が縮んだわ。」
わ「もう二度とhomeからpath直打ちで作業しないことをここで誓います。」
普段やらないようなミスも、ふと油断した瞬間とかイレギュラーな対応をしてる時に起きるのが大体です。
- cdコマンドで実行対象のファイルがあるディレクトリに移動
- pwdコマンドで今いるディレクトリを確認後、コマンドを実行する
テスト環境だからと言って「rm -rf *」のように大着するやめましょう。
この記事を見てくれている皆様はこんな事しないと思っておりますが、自戒として共有させていただきました。