是否有可能獲得有關每次提交更改浪費了多少空間的信息 - 因此我可以找到提交大文件或大量文件的提交。這是所有嘗試減少git repo大小(重新綁定和可能篩選提交)git find fat commit
回答
忘了回答,我的回答是:
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
@sschuberth:如果我正確地讀你的腳本,它只考慮在特定提交中被添加_的文件。它不會檢測到文件在提交時大幅增長。 – kynan 2012-04-19 00:07:58
@ kynan:你說得對,因爲這是OP要求的(以及我需要的)。但是很容易改變腳本來檢測修改過的文件:基本上你只需要在grep調用中用「M」代替「A」。這將報告修改後的總文件大小(而不是添加/刪除的字節數)。我很樂意接受GitHub上的pull請求,以使腳本更通用。 – sschuberth 2012-04-24 14:04:12
斷開的鏈接,腳本現在位於[這裏](https://github.com/sschuberth/dev-scripts/blob/master/git/git-commit-size.sh) – Luke 2012-12-15 01:55:18
git cat-file -s <object>
其中<object>
可以引用提交,blob,樹或標記。如果你需要看不同的分支,你」
git ls-tree -r -t -l --full-name HEAD | sort -n -k 4
這將顯示在底部的最大文件(第四列是文件(BLOB)大小
:
你能做到這一點。 。會想改變HEAD那些分支名稱或者,把這種在一個循環中滿枝頭,標籤,或加快轉速您有興趣
就個人而言,我發現這個答案試圖找到一個git回購的歷史大文件時最有幫助:Find files in git repo over x megabytes, that don't exist in HEAD
#!/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
而且我建議使用git format-patch來獲取提交大小(郵件頭將會有一些額外的大小,但實際上如果您需要快速提交併不是太大 - 這並不重要得到確切的大小,+ - 1K將是很好的準確性) – 2014-06-19 16:09:34
git fat find N
其中N是以字節爲單位將返回在整個的所有文件歷史大於N字節。
你可以找到更多關於git的發在這裏:https://github.com/cyaninc/git-fat
無賴。我在GitHub桌面上的Git Shell上試了一下,並且這個命令沒有工作,給我一個錯誤。 – DucRP 2017-01-09 15:06:17
所有在這裏提供的解決方案的重點文件大小,但原來的問題問的是關於犯尺寸,這在我看來,和在我的例子中,找到更重要的是(因爲我想要的是擺脫單個提交中引入的許多小型二進制文件,總結出的大小很大,但是如果按文件單獨測量則小)。
,專注於提交尺寸是提供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
- 1. git commit -m vs git commit -am
- 2. git-svn dmitmiting git commit
- 3. SLOC在git commit
- 4. Git commit問題
- 5. 撤消git commit
- 6. Git revert lastet commit
- 7. git commit integrity
- 8. Git submodule commit
- 9. Git commit date
- 10. Git pre-commit hook
- 11. Git commit命令
- 12. Aptana 3 git commit
- 13. Git commit patches
- 14. Git commit id lost
- 15. TDD&Git commit comments
- 16. git commit problems
- 17. git commit - 格式?
- 18. Git post commit mails
- 19. git commit directory
- 20. 刪除git commit
- 21. (git add -A後跟git commit)和git commit -a之間的區別?
- 22. 結合git add。和git commit
- 23. git commit to github repo
- 24. Git rebase to older commit
- 25. Xcode git commit崩潰
- 26. git commit to all branches
- 27. 撤消git commit --amend
- 28. git post-commit鉤子
- 29. Git commit unknown作者
- 30. git submodule commit/push/pull
請考慮只運行'git的gc'偶爾,可能是'git gc --ggressive' – Hasturkun 2009-08-17 07:33:43
'git gc'(和'git gc --prune'); '--aggresive'甚至可以給出更糟的結果(但通常不應該),通常不值得。 – 2009-08-17 19:55:37
這個答案好多了:http://stackoverflow.com/a/10847242/520567 – akostadinov 2014-06-09 13:32:32