2016-04-29 34 views
-1

以前,我從git倉庫中刪除了數千個.pdf文件。但問題是,即使我刪除了這些文件,它們仍然存在於先前的修訂版中,以便我仍然可以通過訪問歷史記錄來恢復它們。現在我得到非常大的包文件,這是非常令人沮喪的。從以前的git修改版中徹底刪除數千個.pdf文件?

現在我想要從git的所有修訂中徹底刪除所有這些.pdf文件,並且我不想讓它們回到永遠以減少我的回購的大小。我怎樣才能做到這一點?所有的.pdf文件都在提交中被刪除。

我在谷歌搜索,發現git filter-branch可能解決我的問題。但我發現的所有解決方案都是在git revisons中找到非常大的文件,並將其從回購庫中徹底刪除。我想要的是完全刪除成千上萬的佔用磁盤空間的.pdf文件。

任何幫助,高度讚賞。謝謝。

+1

無論是移除一個大文件,多個大文件,多個小文件等,原理都是一樣的。 filter-branch命令提取現有提交,應用過濾器,並在結果中創建新提交,然後調整分支標籤(如果使用標記過濾器,則爲標記)以指向新提交而不是舊提交。其中最棘手的部分是編寫過濾器:如果文件都在一個已知的地方(如果只有一個大文件,那真的很容易),這會更容易。 – torek

+0

@torek不幸的是,這些文件分佈在很多目錄中。但我想知道是否可以使用正則表達式在'git filter-branch'命令中編寫pdf文件。 –

回答

3

每評論,擴展成一個答案......

有兩個簡單的(當然,「不太難」)的方法來處理是:

  1. 使用--tree-filter(很慢)此過濾器:

    git filter-branch ... \ 
        --tree-filter "find . -name '*.pdf' -print0 | xargs -0 rm" \ 
        ... 
    
  2. 使用--index-filter(更快):

    git filter-branch ... \ 
        --index-filter "git ls-files -z -- '*.pdf' | xargs -0 git rm --cached" \ 
        ... 
    

在這兩種情況下,如果你想標記移動到複製的提交(和閱讀文檔的其餘部分使用filter-branch)一定要包括--tag-name-filter cat

此處假定您想要擺脫全部文件名與*.pdf相匹配的文件。如果您需要更具選擇性,請注意filter-branch只是運行eval $filter的篩選器:沒有任何說...部分不能包含或不包含shell腳本的路徑,您可以在其中編寫複雜測試,而無需擬合他們成一個大的eval - 可靠的字符串。

相關問題