使用Askgit-Git存储库的SQL接口

2020-08-16 02:35:53

Askgit为您的git存储库提供了一个SQL接口。让我们安装一下,看看我们能弄清楚关于回购的情况。

这将下载软件包、依赖项,并将所有内容编译成可执行文件。如果您找不出它安装在哪里,请检查是否正确设置了GOPATH,它将显示在$GOPATH/bin中。并通过检查哪个ASKGIT来确保它在您的路径上。

Git处理的基本单元是提交,它是应用于父对象的一系列正式更改。或者在合并的情况下是多个父级。让我们对回购中的内容做一些基本的分析,多长时间以来一直在做,以及谁一直在做这件事。

让我们在回购中找到最早的时间戳。对于大多数工作流来说,这些日期是相似的,但如果项目通过电子邮件(如Linux或Postgres或sr.ht上的任何内容)共享补丁,则Author_When是代码编写的时间(根据作者),提交者_When是代码添加到repo的时间。

Askgit";从提交";选择MIN(Author_When)、MIN(COMMITER_WHEN);+--+--+|MIN(作者时)|MIN(提交者时)|+--+。-+|2007-11-07T12:54:26-08:00|2007-11-07T12:54:26-08:00|+--+--+。

Askgit";SELECT Message,Author_Name,Author_Email,Author_When from Comments Order by Submit_When ASC Limit 1";+--+-+---+--+。|Message|作者姓名|作者邮箱||+--+-+---+-时作者。-+|ruby/git项目开始|Scott Chacon|[email protected]|2007-11-07T12:54:26-08:00|+--+-+。。

Askgit";SELECT SUMMARY,AUTHER_NAME,AUTHER_WHEN,Additions from Comments Order by Additions Desc Limit 10";+--+-+--+-+|摘要|作者姓名|作者|添加时间|+。-+-+--+-+|添加了文档和|Scott Chacon|2007-11-11T17:59:18-08:00|12707||许可证文件|更新了|Scott Chacon|2007-11-13T07:36:50-08:00|2223||文档|更新文档|Scott Chacon|2007-11-16T13:24:30-08:00|2109||更新文档|Scott Chacon|2007-11-19T07:34:25-08:00|1448||新增推流。更改了一些文档,|Scott Chacon|2007-11-12T10:55:39-08:00|1193||合并自述文件和示例,|修复了要构建的Rake任务|适当的gem|实现和测试|James Couball|2019-12-11T10:04:03-08:00|763||需要确保|命令输出编码不会|不引发异常(#405)|添加了来自|Scott Chacon|2007-11-20T12:07:46-08:00|749|gitrr。但哪一个更棒|代码|添加我的测试git|Scott Chacon|2007-11-11T17:11:19-08:00|711||目录|添加分支,更多日志|Scott Chacon|2007-11-09T13:11:22-08:00|522|内容,更好的测试,更改|添加了一些日志API|添加了Git::Lib的测试|。已开始|git::diff开发|添加了一些测试文件,|Scott Chacon|2007-11-07T17:19:09-08:00|486||运行了一些实际测试|+--+-+。-+-+。

Askgit"。+--+-+--+-+|摘要|作者姓名|作者|删除时间|+。-+-+--+-+|从修订中删除文档|乔纳森·鲁登伯格|2008-12-24T08:08:19+08:00|14822||控制|更新的文档|斯科特·查康|2007-11-。19T07:34:25-08:00|1311||更新了文档|Scott Chacon|2007-11-16T13:24:30-08:00|1141||更新了|Scott Chacon|2007-11-13T07:36:50-08:00|1061||文档|已将纯Ruby代码|Scott Chacon|2008-03-08T18:14:15-08:00|1050|恢复为系统调用。更改了一些文档,|Scott Chacon|2007-11-12T10:55:39-08:00|976||合并了自述文件和示例,|修复了Rake任务以构建|适当的GE

同样,大多数都是在项目的开始阶段,通过2014年的大规模清理,很可能是某种形式的重构。

让我们按照Author_Name对提交进行分组,并按最多的提交者排序。看起来Scott Chacon后来变成了ScottChacon,所以他被计算了两次。不过,看起来他做了很多事情。

Askgit";选择COUNT(*)作为COUNT,AUTHOR_NAME FROM COMMITS GROUP BY AUTHER_NAME HAVING COUNT&>1 ORDER BY COUNT。+-+-+|count|作者姓名|+-+|81|Scott Chacon||78|robertodecurnex||77|Roberto Decurnex||20|Scott Chacon||20|Joshua Nichols|9|Per Lundberg||。|Kelly Stannard||4|elliottCable||4|Josh Nichols||4|James Rosen||3|Yuichi Tateno||3|Michael Mallete||3|Jorge Berna||2|Yuya.Nishida||2|Yuta Harima||2|tit||2|Joshua Liebowitz||2|Jonathan Rudenberg||2|Joe Moore||2|Giannan。

我们可以使用sqlitedate函数查看一段时间内项目的活动。我们可以看到,一开始有很多活动,后来就逐渐减少了。

Cd/tmp/ruby-gitaskgit";选择strftime(\";%Y-%m\";,Author_When)作为';月份';,COUNT(*)作为TOTAL_COMMITS,SUM(添加),SUM(删除)FROM COMMITS GROUP by strftime(\";%Y-%Me\";,Author_When)按strftime(\";%Y-%m\&)排序。

+-+|月|提交总数|总和(添加)|总和(删除)|+-。-+|2007-11|78|27597|6204||2008-01|3|5|5||2008-03|12|279|1101||2008-05|10|180|34||2008-07|4|33|6||2008-08|1|2|2|2|2008-10|1|1|1|1|2008-11|1|1|1|2008-12|6|180|15039|2009年。2|9|2||2009-04|1|1|1|1||2009-05|2|115|16||2009-08|13|168|97|2009-09|4|10|6|2009-10|6|11|11||2011-08|1|1|1|1|2011-09|1|0|0|2011-10|1|251|240|2011-12|1|30|1|2012-03|1|1|0|2012-04。1|6|4||2013-04|45|704|388||2013-05|3|8|5||2013-06|1|9|0||2013-08|17|184|41||2013-09|1|8|8||2013-12|2|4|4||2014-01|26|254|96||2014-02|5|8|753|2014-05|1|2|2|2014-06|4|14|2|。4|4|4||2014-09|5|109|54||2014-10|1|20|0||2014-11|4|10|4|2014-12|11|244|60||2015-01|36|446|216||2015-10|1|1|0||2016-02|12|216|196|2018-01|2|40|42|2018-02|1|17|17|2018-03|4|233|64|2018。4|81|35||2018-06|5|192|19||2018-07|4|37|9|2018-08|5|64|15||2018-10|1|169|0||2019-02|1|65|45||2019-09|1|8|2||2019-12|1|763|17||2020-01|6|172|56||2020-02|5|15|10|2020-04|9|63|9|。-+。

看看这个,你可以看到在2010年和2017年什么都没有发生,在2008-11年度移除了一大堆东西,而实际上,在最初的实施狂潮之后,只完成了非常小的工作。

标签可以表示版本。想必这个项目正处在一个您想要以某种方式标记它的点上,我们将利用这一点来查看一直在进行的事情的生命周期。

Askgit";从标签";中选择名称、标记器名称、目标类型;+---+|名称|标记器名称|目标类型|+。-+--+--+|引用/标记/1.0.3|NULL|NULL||引用/标记/1.0.5|NULL|NULL||引用/标记。/1.0.5.1|[email protected]|ae106e2a3569e5ea874852c613ed060d8e232109||refs/tag/v1.0.7|[email protected]|1adc5b8136c2cd6c694629947e1dbc49c8bffe6a||refs/tag/v1.2.0|null|null|refs/tag/v1.2.1|null|null。Tag/v1.2.4|null|null||refs/tag/v1.2.5|null|null||refs/tag/v1.2.6|[email protected]|6db4fdcad851eeaff6382a9eb6748455c3818c3e||refs/tag/v1.2.7|[email protected]|219c729b24b1dc868986f8216559。9.1|[email protected]|cc6d6efc1b7eaf63609c4c06969b0f839dc80095||refs/tag/v1.3.0|[email protected]|a223fcf873bd99658cd1d0bdee1818adc7e3e92c||refs/tag/v1.4.0|per.lundberg@。@verizonmedia.com|4bef5abbba073c77b4d0ccc1ffcd0ed7d48be5d4|+---+。

当target_type为NULL时,意味着它是一个轻量级标记,并且没有与其关联的COMMIT。大多数时候,人们会有一个提交,因为提交有一个日期,这让我们更容易与之联系。

Askgit";SELECT NAME,COMMITS.ID,COMMISE,AUTHER_NAME,AUTHER_EMAIL,AUTHER_WHEN FROM TAG,COMMITS WHERE TAG。+-+-+。--+--+|名称|ID|消息|作者名称|作者电子邮件||+-+--时的作者。-+--+-+--+。-+|refs/tag/1.0.5.1|ae106e2a3569e5ea874852c613ed060d8e232109|错误修复|Scott Chacon|[email protected]|2008-03-23T13:32:52-07:00||refs/tag/v1.0.7|1adc5b8136c2cd6c694629947e1dbc49c8bffe6a。[email protected]|2013-08-17T04:23:53-03:00||refs/tags/v1.2.7|219c729b24b1dc868986f821655912612919ac21|移至1.2.7|robertodecurneX|[email protected]|2014-06-09T17:06:42-03:00|refs/tag/vc。|refs/tag/v1.2.9|99b11561a64740285872f4c0a8b72e3e69308ed2|更新changelog|Roberto DecurneX|[email protected]|2015-01-12T16:51:41-03:00||refs/tag/v1.2.9.1|cc6d6efc1b7eaf63609c4c06969。[email protected]|2016-02-25T16:16:06-03:00|Travis。(更新捆绑包)|refs/tag/v1.3.0|a223fcf873bd99658cd1d0bdee1818adc7e3e92c|Bump Version 1.3.0 Droping|Roberto DecurneX|[email protected]|2016-02-25T19:22:08-03:00|Ruby 1.8.x支持|refs/tag/v1.4.0|c8。5.0|fd2642a626d20594a25010526f10ff99431c2cca|版本v1.5.0|per Lundberg|[email protected]|2018-08-10T09:57:26+02:00||refs/tag/v1.7.0|4bef5abbba073c77b4d0ccc1ffcd0ed7d48be5d4|版本v1.7.0|James Couball|Couball

Prev_date=$(askgit";SELECT MIN(Author_When)as first from Commits";--format csv|grep-v first)而IFS=,read-r tag id date;do if[[";$tag";!=";name";];然后回显${tag},${id},${prev_date},${date}prev_date=${date}fi完成<;/tmp/ruby-git/tags.csv>;/tmp/ruby-git/start_end.csv。

我们可以遍历该文件,并提取进入每个标记的一些统计数据。

Cd/tmp/ruby-git While IFS=,read-r tag id start end;do echo$tagaskgit";select count(*)as count from Commits where Author_When&>';${start}';and Author_When<;=';${end}';";--format json|JQ.countaskgit";select count(*)as count,Author_name from Commits where Author。和Author_When<;=';${end}&39;GROUP BY AUTHER_NAME ORDER BY COUNT DEC&34;DONE<;start_end.csv。

参考文献/标签/1.0.5.10+-+-+|COUNT|作者姓名|+-+-++-+-+refs/tags/v1.0.710+-+-+|COUNT|作者姓名。|+-+-+|6|斯科特·查康||3|豪尔赫·贝尔纳尔||1|Michael Siebert|+-+-+refs/tags/v1.2.6128+-+-+|计数|作者姓名|+-+--。-+|54|robertodecurnex||20|Joshua Nichols||8|Daniel Mendler||5|Scott Chacon||4|elliottCable||4|Roberto Decurnex|4|Josh Nichols||4|James Rosen||3|Yuichi Tateno||3|Michael Mallete||2|Jonathan Rudenberg|2。迈克尔·黑尔||1|肯·普拉特||1|加布里埃尔·卡多佐||1|查德·罗森||1|布莱恩·拉森|+-+-+refs/tags/v1.2.739+-+-+|计数|作者姓名|+-+|22。|robertodecurneX||9|Roberto DecurneX||2|Cameron Walsh||1|OhtakeTomohiro||1|Guy Hughes||1|David Underwood||1|Ben Sedat||1|Arnvald||1|Andy Schrage|+-+-+refs/tags/v1.2.88+-+-+|COUNT|作者姓名|+-+。-++3|罗伯托·迪克雷克斯||2|罗伯托·迪克雷克斯||2|西田裕雅||1|泽维尔·卡兰德·|+-+-+refs/tags/v1.2.956+-+----+|计数|作者姓名|+。-+|46|罗伯托·德库雷克斯||4|凯利·斯坦纳德||1|姆沃洛克||1|哈拉尔德·西特||1|弗朗西斯·梁(佛朗哥)||1|戴夫·莱恩||1|布莱恩·史蒂文斯||1|亚当·胡珀|+-+----+refs/tags/v1.2.9.14+-+。-+|COUNT|作者姓名|+-+3|罗伯托·德克雷克斯||1|埃里克·齐利亚科斯|+-+-+refs/tags/v1.2.1012+-+-+|COUNT|。作者名称|+-+-++10|罗伯托·德库雷克斯||1|大卫·瓦塔尼安||1|克里斯蒂安·佩林|+-+-+refs/tags/v1.3.02+-+-+|计数|作者姓名|+-+。-+|2|Roberto DecurneX|+-+-+refs/tags/v1.4.012+-+-+|计数|作者姓名|+。-+|6|Per Lundberg||1|Vern Burton||1|Tom Potts||1|Richard Vodden||1|Rafael Reggiani Manzo||1|Guilherme Maluf Balzana||1|Alexander Maslov|+-+-+refs/tags/v1.5.012+-+。+|计数|作者姓名|+-+-+3|弗恩·伯顿||2|Per Lundberg||2|Joshua Liebowitz||1|铃木泰一郎||1|Matias Garcia Isaia||1|科迪||1|Kelly Stannard||1|Denis Defreyne|+-+-+refs/tags/v1.7.026+。-+-+|count|作者名称|+-+|9|James Couball||2|Yuta Harima||1|cycltron3k|1|Vern Burton||1|tit||1|Stephen Paul Weber||1|Salim Afiune||1|per。1|Evgenii Pecherkin||1|Antonio Terceiro||1|Alex Mayer||1|Agora Security|+-+。

我们还可以查看提交中的文件。Askgit确实有一个文件表,但它显示了特定提交时的存储库状态,因此对于实际跟踪提交中或提交之间附加的更改没有太大用处。

我们可以用..。指定提交范围的方式,以便让查看哪些文件已更改。

.