2012-02-26 88 views
23

我想找到我的存儲庫中的10個最大的文件。我想出的劇本如下:如何在git倉庫中找到N個最大的文件?

REP_HOME_DIR=<top level git directory> 
max_huge_files=10 

cd ${REP_HOME_DIR} 
git verify-pack -v ${REP_HOME_DIR}/.git/objects/pack/pack-*.idx | \ 
    grep blob | \ 
    sort -r -k 3 -n | \ 
    head -${max_huge_files} | \ 
    awk '{ system("printf \"%-80s \" `git rev-list --objects --all | grep " $1 " | cut -d\" \" -f2`"); printf "Size:%5d MB Size in pack file:%5d MB\n", $3/1048576, $4/1048576; }' 
cd - 

有沒有更好/更優雅的方式來做同樣的事情?

「文件」我的意思是已經簽入存儲庫的文件。

+0

這真的是任何目錄,或者是有具體的關於你正在試圖找出混帳東西嗎?通過你的管道,我假設任何unix命令都可以嗎? – 2012-02-26 20:12:25

+0

你是指被追蹤的文件或磁盤上的文件?他們可能無法以您期望的方式關聯。 – Daenyth 2012-02-27 00:48:34

+0

已經簽入存儲庫的文件。 – Sumit 2012-03-07 19:41:28

回答

1

您還可以使用du - 示例:du -ah objects | sort -n -r | head -n 10。 du獲取物體的大小,sort,然後使用head挑選前10。

+0

只告訴對象不是文件的名稱。將需要技巧來忽略包文件。 – Sumit 2012-03-07 19:39:29

13

如何

git ls-files | xargs ls -l | sort -nrk5 | head -n 10 

git ls-files: List all the files in the repo 
xargs ls -l: perform ls -l on all the files returned in git ls-files 
sort -nrk5: Numerically reverse sort the lines based on 5th column 
head -n 10: Print the top 10 lines 
+1

這是基於我當前結帳版本中的文件。如果提交了10MB的文件,然後被另一版本的1KB文件覆蓋,則該命令將不會列出該文件。 – Sumit 2012-03-07 19:45:58

+2

當文件名/文件夾中有空格時(儘管您獲得**一些**輸出),此答案失敗。這個小小的修改解決了這個問題:'git ls-files -z | xargs -0 ls -l | sort -nrk5 | head -n 10' – 2013-02-05 12:13:01

+0

我會用更簡化的形式:'git ls-files -z | xargs -0 ls -l -h -S -r'。這應該爲您提供一個列表,其中包含從小到大排列的回購庫中所有文件的列表,並且具有可讀的大小。如果你想截斷列表,你可以使用'head'或'tail'來幫助。我的5美分價值... – Hans 2014-07-10 09:22:26

31

我找到了另一種方式來做到這一點:

git ls-tree -r -t -l --full-name HEAD | sort -n -k 4 | tail -n 10 

引自:SO: git find fat commit

+9

偉大的答案 - 我會改變一下'git ls-tree -r -l --abbrev --full-name HEAD | sort -n -r -k 4 | head -n 10':你不需要'-t',因爲你對樹列表不感興趣(不給出大小),'--abbrev'使得哈希更具可讀性,'head'而不是'tail'給出按降序排列的名單 – dumbledad 2016-03-02 12:39:23

0

您可以使用find找到一個比一個大文件給定閾值,然後將它們傳遞給git ls-files以排除未跟蹤的文件(例如,建立輸出):

find * -type f -size +100M -print0 | xargs -0 git ls-files 

根據需要調整100M(100兆字節),直到獲得結果。

小警告:這不會搜索頂級「隱藏」文件和文件夾(即名稱以.開頭的文件和文件夾)。這是因爲我使用find *而不是僅使用find來避免搜索.git數據庫。

我在使用sort -n解決方案時遇到問題(在Git Bash下的Windows上)。我猜這是由於縮進差異,當xargs批量參數,其中xargs -0似乎自動工作,以解決Windows的命令行長度限制爲32767.

6

此bash「單行」顯示10個最大的斑點存儲庫,從最小到最大排序。與其他答案相反,這個包括由存儲庫跟蹤的所有文件,甚至包括那些不存在於任何分支提示中的文件。

這是非常快,容易複製&粘貼,只需要標準的GNU工具。

git rev-list --objects --all \ 
| git cat-file --batch-check='%(objecttype) %(objectname) %(objectsize) %(rest)' \ 
| awk '/^blob/ {print substr($0,6)}' \ 
| sort --numeric-sort --key=2 \ 
| tail \ 
| cut --complement --characters=13-40 \ 
| numfmt --field=2 --to=iec-i --suffix=B --padding=7 --round=nearest 

前四行實現的核心功能,第五限制的結果的數量,而最後兩行提供好的人類可讀輸出看起來像這樣:

... 
0d99bb931299 530KiB path/to/some-image.jpg 
2ba44098e28f 12MiB path/to/hires-image.png 
bd1741ddce0d 63MiB path/to/some-video-1080p.mp4 

有關更多信息,包括進一步篩選用例以及更適合腳本處理的輸出格式,請參閱我的original answer以獲得類似問題。

+1

你不是在開玩笑,那很快! – LeoR 2017-09-08 13:50:03

1

的改進,raphinesse的答案,按大小與最大的第一:

git rev-list --objects --all \ 
| git cat-file --batch-check='%(objecttype) %(objectname) %(objectsize) %(rest)' \ 
| awk '/^blob/ {print substr($0,6)}' \ 
| sort --numeric-sort --key=2 --reverse \ 
| head \ 
| cut --complement --characters=13-40 \ 
| numfmt --field=2 --to=iec-i --suffix=B --padding=7 --round=nearest 
+0

我幾乎不會說這是一個改進。這更多是一個偏好問題。另外,如果有人想要顛倒行順序,他們可以簡單地通過'tac'管道輸出我原來的腳本。 – raphinesse 2018-02-18 17:57:10

相關問題