tl; dr
手順
1 確認用のスクリプトをダウンロードする
- https://confluence.atlassian.com/bitbucket/files/321848291/321979854/1/1360604134990/git_find_big.sh
git_find_big.sh
#!/bin/bash
#set -x
# Shows you the largest objects in your repo's pack file.
# Written for osx.
#
# @see http://stubbisms.wordpress.com/2009/07/10/git-script-to-show-largest-pack-objects-and-trim-your-waist-line/
# @author Antony Stubbs
# set the internal field spereator to line break, so that we can iterate easily over the verify-pack output
IFS=$'\n';
# list all objects including their size, sort by size, take top 10
objects=`git verify-pack -v .git/objects/pack/pack-*.idx | grep -v chain | sort -k3nr | head`
echo "All sizes are in kB's. The pack column is the size of the object, compressed, inside the pack file."
output="size,pack,SHA,location"
for y in $objects
do
# extract the size in bytes
size=$((`echo $y | cut -f 5 -d ' '`/1024))
# extract the compressed size in bytes
compressedSize=$((`echo $y | cut -f 6 -d ' '`/1024))
# extract the SHA
sha=`echo $y | cut -f 1 -d ' '`
# find the objects location in the repository tree
other=`git rev-list --all --objects | grep $sha`
#lineBreak=`echo -e "\n"`
output="${output}\n${size},${compressedSize},${other}"
done
echo -e $output | column -t -s ', '
これで本当に消えたかどうかの確認ができます
2 全てのコミットやブランチ、タグから特定のファイルを消して書き換える
git filter-branch -f --index-filter 'git rm --ignore-unmatch path/to/target/file/or/dir' --tag-name-filter 'cat' -- --all
ネットで探すと --tag-name-filter 'cat'
これが抜けてるものが結構引っかかります。これがないとタグを書き換えてくれません。
3 先ほどの操作で生成されたバックアップを消す
git for-each-ref --format="%(refname)" refs/original/ | xargs -n 1 git update-ref -d
消さないと昔のコミットをここからずっと参照され続けてしまいます
4 不要な操作履歴を消す
git reflog expire --expire=now --all
(実はあんまりよく分かっていない)
5 これで不要なファイルへの参照が全て失われたはずなのでGCをかけて完全に消す
git gc --prune=now
単に使われなくなったファイルを消すだけなら --aggressive
はおそらく不要です。
6 再確認
./git_find_big.sh
以上
以上