大約GIT中的好處是,它暴露了其所有的膽量,所以你可以在他們採取偷看。
在你的情況,你大斑點照顧。如果您不熟悉git如何在內部工作,則基於將對象映射到其SHA-1散列的對象數據庫。提交是對象,每個承諾包含一個樹,它是一個列出目錄內容的對象,這些對象可以是其他樹(子目錄)或Blob(用於文件數據)。
這意味着如果兩個文件具有相同的內容,他們將共享一個blob。這也意味着如果你改變一個對象,它的ID也會改變(你會看到在這個答案結尾處的後果)。
如何獲得報告
首先,確保你在鏡子庫工作,因此與--mirror
選項克隆:
git clone --mirror https://my-host/my-repo.git
好了,現在這裏是一個命令,將顯示你的200點最大的斑點:
git rev-list --objects --all | git cat-file --batch-check='%(objectname) %(objecttype) %(objectsize) %(rest)' | sort -nr -k 3 | perl -ne 'm#^(\w+) blob (\d+) (.+)# or next; print "$1\t$2\t$3\n";' | head -n 200 | column -t -s $'\t'
我們把這個道N A小:
git rev-list --objects --all
將輸出所有對象ID(SHA-1散列)在你的倉庫使用,其後於BLOB文件路徑(docs)。
git cat-file --batch-check='%(objectname) %(objecttype) %(objectsize) %(rest)'
將重新格式化git rev-list
的輸出並插入一些我們感興趣的數據(如對象大小)(docs)。
這裏,%(rest)
將替換爲之後的部分輸入上的對象ID - 它是指向blob的文件路徑。
sort -nr -k 3
會做一個反向排序上的斑點大小
perl -ne 'm#^(\w+) blob (\d+) (.+)# or next; print "$1\t$2\t$3\n";'
將簡單過濾器出任何東西,這不是一個BLOB和格式化輸出
head -n 200
會第一時間200個項目
column -t -s $'\t'
將重新設置輸出很好
請注意您要刪除的斑點的對象ID。
請記住,我們正在談論斑點在這裏,而不是文件。如果您更改文件,那麼您將爲該文件創建2個Blob:每個提交的版本都有一個Blob。另外,請記住,由於git執行GC時發生的增量壓縮,總磁盤使用量將爲以下,而不是的總和。如果兩個blob非常相似(因爲提交通常只會改變文件的一小部分),則增量壓縮將非常有效。
現在您可以調整此命令來生成其他報告。下面是做同樣的事情不那麼花哨的版本:
git rev-list --objects --all | git cat-file --batch-check='%(objectname) %(objectsize) %(rest)' | sort -nr -k 2 | head -n 200
下面是如何讓斑點的大小按文件擴展名分組:
git rev-list --objects --all | git cat-file --batch-check='%(objectname) %(objecttype) %(objectsize) %(rest)' | perl -ne 'm#^(\w+) blob (\d+) .+?(?:\.(\w+))?$# or next; next if $h{$1}++; $ext = $3 ? lc $3 : "<none>"; $s{$ext} += $2; ++$c{$ext}; END { foreach $ext (keys %s) { print "$ext $s{$ext} $c{$ext}\n"; } }' | sort -nr -k 2 | column -t
相同的技術,但Perl腳本是不同。您可以通過在第一個腳本中插入grep
來迭代,以獲取給定文件擴展名的所有對象ID及其大小。
如何抹殺不需要的數據
現在,你應該有你想要擺脫什麼好主意。時間使用BFG repo cleaner。請務必仔細閱讀網站上的說明。
非常重要:的BFG將改寫整個提交歷史,這意味着所有你的提交哈希了從第一個變化會有所不同。您和有權訪問回購的其他人將必須放棄舊存儲庫並將其替換爲新存儲庫。這是對象ID如何在git中工作的直接結果,對此你沒有什麼可以做的。
此工具的命令可讓您刪除給定擴展的所有文件,並且它還具有一個開關,可讓您提供要刪除的對象ID列表。結合上述報告的結果,這一點非常有用。假設你有對象ID列表中一個名爲blobs-to-delete.txt
要刪除的文件:
java -jar bfg.jar --no-blob-protection --private --strip-blobs-with-ids blobs-to-delete.txt my-repo.git
這比使用選項,如--strip-blobs-bigger-than
,出於顯而易見的原因更安全。
一對夫婦的注意事項:
--no-blob-protection
將標誌着您的最新提交的修改(BFG默認不會以其他方式觸摸它的內容 - 只要確保你有一個備用)。
--private
將阻止該工具在新提交的提交消息中包含舊的提交ID(如果需要保留每個提交消息中發生的事件的跟蹤,請將其刪除),但IMO會污染提交消息,工具反正輸出一個映射文件)。
然後,你必須到期引用日誌和觸發完整的GC已刪除對象的實際走:如果你確定你做了什麼,200%
git reflog expire --expire=now --all && git gc --prune=now --aggressive
現在,強制推動你的改變,然後你的團隊中的每個人都可以製作一個新的克隆。享受你的瘦身回購!
將會有一些變化 git log --format =%n%H --name-only --diff-filter = A | awk'/^$/{C =!C; next} C {commit = $ 1; next} {print commit「:」$ 0,commit「:」$ 0}'| git cat-file --batch-check ='%(objectsize)%(rest)'' 做任何你可以在這裏要求的東西。例如,在日誌中添加一個'--since = 2017-01-1T00:00',並在末尾添加一個'| sort -n',以便按照今年添加的文件的大小獲得一個很好的排序列表,而且您已經有awk和git,那麼你在這裏想要什麼具體缺失? – jthill