Gitレポジトリのコミット履歴からファイルを削除

Git

はじめに

Github上にサンプルデーター(CSVファイル)を誤ってコミット・プッシュした後、開発を継続したため何度もコミット・プッシュをしてしまった状況です。後で、サンプルデーターの中に見られたらまずい情報があることを破格し、コミット履歴を含めサンプルデーターを削除したので。その手順をまとめてみました。

実際に操作した内容の記録ですので、誤っている内容や不要な操作が含まれている可能性があります。

事前準備

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

これで完了です。

リモートリポジトリ上でサンプルデーターが削除されていました。

ファイルの削除以外に、ファイル内の文字列の削除もできますので、間違って入れたパスワードなども削除できます。

参考

関連記事

コメント

この記事へのコメントはありません。

カテゴリー

お問い合わせはコチラ!