Gitで不要なファイルを完全に削除する方法
git filter-branch
は、Gitリポジトリの履歴を変更するための強力なコマンドです。このコマンドを使用することで、過去のコミットに対してさまざまな操作を行うことができます。
このコマンドを使うことで、過去にコミットした不要なファイルを完全に削除することができます。大きなファイルをGitリポジトリにアップロードしてしまった場合、通常の削除では履歴に残るため、.gitディレクトリのサイズが増加してしまいます。この問題に対処するための方法になります。
手順
過去のすべてのコミットからファイルを削除する場合、次のようコマンドを実行します。
git filter-branch -f --tree-filter 'rm -f 削除するファイル' -- --all
履歴から大きなファイルを削除した後は、リモートリポジトリに強制的にプッシュする必要があります。以下のコマンドを実行し、リモートリポジトリに強制的にプッシュします。
git push origin --force --all
このコマンドにより、リモートリポジトリの履歴も変更されます。共有リポジトリで作業している場合は、他の開発者にも影響があることを念頭に置き、注意してください。
削除済みファイルを履歴からも削除する
誤ってgitに登録してしまったサイズの大きなファイルは削除しても履歴に残るため、リポジトリの容量が大きいままです。既に削除したファイルを履歴から完全に消したい場合、git-filter-repo
を使用してそのファイルを履歴から削除することができます。
git-filter-repo
は、Gitリポジトリの履歴をフィルタリングするためのツールです。git filter-branch
の代替として使用され、より高速で使いやすいとされています。以下に、git-filter-repo
のインストール方法と基本的な使い方を説明します。
インストール
git-filter-repo
はPythonで書かれており、Pythonがインストールされていれば、次のコマンドでインストールできます。
pip install git-filter-repo
使い方
次のコマンドを実行して、特定のファイルを履歴から削除します。この操作を行うと、対象のファイルはリポジトリのすべてのコミット履歴から削除されます。
git filter-repo --path <削除したいファイルのパス> --invert-paths
実行後、リモートリポジトリへのパスがなくなっているので、元のリモートリポジトリへpushします。
次のコマンドはローカルのmainブランチをリモートリポジトリへmain_newブランチとして登録しています。
git push <プッシュ先のリモートリポジトリのパス> main:main_new
git remote add
を使った登録でも構いません。新しい環境へリモートリポジトリをクローンします。
その後、ブランチを新しいブランチ(main_new)に切り替えます。
git switch main_new
元のブランチ(main)を新しいブランチ(main_new)で上書きします。
git branch -f main main_new
ブランチを元のブランチ(main)に切り替えます。
git switch main
履歴を確認し、削除したファイルの履歴がないことを確認します。
git log --name-status
ローカルのmain_newブランチを削除します。
git branch -d main_new
リモートリポジトリのブランチを強制的に更新します。他の開発者に影響がでます。更新後は他の開発者は再クローンが必要です。
ここでmainブランチが保護ブランチの場合はエラーになります。必要に応じてリモートブランチの設定から保護を解除してください。
git push origin main --force
最後にリモートのmain_newブランチを削除します。
git push origin --delete main_new