はじめに
この記事は みす老人会 2nd Advent Calendar 2022 3日目の記事です。
就職活動で自分のスキルをアピールするためにGitHubの非公開の個人開発リポジトリを公開する機会がありました。その際、コミット・プッシュしてしまっている有料アセットなどの公開してはいけないもの(以下、機密ファイル)を他人がダウンロードできないようにする処置を行いました。
git rm --cached
を行うことでインデックスからファイルを削除することができますが、それだけではコミット履歴に「ファイルを削除した」という記録が残ります。もしGitHubを公開した場合、履歴からファイルを取得できてしまいます。そこでBFG Repo-Cleanerを使用して、すべてのコミット履歴からそのファイルが存在した歴史を抹消します。
Windowsの記事が少なかったこと、BFGの入手方法から説明している記事が少なかったので書きました。
制約
すでにリポジトリを他人にclone・forkされている場合、そこから機密ファイル削除することは不可能なので、機密ファイルがずっと非公開だったことが前提です。
また、機密ファイルのコミット履歴が GitHub の pull request などで参照されている場合はそこから漏れる可能性があります。その場合 GitHub サポートに連絡して pull request の参照の削除を依頼する必要があります。
参考:Removing sensitive data from a repository
免責
この記事を参考にして機密ファイルが漏れたこと、それによって生じた損害に対して筆者は一切の責任を負いません。
細心の注意を払いましょう。
環境、バージョン
- OS: windows11
- Java: 1.8.0_351
- bfg: 1.14.0
Java ランタイム環境が必要です。筆者はJavaをインストールするところから行いました。
今回利用したリポジトリはゲームエンジン Unity のプロジェクトでした。
準備
Javaのインストール
今回はシンプルにJavaだけをインストールし、JDKなどは入れてません。
BFGのダウンロード
右の青いボタンから .jar ファイルをダウンロードします。
JARファイルとは、コンピュータプログラムを格納するファイル形式の一つで、Java言語で開発されたプログラムを構成するファイル群を一つにまとめて格納するためのもの。ファイル名の標準の拡張子は「.jar」。
JARファイルとは - 意味をわかりやすく - IT用語辞典 e-Words
というわけで実行可能ファイルではないが、Java実行環境があれば基本的に何もしなくても実行できるファイルらしいです。
HEADから機密ファイルを削除
bfgはHEADに存在するものは削除しません。そのためgit rm --cached
などでHEADから機密ファイルを削除しておきます。
手順
ターミナルでリポジトリの上のディレクトリに移動します。
Works <- ここ!
├─ repository1
│ └─ .git
└─ repository2
└─ .git
バックアップ
安全のためにベアリポジトリで行います。
$ git clone --mirror git://example.com/repository1.git
実行
パスとかエイリアスは設定していません。
特定のファイルを削除したい場合。
$ java -jar c:/Users/co1umbine/Downloads/bfg-1.14.0.jar --delete-files hoge.png repository1.git
特定のフォルダとその中身を削除したい場合。
$ java -jar c:/Users/co1umbine/Downloads/bfg-1.14.0.jar --delete-folders fuga repository1.git
ファイル、フォルダ指定ともにglobのワイルドカードが使えます。
後処理
削除を実行すると出てくる指示通り、以下のコマンドをリポジトリに入って打ちます。
$ cd repository1.git
$ git reflog expire --expire=now --all && git gc --prune=now --aggressive
強制pushです。
git push -f
確認
githubなどを見てみると、機密ファイルを消した差分から機密ファイルを消した履歴が消えています。
コミット識別番号も変更されていることがわかります。
参考文献