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
このエントリーをはてなブックマークに追加
にほんブログ村 IT技術ブログへ

コメント

メールアドレスが公開されることはありません。 が付いている欄は必須項目です