次のソースを使用して、リポジトリからいくつかの大きなファイルとディレクトリを削除します。
http://dound.com/2009/04/git-forever-remove-files-or-folders-from-history/
git filter-branch
現在のブランチでのみ機能するようです-すべてのブランチに一度に適用する方法はありますか?
解決策は簡単です:
git filter-branch [options] -- --all
-- --all
内の4つのダッシュ(間にスペースを入れた2組の二重ダッシュ)に注意してください。
git-filter-branch
のドキュメントを見ると、次のように書かれています。
git filter-branch [--env-filter <command>] [--tree-filter <command>]
[--index-filter <command>] [--parent-filter <command>]
[--msg-filter <command>] [--commit-filter <command>]
[--tag-name-filter <command>] [--subdirectory-filter <directory>]
[--Prune-empty]
[--original <namespace>] [-d <directory>] [-f | --force]
[--] [<rev-list options>…]
ドキュメントの冒頭を読むと、「各リビジョンにカスタムフィルターを適用して、<rev-list options>に記載されているブランチを書き換えることで、gitリビジョン履歴を書き換えることができます。」
したがって、rev-list
のドキュメントを確認すると、次のようになります。
<rev-listオプション>…git rev-listの引数。これらのオプションに含まれるすべての正の参照は書き換えられます。 --allなどのオプションを指定することもできますが、-を使用してgitフィルターブランチオプションからそれらを分離する必要があります。
そしてgit-rev-list
のドキュメントはこう言います:
--all
Pretend as if all the refs in refs/ are listed on the command line as <commit>.
@ ben-leeの回答で説明されているように、--all
はすべてのブランチを書き換えるために必要です。リポジトリにtagsがある場合、すべてのこれらだけでなく、ブランチは、サイズを小さくするメリットを得るには、追加の --tag-name-filter cat
呪文。
質問ではgit filter-branch
、質問者が「リポジトリからいくつかの大きなファイルとディレクトリを削除する」ことを望んでいるため、bestそれを行うためのツールは実際にはBFGレポクリーナーであり、git filter-branch
。例えば:
$ bfg --strip-blobs-bigger-than 10M
... 10MBより大きいすべてのblob(latestコミットにないもの)を削除し、allブランチで動作します&あなたのリポジトリのタグ。
完全な開示:私はBFG Repo-Cleanerの作成者です。
私はWindowsボックスでこれを行うためのすべての指示に従いましたが、単一引用符の使用をやめ、代わりに二重引用符を使用するまで、エラーが発生し続けました。
私の動機は、vagrant
環境を誤ってチェックインしたことでした。次に、すべてのブランチからvagrant
フォルダーを削除するコマンドを示します。
git filter-branch --tree-filter "rm -rf vagrant" -f HEAD --all
vagrant
をディレクトリ名に置き換えるだけで、このディレクトリがすべてのブランチから削除されます。