gitのヒストリーすべてから大量の不要なファイルを削除するには、filter-branch
を使用して各コミットのインデックス(レポ内のファイルのリスト)を書き換えてファイルを追加しないようにすることができます。gitヒストリを書き直してファイルを修正する
git filter-branch --index-filter "git rm --cached --ignore-unmatch path/to/offending_file.wav" --tag-name-filter cat -- --all
しかし、私は、ファイルを保持しますが、それはたくさん小さくしたい場合は(アイコンが誤って巨大な画像として保存した場合、例えば想像)。最初のファイルを確認してください。
HASH=`git hash-object -w /tmp/replacement.png`
また、我々は次のように
FILE="path/to/icon.png"
今すぐインデックスをフィルタリング交換したいファイルを注意し
まずgitののデータベースに交換用のファイルを追加します。私はこのアプローチを試してみました
git cat-file -e :"$FILE"
インデックスから削除する場合:
git rm --cached "$FILE"
最後に、同じファイル名で置き換えてください。
git update-index --add --cacheinfo "100644,$HASH,$FILE"
はすべて一緒にそれを置く:
git filter-branch --index-filter "if git cat-file -e :$FILE ; then git rm --cached $FILE ; git update-index --add --cacheinfo 100644,$HASH,$FILE ; fi" --tag-name-filter cat -- --all
これが動作しているようですし、すぎ怖いですすべてのエラーを印刷しません。しかし、どれくらい多くのgit gc
とプルーンコマンドを使っても元のBLOBはリポジトリに存在しています。レポを新しい場所に複製しても、それはまだ存在します。
私は遠いリファレンスとが作成したoriginal
の参照が元のファイルを依然として参照しているため、古いツリーを参照していると思われます。
私はこのようなハックでそれらのすべてを削除してみました:remotes
ため
for REF in `git show-ref | cut -c 42- | grep original` ; do git update-ref -d $REF ; done
と同じですが、ブロブはまだそこにあります。
だから私の質問:
- ブロブはごみが収集されない理由を確認する方法はありますか?私。グラフの親オブジェクトはそれを指していますか?
originals
のリファレンス(およびおそらくリモコン)(すべてのブランチとタグを含む)を削除する非ハックな方法はありますか?- 私には他に何かがありますか?
この大きなファイルを含むコミットが多数あります。手動で履歴を書き換えることは現実的な可能性がありません。 –
100コミットのようなもの。 – Timmmm