web-dev-qa-db-ja.com

git、すべてのブランチのフィルターブランチ

次のソースを使用して、リポジトリからいくつかの大きなファイルとディレクトリを削除します。

http://dound.com/2009/04/git-forever-remove-files-or-folders-from-history/

なぜ私のgitリポジトリはこんなに大きいのですか?

git filter-branch現在のブランチでのみ機能するようです-すべてのブランチに一度に適用する方法はありますか?

53
EoghanM

解決策は簡単です:

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>.
74
Ben Lee

@ 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の作成者です。

5
Roberto Tyley

私はWindowsボックスでこれを行うためのすべての指示に従いましたが、単一引用符の使用をやめ、代わりに二重引用符を使用するまで、エラーが発生し続けました。

私の動機は、vagrant環境を誤ってチェックインしたことでした。次に、すべてのブランチからvagrantフォルダーを削除するコマンドを示します。

git filter-branch --tree-filter "rm -rf vagrant" -f HEAD --all

vagrantをディレクトリ名に置き換えるだけで、このディレクトリがすべてのブランチから削除されます。

4
Paul Preibisch