我有一个300mb的git回购。我目前签出的文件的总大小是2 MB,其余的git回购的总大小是298 MB。这基本上是一个只有代码的回购,不应该超过几MB。
我怀疑有人不小心提交了一些大文件(视频、图像等),然后删除了它们……但不是从git,所以历史仍然包含无用的大文件。如何在git历史中找到大文件?有400多个提交,所以一个接一个的提交是不实际的。
注意:我的问题不是关于如何删除文件,而是如何在第一时间找到它。
我有一个300mb的git回购。我目前签出的文件的总大小是2 MB,其余的git回购的总大小是298 MB。这基本上是一个只有代码的回购,不应该超过几MB。
我怀疑有人不小心提交了一些大文件(视频、图像等),然后删除了它们……但不是从git,所以历史仍然包含无用的大文件。如何在git历史中找到大文件?有400多个提交,所以一个接一个的提交是不实际的。
注意:我的问题不是关于如何删除文件,而是如何在第一时间找到它。
当前回答
对于Windows,我写了一个Powershell版本的答案:
function Get-BiggestBlobs {
param ([Parameter(Mandatory)][String]$RepoFolder, [int]$Count = 10)
Write-Host ("{0} biggest files:" -f $Count)
git -C $RepoFolder rev-list --objects --all | git -C $RepoFolder cat-file --batch-check='%(objecttype) %(objectname) %(objectsize) %(rest)' | ForEach-Object {
$Element = $_.Trim() -Split '\s+'
$ItemType = $Element[0]
if ($ItemType -eq 'blob') {
New-Object -TypeName PSCustomObject -Property @{
ObjectName = $Element[1]
Size = [int]([int]$Element[2] / 1kB)
Path = $Element[3]
}
}
} | Sort-Object Size | Select-Object -last $Count | Format-Table ObjectName, @{L='Size [kB]';E={$_.Size}}, Path -AutoSize
}
您可能需要根据自己的情况微调它是显示kB还是MB,还是仅显示Bytes。
可能存在性能优化的潜力,因此,如果您担心这一点,可以自由地进行试验。
要获得所有更改,只需省略| Select-Object -last $Count。 要得到一个更便于机器阅读的版本,只需省略| Format-Table @{L='Size [kB]';E={$_。Size}},路径-AutoSize。
其他回答
你应该使用BFG Repo-Cleaner。
根据该网站:
BFG是一个更简单、更快的git-filter-branch的替代方案 清除Git存储库历史中的坏数据: 删除疯狂的大文件 删除密码,凭证和其他私人数据
减少存储库大小的经典过程是:
git clone --mirror git://example.com/some-big-repo.git
java -jar bfg.jar --strip-biggest-blobs 500 some-big-repo.git
cd some-big-repo.git
git reflog expire --expire=now --all
git gc --prune=now --aggressive
git push
对于Windows,我写了一个Powershell版本的答案:
function Get-BiggestBlobs {
param ([Parameter(Mandatory)][String]$RepoFolder, [int]$Count = 10)
Write-Host ("{0} biggest files:" -f $Count)
git -C $RepoFolder rev-list --objects --all | git -C $RepoFolder cat-file --batch-check='%(objecttype) %(objectname) %(objectsize) %(rest)' | ForEach-Object {
$Element = $_.Trim() -Split '\s+'
$ItemType = $Element[0]
if ($ItemType -eq 'blob') {
New-Object -TypeName PSCustomObject -Property @{
ObjectName = $Element[1]
Size = [int]([int]$Element[2] / 1kB)
Path = $Element[3]
}
}
} | Sort-Object Size | Select-Object -last $Count | Format-Table ObjectName, @{L='Size [kB]';E={$_.Size}}, Path -AutoSize
}
您可能需要根据自己的情况微调它是显示kB还是MB,还是仅显示Bytes。
可能存在性能优化的潜力,因此,如果您担心这一点,可以自由地进行试验。
要获得所有更改,只需省略| Select-Object -last $Count。 要得到一个更便于机器阅读的版本,只需省略| Format-Table @{L='Size [kB]';E={$_。Size}},路径-AutoSize。
如何在git历史记录中追踪大文件?
从分析、确认和选择根本原因开始。使用git-repo-analysis来提供帮助。
你也可以在BFG Repo-Cleaner生成的详细报告中找到一些价值,它可以通过克隆到数字海洋液滴,使用10MiB/s的网络吞吐量快速运行。
Powershell解决方案的windows git,找到最大的文件:
git ls-tree -r -t -l --full-name HEAD | Where-Object {
$_ -match '(.+)\s+(.+)\s+(.+)\s+(\d+)\s+(.*)'
} | ForEach-Object {
New-Object -Type PSObject -Property @{
'col1' = $matches[1]
'col2' = $matches[2]
'col3' = $matches[3]
'Size' = [int]$matches[4]
'path' = $matches[5]
}
} | sort -Property Size -Top 10 -Descending
如果你在Windows上,下面是一个PowerShell脚本,它将打印存储库中最大的10个文件:
$revision_objects = git rev-list --objects --all;
$files = $revision_objects.Split() | Where-Object {$_.Length -gt 0 -and $(Test-Path -Path $_ -PathType Leaf) };
$files | Get-Item -Force | select fullname, length | sort -Descending -Property Length | select -First 10