2017-08-06 26 views
3

我想这样做的Git仓库一些审计维护操作,因为有开发商,有时版本的文件,不应该是规则(健康)仓库:编译二进制文件,第三方文档文件...Git仓库的维护和审计工具

在过去的几个月里库的规模已大大增加,我想知道为什么:已添加了哪些文件,哪些文件扩展名,什么文件大小。 ..即使这些文件可能已被删除后,元数据仍然存在,影响克隆,拉取命令,并且git元数据目录确实很大。

我知道git的日志命令提供了这样的功能,但我不知道是否有其他工具(UI工具也许?),提供集成度更高,便于比较和对比有关git仓库使用

所以,总结,什么是我的选择,以获取有关Git的信息:

  1. 文件添加到一定大小的存储库,文件 扩展,从一定时间和(如果可能)这样做。

  2. 文件,这些文件删除是否可以删掉呢?

+0

将会有一些变化 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

回答

0

您可以尝试github.com存储库中的洞察选项卡,查看谁在贡献多少时间,进一步检查组成这些代码部分的提交。如果你不在github上,你可以通过git gui获得类似的见解。

+0

恐怕Git GUI太基础了,我正在寻找更强大,更丰富的东西。无论如何感谢:) – Luis

5

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

现在,强制推动你的改变,然后你的团队中的每个人都可以制作一个新的克隆。享受你的瘦身回购!

+0

感谢您的真棒解释和命令提示;我熟悉Git内部组件,但我并不熟练掌握流水线命令......非常感谢! – Luis