大约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