3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Gitのコミット履歴から有料アセットを抹消する

Posted at

はじめに

この記事は みす老人会 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 ファイルをダウンロードします。

image.png

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などを見てみると、機密ファイルを消した差分から機密ファイルを消した履歴が消えています。
コミット識別番号も変更されていることがわかります。

参考文献

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?