[github] gitのコミット履歴から特定の文字列を削除する!

ヤバイ!💦 gitにパスワードをpushしてた・・・

きずいたときはときすでに遅し、

ファイルを消したいけど、機密情報以外にも色々書いたファイルだし、、、

もうめんどくせー、リポジトリ作り直すか、、、

と思っていたらいいツールがありました!

BFG Repo-Cleaner by rtyley

さて、gitから特定の文字列を削除していきましょう。

ただ、間違うと面倒なので利用は慎重に!

mac向けの記事になります。

BFG導入以外はwinも共通です。

失敗せずに使用するには?

上のリンクの公式をしっかり読んで理解した上で使うのが一番です。

・・・

ということで今日時点で書かれていることを見ていきましょう。

2018/09/03の情報です注意を!
失敗したら消してもいいかなと思うようなポジトリ向けです。作業が進んだリポジトリ向けではありません。閉じてないプルリクがあったりすると消えるみたいなことがどこかに書かれていたような気がしますのでご注意を!参考程度にお願いします。

保存されてるワードを確認する!

一通り消し終わってから気づいたのですが、本当に消えたのかわかりませんでした(泣)

commitを全部見ればわかると思うけど、面倒なので、

BFGを実行する前に、

下のgitコードを実行して、消したいワードがどのくらいあるか確認してましょう!

git log -S password

(passwordを探したいワードに変えてね)

実行すると、ズラーと変更履歴が出てきます。

BFGを実行した後にもう一度実行して、表示されなければ削除完了になります。

git logについてもっと詳しく知りたい方は下のリンクをどうぞ

Search all of Git history for a string? – Stack Overflow – 

git pushしておく

リモートリポジトリとローカルリポジトリを同じにしておきましょう。

最後にgit pullすることになるのですが、差分が出て面倒になります。

また、今変わっていないところは変更してくれないので、消したいワードを消して変更した状態で更新しておきましょう。

あくまでも消えるのはコミット履歴にあるワードになります。

そして、またpushするのを防止するために機密事項設定ファイルを作り、.gitignoreの設定を変えたり、二度と間違ってpushしないようにしておきましょう!

削除が成功した場合、今まで使用していた作業フォルダをとは別に新しくクローンすることが推奨されているので、更新を忘れずに!

BFGを導入する!

下のサイトの通りにやれば導入できました。

公式サイトにはjarファイルが置いてあるんですが、

それのインストール方法がわからなかったので以下の通りに導入しました。

(インストールしなくても実行できるようです 公式参照 java -jar bfg.jarのあたり

では、訳していきます。

Install the App

  1. Press Command+Space and type Terminal and press enter/return key.
  2. Run in Terminal app:
    ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" < /dev/null 2> /dev/null
    and press enter/return key.
    If the screen prompts you to enter a password, please enter your Mac’s user password to continue. When you type the password, it won’t be displayed on screen, but the system would accept it. So just type your password and press ENTER/RETURN key. Then wait for the command to finish.
  3. Run:
    brew install bfg

Done! You can now use bfg.

Install bfg on Mac OSX – Mac App Store – 

  1. ターミナルを開く
  2. コード①を実行(カレントディレクトリはどこでも)
  3. パスワードが求められたらパソコンのログインパスを入れる(見えません)
  4. コード②を実行
  5. bfg導入完了!

コード①

Homebrew導入コマンド(導入済みなら実行する必要なし)

ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" < /dev/null 2> /dev/null

コード②

brew install bfg

導入が済んだら試しに、bfgと打ち込んで実行して見ましょう。

bfg 1.13.0

上のようなバージョンとヘルプが出力されていれば導入完了です。

リポジトリーをミラークローン

さて、BFGの導入が済んだら、公式に書かれていることを読んでいきましょう!

まずは、消したいワードがあるリポジトリーをミラークローンします。

適当に新しいフォルダを作成し、以下のgit コマンドを実行します。

git clone --mirror ここ

「ここ」を対象のリポジトリパスにします。

少し待てば、対象のリポジトリのフォルダがクローンされます。

消したいワードをリプレース!

さて、本番です!

bfg --replace-text passwords.txt my-repo.git

準備ができたあとで、上のコマンドを実行することになります。

bfg –replace-textがリポジトリのコミットから任意のワードを消すコマンドです。

my-repo.gitを先ほどクローンしたフォルダ名(リポジトリ名+.git)に変えてください。

passwords.txtというテキストファイルに消したいワードを記入し、先ほどクローンしたフォルダがあるディレクトリに格納します。(ファイル名は変更可能)

ちょっとやっかい、テキストの書き方!

例えば、passwordというワードだけをテキストに入力し保存し、リプレースコマンドを実行すれば、コミット履歴にあるpasswordは全て***REMOVED***に書き換わります。

他にも書き換わり方を設定できるので、下のリンクを参照してください。

BFG Repo-Cleaner –replace-text example – 

全てのコミット履歴の任意のワードを***REMOVED***に書き換えで問題なければ、消したいワードを列挙すればOKです。

ただし、上記リンクを参考にPASSWORD2==>examplePassとか書くと、ただの変更になるので、PASSWORD2そのものは消えませんのでご注意を。

(直後は打ち消し線の通りでしたが、時間を置いたらリンク先の通りになってました。)

では、テキストファイルの準備ができたらリプレースを実行してみましょう!

実行が成功するとズラーと表示された最後の方に下のコマンドを実行しろと言われます。

git reflog expire --expire = now --all && git gc --prune = now --aggressive

うまくいかないときは、BFGと入力した時と同じようなヘルプが表示されます。

実行しよう!

上のコマンドが表示されたら、クローンしたリポジトリのフォルダにカレントディレクトリを移動し、コマンドを実行しましょう!

(何が起こるか知りたい方は調べてから実行したほうがいいかもしれません。)

(指定したワードを消せればいいかたは実行してOK)

そしてgit pushをすれば完了です!

クローンして確認!

新しく作業フォルダを作成し、削除できたことを確認しましょう!

ここで新しい作業フォルダにクローンするのは今までの作業フォルダには前の履歴が残っている可能性があるとのことです(公式見解)

なので、新しく作業フォルダを作成し、クローンする方がいいようです。

ここではミラーオプションなしでクローンします。

クローンが終わったら最初にやったgit logコマンドで消せてるか確認してみましょう。

最初に実行した時にあった表示がなくなっているはずです。

[1] 11111 みたいなものが表示されますが、これはなんだかわかりません。。。

githubのサイトを見ても消えていることを確認できると思います。

成功できていれば何よりです!!!

お疲れ様でした。^^

おまけ

bfg –replace-text passwords.txt my-repo.git

の実行が完了した後にこんなメッセージも流れてきていました。


You can rewrite history in Git – don’t let Trump do it for real!
Trump’s administration has lied consistently, to make people give up on ever
being told the truth. Don’t give up: https://www.aclu.org/

ざっと訳すとこんな感じ


あなたはGitの履歴を書き換えることができます – 本当にトランプにしないでください!
トランプの政権は一貫して嘘をついて、人々が永遠にあきらめるようにしている
真実を伝えられている。あきらめないでください:https://www.aclu.org/

こんな宣伝もあるのかとクスッとさせてもらいました。

(これが書きたくてこの記事を書いてしまった。。。)

シェアする

  • このエントリーをはてなブックマークに追加

フォローする