Gitレポジトリのコミット履歴からファイルを削除
はじめに
Github上にサンプルデーター(CSVファイル)を誤ってコミット・プッシュした後、開発を継続したため何度もコミット・プッシュをしてしまった状況です。後で、サンプルデーターの中に見られたらまずい情報があることを破格し、コミット履歴を含めサンプルデーターを削除したので。その手順をまとめてみました。
実際に操作した内容の記録ですので、誤っている内容や不要な操作が含まれている可能性があります。
- 環境:Windows 11 + WSL2
- ツール:BFG Repo-Cleaner
事前準備
BFG Repo-Cleanerのインストール
WSL2に「OpenJDK 8」をインストールします。
※参考:java – Ubuntu_ OpenJDK 8 – Unable to locate package – Stack Overflow
user@server$ sudo apt install java-common
user@server$ sudo add-apt-repository ppa:openjdk-r/ppa
user@server$ sudo apt-get update
user@server$ sudo apt install openjdk8-jre
user@server$ update-java-alternatives -l
java-1.8.0-openjdk-amd64 1081 /usr/lib/jvm/java-1.8.0-openjdk-amd64
user@server$ java -version
openjdk version "1.8.0_312"
OpenJDK Runtime Environment (build 1.8.0_312-8u312-b07-0ubuntu1~20.04-b07)
OpenJDK 64-Bit Server VM (build 25.312-b07, mixed mode)
user@server$ javac -version
javac 1.8.0_312
user@server$
WSL2に「BFG Repo-Cleaner」をインストールします。
※参考:WSL2 on UbuntuでBFG Repo-Cleanerの環境構築
user@server$ wget https://repo1.maven.org/maven2/com/madgag/bfg/1.14.0/bfg-1.14.0.jar
user@server$ mkdir -p ~/tools/bfg/
user@server$ mv bfg-1.14.0.jar ~/tools/bfg/
user@server$ alias bfg='java -jar ~/tools/bfg/bfg-1.14.0.jar'
サンプルデーター(CSVファイル) の削除
ローカルブランチでサンプルデーターの削除
ローカルレポジトリで、削除したいファイルを削除してコミットします。
複数のブランチにあたって存在するファイルの場合は、各ブランチで削除しコミットします。
user@server$ git branch
* feature/issue-672
feature/issue-691
master
user@server$ git commit ...
user@server$ git branch
feature/issue-672
* feature/issue-691
master
user@server$ git commit ...
「BFG Repo-Cleaner」を利用してコミット履歴からサンプルデーターを削除
bfg --delete-files 《削除するファイル名》
を実行します。全ブランチとコミット履歴に対して削除処理を行います。削除するファイルと同じ名前のファイルが存在するとそのファイルも削除されるため注意します。ファイル名の代わりにパスを指定するとエラーになりました。
user@server$ bfg --delete-files sampledate.csv
Using repo : /home/user/project/sample/project/.git
Found 555 objects to protect
Found 222 commit-pointing refs : HEAD, refs/heads/feature/test-1, refs/heads/feature/test-2, ...
Protected commits
-----------------
These are your protected commits, and so their contents will NOT be altered:
* commit 99999x9x (protected by 'HEAD') - contains 1 dirty file :
- data/sampledate.csv (16.1 MB)
WARNING: The dirty content above may be removed from other commits, but as
the *protected* commits still use it, it will STILL exist in your repository.
Details of protected dirty content have been recorded here :
/home/user/project/sample/project.bfg-report/2022-01-01/01-01-01/protected-dirt/
If you *really* want this content gone, make a manual commit that removes it,
and then run the BFG on a fresh copy of your repo.
Cleaning
--------
Found 9999 commits
Cleaning commits: 100% (9999/9999)
Cleaning commits completed in 454 ms.
Updating 4 Refs
---------------
Ref Before After
-----------------------------------------------------------
refs/heads/feature/test-1 | 99999x9x | 77777777
refs/heads/feature/test-2 | 33cc3333 | 55555555
refs/remotes/origin/feature/test-1 | 99999x9x | 77777777
refs/remotes/origin/feature/test-2 | 33cc3333 | 55555555
Updating references: 100% (4/4)
...Ref update completed in 57 ms.
Commit Tree-Dirt History
------------------------
Earliest Latest
| |
.......................................................DDDDD
D = dirty commits (file tree fixed)
m = modified commits (commit message or parents changed)
. = clean commits (no changes to file tree)
Before After
-------------------------------------------
First modified commit | a111a1a1 | 11e111ee
Last dirty commit | 33cc3333 | 55555555
Deleted files
-------------
Filename Git id
---------------------------------------------------
sampledate.csv | dddd6666 (16.1 MB)
In total, 221 object ids were changed. Full details are logged here:
/home/user/project/sample/project.bfg-report/2022-01-01/01-01-01
BFG run is complete! When ready, run: git reflog expire --expire=now --all && git gc --prune=now --aggressive
コミット履歴の完全削除
「bfg –delete-files」でファイルを削除しても物理的には削除されなくごみデーターが残るようです。ごみデーターを削除します。
user@server$ git reflog expire --expire=now --all && git gc --prune=now --aggressive
リモートレポジトリに反映
user@server$ git push --force
これで完了です。
リモートリポジトリ上でサンプルデーターが削除されていました。
ファイルの削除以外に、ファイル内の文字列の削除もできますので、間違って入れたパスワードなども削除できます。