web-dev-qa-db-ja.com

gitで誤ってコミットされた大きなファイルを削除するにはどうすればよいですか

可能性のある複製:
Gitのコミット履歴から巨大なファイルを削除する方法?

私は愚かなことをしました。 100MBのファイルをコミットしたと想像してください。次に、これを確認してこのファイルを削除し、再度コミットします。これは、ファイルを削除する通常の手順です。

しかし、今の副作用は、この大きなファイルを保存しているため、私の履歴が重いことです(これが重い理由です)。ローカルgitのみを使用しているため、どのサーバーでも同期しません。

このファイルを確実に削除してディスク容量を節約するにはどうすればよいですか?

79
Rodrigo

次のようにgit filter-branchコマンドを使用して実行できます。

git filter-branch --tree-filter 'rm -rf path/to/your/file' HEAD

より多くのドキュメントをここで見つけることができます http://dalibornasevic.com/posts/2-permanently-remove-files-and-folders-from-a-git-repository

147
Leo

探しているコマンドはfilter-branch。登録からファイルを永久に削除できます。このブログには、問題のあるファイルをリポジトリから削除する方法に関する素晴らしいチュートリアルがあります

26
JaredPar

この素晴らしいスクリプトを David Underhill から取得して、gitリポジトリからファイルを削除できます。

#!/bin/bash
set -o errexit

# Author: David Underhill
# Script to permanently delete files/folders from your git repository.  To use 
# it, cd to your repository's root and then run the script with a list of paths
# you want to delete, e.g., git-delete-history path1 path2

if [ $# -eq 0 ]; then
    exit 0
fi

# make sure we're at the root of git repo
if [ ! -d .git ]; then
    echo "Error: must run this script from the root of a git repository"
    exit 1
fi

# remove all paths passed as arguments from the history of the repo
files=$@
git filter-branch --index-filter "git rm -rf --cached --ignore-unmatch $files" HEAD

# remove the temporary history git-filter-branch otherwise leaves behind for a long time
rm -rf .git/refs/original/ && git reflog expire --all &&  git gc --aggressive --Prune
17
topek