このSOの回答で述べたように、git gc
実際にはリポジトリのサイズを増やすことができます!
このスレッドも参照してください
現在、gitには、「」の実行時に参照されていないオブジェクトをすぐに削除しない安全メカニズムがありますgit gc
。
デフォルトでは、参照されていないオブジェクトは2週間保持されます。これは、誤って削除されたブランチやコミットを簡単に回復したり、作成中のオブジェクトがまだ参照されていないがgit gc
、並列に実行されている ' 'プロセスによって削除されたりする可能性がある競合を回避するためです。
そのため、パックされたが参照されていないオブジェクトに猶予期間を与えるために、再パックプロセスは、参照されていないオブジェクトをパックからルーズフォームにプッシュして、古くなり、最終的にプルーニングできるようにします。
参照されなくなったオブジェクトは通常それほど多くありません。参照されていないオブジェクトを404855持つことは非常に多く、それらのオブジェクトを最初にクローン経由で送信するのは愚かであり、ネットワーク帯域幅を完全に浪費します。
とにかく...問題を解決するにgit gc
は、--prune=now
引数を指定して' ' を実行し、猶予期間を無効にして、参照されていないオブジェクトをすぐに削除する必要があります(他のgitアクティビティが同時に実行されていない場合にのみ安全ワークステーション上で簡単に確認できます)。
ところで、 ' git gc --aggressive
'を新しいgitバージョン(または ' git repack -a -f -d --window=250 --depth=250
')で使用します
同じスレッドが言及します:
git config pack.deltaCacheSize 1
これにより、デルタキャッシュサイズがデフォルトの0(無制限)ではなく、1バイト(事実上無効化)に制限されます。これにより、git repack
4GBのRAMと4つのスレッド(これはクアッドコア)を使用するx86-64システムで上記のコマンドを使用して、リポジトリを再パックできます。ただし、常駐メモリの使用量は3.3GBにまで増加します。
マシンがSMPであり、十分なRAMがない場合は、スレッドの数を1つだけに減らすことができます。
git config pack.threads 1
さらに、メモリ使用量を--window-memory argument
to ' git repack
' でさらに制限できます。
たとえば--window-memory=128M
、レポジトリに大量のファイルが多数含まれている場合、最適なデルタの一致が得られない可能性がありますが、使用すると、デルタ検索のメモリ使用量に適切な上限が維持されます。
フィルターブランチの前では、このスクリプトを(慎重に)検討できます。
#!/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