2011-09-15 153 views

回答

59

的解決方案是簡單的:

git filter-branch [options] -- --all

注意這四個破折號(兩套在它們之間具有空間雙破折號)在-- --all

如果你看一下文檔的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>…] 

閱讀,在文檔的開頭說:「讓您通過重寫<提到的分支改寫git的修訂歷史記錄rev-list選項>,在每個修訂版上應用自定義過濾器。「

所以檢查文檔爲rev-list給出:

< REV-列表選項> ...混帳爲REV-列表參數。這些選項包含的所有正面參考 都被重寫。您也可以指定選項 ,例如 - all,但您必須使用 - 將它們與git filter-branch選項分開。

而對於git-rev-list文檔說:

--all 
Pretend as if all the refs in refs/ are listed on the command line as <commit>. 
+10

只是爲了闡明,通常'filter-branch'在最後用'HEAD'列出,' - --all'代替'HEAD' – EoghanM

+0

如何使它在PowerShell(Windows)中工作?它保持錯誤並顯示「filter-branch」的幫助信息。根據Paul的回答,我嘗試改爲雙引號,但我無法在那裏找到雙引號(請參閱我對答案的評論)。 – ADTC

+2

我通過使用管道解決了上述問題(在PowerShell函數中)。基本上:'git rev-list --all | git filter-branch [options]'(最後沒有rev-list)而不是'git filter-branch [options] - --all'。 – ADTC

6

正如@奔 - 李的回答解釋說,--all需要重寫所有分支。如果您的回購中有標籤,您需要清除所有那些以及分支機構,以便獲得減小尺寸的好處,並且這將需要額外的--tag-name-filter cat咒語。

雖然問題指定使用git filter-branch,提問要「從我的倉庫刪掉一些大的文件和目錄」,所以它是值得一提的是,最好工具,這樣做實際上是The BFG Repo Cleaner,更簡單,更快的替代git filter-branch。例如:

$ bfg --strip-blobs-bigger-than 10M 

...刪除超過10MB的所有斑點(不在你最新提交),並適用於所有分支標籤&在你的回購協議。

完全披露:我是BFG Repo-Cleaner的作者。

+1

沒問題@EoghanM - 你可能會發現這個演示視頻很有趣 - 它是git filter-branch和BFG(運行在Raspberry Pi上)之間的競賽。http://www.youtube.com/watch?v=Ir4IHzPhJuI –

2

我遵循所有的說明,在我的Windows機器上這樣做,但我一直得到一個錯誤,直到我停止使用單引號並使用雙引號代替。

我的動機是我不小心檢查了我的vagrant環境。這裏的命令從所有分支刪除vagrant文件夾:

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

與目錄名稱只需更換vagrant,它會從所有分支刪除該目錄。

+0

有這個問題。謝謝!另外,如果您的命令包含雙引號(如'rm -rf「vagrant」''),請使用兩個雙引號(例如'「rm -rf」「vagrant」「」'')將其轉義。 – ADTC

+0

其實這是行不通的。當然,這適用於PowerShell,但'git'只是出錯。 – ADTC

+0

在窗戶上有一個'git bash'是有原因的。使用它,早晚使用cmd中的git會打你。 – GiM