2009-08-17 74 views
44

是否有可能獲得有關每次提交更改浪費了多少空間的信息 - 因此我可以找到提交大文件或大量文件的提交。這是所有嘗試減少git repo大小(重新綁定和可能篩選提交)git find fat commit

+1

請考慮只運行'git的gc'偶爾,可能是'git gc --ggressive' – Hasturkun 2009-08-17 07:33:43

+0

'git gc'(和'git gc --prune'); '--aggresive'甚至可以給出更糟的結果(但通常不應該),通常不值得。 – 2009-08-17 19:55:37

+0

這個答案好多了:http://stackoverflow.com/a/10847242/520567 – akostadinov 2014-06-09 13:32:32

回答

16

忘了回答,我的回答是:

git rev-list --all --pretty=format:'%H%n%an%n%s' # get all commits 
git diff-tree -r -c -M -C --no-commit-id #{sha}  # get new blobs for each commit 
git cat-file --batch-check << blob ids    # get size of each blob 
+1

@sschuberth:如果我正確地讀你的腳本,它只考慮在特定提交中被添加_的文件。它不會檢測到文件在提交時大幅增長。 – kynan 2012-04-19 00:07:58

+0

@ kynan:你說得對,因爲這是OP要求的(以及我需要的)。但是很容易改變腳本來檢測修改過的文件:基本上你只需要在grep調用中用「M」代替「A」。這將報告修改後的總文件大小(而不是添加/刪除的字節數)。我很樂意接受GitHub上的pull請求,以使腳本更通用。 – sschuberth 2012-04-24 14:04:12

+7

斷開的鏈接,腳本現在位於[這裏](https://github.com/sschuberth/dev-scripts/blob/master/git/git-commit-size.sh) – Luke 2012-12-15 01:55:18

1

git cat-file -s <object>其中<object>可以引用提交,blob,樹或標記。如果你需要看不同的分支,你」

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

這將顯示在底部的最大文件(第四列是文件(BLOB)大小

21

你能做到這一點。 。會想改變HEAD那些分支名稱或者,把這種在一個循環中滿枝頭,標籤,或加快轉速您有興趣

1
#!/bin/bash 
COMMITSHA=$1 

CURRENTSIZE=$(git ls-tree -lrt $COMMITSHA | grep blob | sed -E "s/.{53} *([0-9]*).*/\1/g" | paste -sd+ - | bc) 
PREVSIZE=$(git ls-tree -lrt $COMMITSHA^ | grep blob | sed -E "s/.{53} *([0-9]*).*/\1/g" | paste -sd+ - | bc) 
echo "$CURRENTSIZE - $PREVSIZE" | bc 
+0

而且我建議使用git format-patch來獲取提交大小(郵件頭將會有一些額外的大小,但實際上如果您需要快速提交併不是太大 - 這並不重要得到確切的大小,+ - 1K將是很好的準確性) – 2014-06-19 16:09:34

2

git fat find N其中N是以字節爲單位將返回在整個的所有文件歷史大於N字節。

你可以找到更多關於git的發在這裏:https://github.com/cyaninc/git-fat

+0

無賴。我在GitHub桌面上的Git Shell上試了一下,並且這個命令沒有工作,給我一個錯誤。 – DucRP 2017-01-09 15:06:17

3

所有在這裏提供的解決方案的重點文件大小,但原來的問題問的是關於犯尺寸,這在我看來,和在我的例子中,找到更重要的是(因爲我想要的是擺脫單個提交中引入的許多小型二進制文件,總結出的大小很大,但是如果按文件單獨測量則小)。

,專注於提交尺寸是提供here一種解決方案,這是該perl腳本:

#!/usr/bin/perl 
foreach my $rev (`git rev-list --all --pretty=oneline`) { 
    my $tot = 0; 
    ($sha = $rev) =~ s/\s.*$//; 
    foreach my $blob (`git diff-tree -r -c -M -C --no-commit-id $sha`) { 
    $blob = (split /\s/, $blob)[3]; 
    next if $blob == "0000000000000000000000000000000000000000"; # Deleted 
    my $size = `echo $blob | git cat-file --batch-check`; 
    $size = (split /\s/, $size)[2]; 
    $tot += int($size); 
    } 
    my $revn = substr($rev, 0, 40); 
# if ($tot > 1000000) { 
    print "$tot $revn " . `git show --pretty="format:" --name-only $revn | wc -l` ; 
# } 
} 

和我這樣調用:

./git-commit-sizes.pl | sort -n -k 1