いくつかの非常に大きなバイナリを含む git リポジトリがあります。それらはもう必要ありません。以前のコミットからファイルをチェックアウトできるかどうかは気にしません。したがって、レポのサイズを減らすために、履歴からバイナリを完全に削除したいと思います。
ウェブ検索の後、私の最良の(唯一の?)オプションは次を使用することであると結論付けましたgit-filter-branch:
git filter-branch --index-filter 'git rm --cached --ignore-unmatch big_1.zip big_2.zip etc.zip' HEAD
これまでのところ、これは良いアプローチのように思えますか?
答えが「はい」であると仮定すると、対処すべき別の問題があります。git マニュアルには次の警告があります。
警告!書き換えられた履歴は、すべてのオブジェクトのオブジェクト名が異なり、元の分岐に収束しません。元のブランチの上に書き換えられたブランチを簡単にプッシュして配布することはできません。完全な意味がわからない場合は、このコマンドを使用しないでください。問題を解決するために単純な単一のコミットで十分な場合は、とにかく使用しないでください。(公開された履歴の書き換えに関する詳細については、git-rebase(1) の「RECOVERING FROM UPSTREAM REBASE」セクションを参照してください。)
サーバーにリモートリポジトリがあります。各開発者は、それに対してプッシュおよびプルします。上記の警告 (およびその仕組みに関する私の理解) に基づくと、ローカル コピーで実行して変更をプッシュするgit-filter-branchことはできないと思います。git-filter-branch
そのため、暫定的に次の手順を実行する予定です。
- すべての開発者に、コミット、プッシュ、および作業を少し停止するように伝えます。
- サーバーにログインし、中央リポジトリでフィルターを実行します。
- 全員に古いコピーを削除してもらい、サーバーから再度複製してもらいます。
これは正しいと思いますか?これが最善の解決策ですか?