2010-04-01 61 views
1

我正在將SVN存儲庫轉移到Git中,並且需要從所有分支和標記中刪除特定目錄(sites/default/files/*)內的所有文件。原因是這個目錄中的所有文件都在過去被意外提交了很長時間,現在正在製作Git倉庫900+ MB。此存儲庫尚未共享,因此不用擔心更改SHA等。Git:刪除跨多個分支的文件夾的內容

任何幫助?我試過按照http://github.com/guides/completely-remove-a-file-from-all-revisions的說明操作,但它們似乎不適合我。

+0

我找到了要運行的命令。它如下:

 git filter-branch -f --index-filter 'git ls-files sites/default/files | xargs git update-index --remove' --tag-name-filter cat -- --all 
之後,克隆到新的本地回購是從數據庫中清除所有不需要的文件的最簡單的方法。這樣做可以將存儲庫的大小減少700MB! 最後,問題在於文件被其他分支和標籤引用。 「--tag-name-filter cat - --all」確保filter-branch命令在所有內容上運行。 – rickvug 2010-04-01 17:13:07

+2

你應該寫出這個答案,最好清楚地解釋所有的選項爲你做了什麼。通常情況下,您最好還是點贊其他答案,這些答案對您非常有幫助(由您決定「顯着」意味着什麼)。 – Cascabel 2010-04-01 17:35:35

回答

0

如果您的回購中有標籤,則必須將--tag-name-filter cat添加到git filter-branch命令中。

當然,要查看過濾的任何影響,您必須修剪提交 - 或者更好:將該回購克隆到其他位置,然後查看它是否現在變小。

1

你是什麼意思的「似乎沒有工作」?沒有任何細節很難提供幫助。

對我來說最有可能的是這些指令使用HEAD作爲ref的過濾器,所以它只會過濾可以從任何你已經簽出的任務到達的提交。你可能想要對所有分支做這件事;而不是git filter-branch ... HEAD你可以使用git filter-branch ... -- --all--表示過濾分支選項結束,而--all表示過濾所有參考。

我可以給的最好的一般建議是閱讀filter-branch man page。它也包含一些例子。

最後,請記住舊對象留在回購中。 Debilski談到了這一點,提到你必須修剪舊物品(git gc --prune=now)或重新制作回購以查看尺寸差異。這對你在當地會很好。

爲了讓它在遠程清理......我相信github最終會運行git gc,但它會使用默認的修剪設置,所以它們在幾個星期內不會被修剪。否則,您可以刪除並重新創建您的項目。我不知道有什麼辦法可以在github上強制執行gc。

+0

感謝您的幫助。我收到了類似的有關IRC的指導。希望其他有這個問題的人可以在Stack Overflow上找到這個答案。 – rickvug 2010-04-01 17:14:46