git log根据特定条件查询日志并统计修改的代码行数
前言
随着年龄的增长和知识的积累,最近常常有种豁然开朗的感觉,或者对一个已经存在的事物突然有了新的认识,比如统计这个词很早就接触了,从没考虑过它是什么意思,而这篇总结的题目中用了统计一词,第一感觉应该是汇总、记录的意思,后来去查了词条定义,也确实就是类似的解释,从没有刻意去学这个词的含义,但是在每天的生活中已经潜移默化地归纳、总结出来了。
想要统计就得有数据源,而gitlog命令恰恰就能提供这个数据源,gitlog本身就是一个显示日志的命令,日志记录的是代码库变化的数据,类似于描述代码库变化的“史书”,想要描述历史就需要大量的数据支撑,想要统计修改的代码行数,只要我们从历史记录中找到需要计算的部分就可以了。
gitlog
在统计之前我们需要先整理数据,杂乱无章的数据不是不能统计,只是计算起来更加的麻烦,所以在统计前需要先将数据规范化,所以我们需要先学习一下gitlog的相关操作。
我们以redis开源库为例,切换到6.0分支,提交记录定位到7bf665f125a4771db095c83a7ad6ed46692cd314,以此为数据源,学习一下gitlog的常用的查询方法,其实使用不同的条件查询就是整理、归类数据的过程。
gitlog的用法多种多样,我们主要关心两个大类,分别是条件筛选和显示格式。
条件筛选
gitlog条件筛选的选项非常多,使用条件筛选的选项会影响显示的提交记录的范围,查找到想要显示的提交记录。
查询最近几条log
使用-number参数可以查询最近几条提交提交记录:
$gitlog-3 commit7bf665f125a4771db095c83a7ad6ed46692cd314(HEAD->6.0,tag:6.0.6,origin/6.0) Author:OranAgraDate:SunJul1914:00:202020+0300 Redis6.0.6. commita5696bdf4f2687ab45f633ccb7cdc4ee9c2f957d Author:OranAgra Date:SunJul1915:33:212020+0300 RundailyCIonPRstoreleaseabranch commite15528bf1da1f1232fd08801ad382c915be94662 Author:ItamarHaber Date:ThuJul1621:31:362020+0300 AddsSHA256SUMtoredis-stabletarballupload (cherrypickedfromcommit5df0a64d30e7815c0a4a75a80f165fdee0bd1db6)
查询指定作者提交
使用--author参数可以查询指定作者的提交记录:
Albert@DESKTOP-6746UC3MINGW64/d/data/maingit/redis(6.0) $gitlog-2--author='OranAgra' commit7bf665f125a4771db095c83a7ad6ed46692cd314(HEAD->6.0,tag:6.0.6,origin/6.0) Author:OranAgraDate:SunJul1914:00:202020+0300 Redis6.0.6. commita5696bdf4f2687ab45f633ccb7cdc4ee9c2f957d Author:OranAgra Date:SunJul1915:33:212020+0300 RundailyCIonPRstoreleaseabranch
查询指定时间段的日志
这个可选参数比较多,比如--since、--until、--before、--after等等,从意思很容易分辨怎么使用:
查询2020-01-01到2020-04-01的提交记录
$gitlog-2--after=2020-01-01--before=2020-04-01 commit957e917a84ac9979f18145a4d0b53386f5ce4fd9(tag:6.0-rc3) Author:antirezDate:TueMar3117:56:042020+0200 Redis6.0-RC3. commitef1b1f01a84e969ea368e7fdbaf0d10615743269 Author:antirez Date:TueMar3117:41:232020+0200 castraxSize()toavoidwarningwithformatspec.
恰好逮到了原作者的提交~
查询1年前的提交记录
$gitlog-2--until=1.year.ago commit86aade9a024c3582665903d0cc0c5692c6677cfd Merge:89ad0ca563bfcae247 Author:SalvatoreSanfilippoDate:ThuSep513:30:262019+0200 Mergepullrequest#6364fromoranagra/fix_module_aux_when Fixtomoduleauxdatardbformatforbackwardscompatibilitywitholdcheck-rdb commit3bfcae247a1c51788940bd4d2f32751ead451e42 Author:OranAgra Date:ThuSep514:11:372019+0300 Fixtomoduleauxdatardbformatforbackwardscompatibilitywitholdcheck-rdb Whenimplementingthecodethatsavesandloadstheseauxfieldsweusedrdb formatthatwasaddedforthatinredis5.0,butthenweaddedthe'when'field whichmeantthattheoldredis-check-rdbwon'tbeabletoskipthese. thisfixaddsanopcodeasifthat'when'ispartofthemoduledata.
查询包含指定描述内容的提交记录
这里用可以使用--grep参数,可以过滤出包含指定内容的提交记录,这里指的是在commit描述中筛选符合条件的提交,比如查找提交描述中包含client的提交记录:
$gitlog-2--grep='client' commit0f75036c07db48dfcf605e090216a4447edc38fc Author:WenHuiDate:WedJul1505:38:472020-0400 correcterrormsgfornumconnectionsreachingmaxclientsinclustermode(#7444) (cherrypickedfromcommitd85af4d6f5fbe9cb9787b81583627cd74b47f838) commitf89f50dbd06247677b8cb3927cbb88c1b5384061 Author:OranAgra Date:TueJul1420:21:592020+0300 disklessmasterdisconnectreplicaswhenrdbchildfailed(#7518) incasetherdbchildfailed,crashedorterminatedunexpectedlyredis wouldhavemarkedthereplicaclientswithrepl_put_online_on_ackand thenkillthemonlyafteraminutewhennoackwasreceived. itwouldnotstreamanythingtotheseconnections,sotheonlyeffectof thisbugisadelayof1minuteinthereplicasattempttore-connect. (cherrypickedfromcommita176cb56a3c0235adddde33fcbaee2369a5af73e)
查找指定分支的提交记录
使用gitlog默认查找的是当前分支的提交记录,如果想查询其他分支的记录直接在命令后面加上分支名字就行,比如查询arm分支上的提交记录:
$gitlog-2arm commit7329cc39818a05c168e7d1e791afb03c089f1933(origin/arm,arm) Author:SalvatoreSanfilippoDate:SunFeb1915:07:082017+0000 ARM:AvoidfastpathforBITOP. GCCwillproducecertainunalignedmultiload-storeinstructions thatwillbetrappedbytheLinuxkernelsinceARMv6cannot handlethemwithunalignedaddresses.Bettertousetheslower butsaferimplementationinsteadofgeneratingtheexceptionwhich shouldbeanywayveryslow. commit4e9cf4cc7ed4b732fc4bb592f19ceb41d132954e Author:SalvatoreSanfilippo Date:SunFeb1915:02:372017+0000 ARM:Uselibcmallocbydefault. I'mnotsurehowmuchtestJemallocgetsonARM,moreover compilingRediswithJemallocsupportinnotverypowerful devices,likemostARMspeoplewillbuildRedison,isextremely slow.ItispossibletoenableJemallocbuildanywayifneeded byusing"makeMALLOC=jemalloc".
其实在git体系中,分支名、commit、标签等拥有几乎相同的含义,所以在很多场景下可以扩展互换,比如gitlog后面加上分支名就可以查询指定分支的提交记录,如果加上commit就会查询这个commit之前的提交记录,如果加上标签,就可以查询这个标签之前的提交记录,比如我们加一个commit试试:
$gitlog-27329cc39818a05c168e7d1e791afb03c089f1933 commit7329cc39818a05c168e7d1e791afb03c089f1933(origin/arm,arm) Author:SalvatoreSanfilippoDate:SunFeb1915:07:082017+0000 ARM:AvoidfastpathforBITOP. GCCwillproducecertainunalignedmultiload-storeinstructions thatwillbetrappedbytheLinuxkernelsinceARMv6cannot handlethemwithunalignedaddresses.Bettertousetheslower butsaferimplementationinsteadofgeneratingtheexceptionwhich shouldbeanywayveryslow. commit4e9cf4cc7ed4b732fc4bb592f19ceb41d132954e Author:SalvatoreSanfilippo Date:SunFeb1915:02:372017+0000 ARM:Uselibcmallocbydefault. I'mnotsurehowmuchtestJemallocgetsonARM,moreover compilingRediswithJemallocsupportinnotverypowerful devices,likemostARMspeoplewillbuildRedison,isextremely slow.ItispossibletoenableJemallocbuildanywayifneeded byusing"makeMALLOC=jemalloc".
因为commitid就是之前的arm分支最新的记录,所以这个命令等价于gitlog-2arm
查询指定commit之间的提交记录
如果想查询两个commit之前的提交记录,可以将两个commitid依次放在命令后面并用..连接就可以了,格式为gitlogcommit1..commit2,需要注意的是这样查询出来的提交记录列表中不包含commit1,其实列举出的就是commit1之后又做了哪些修改提交。
$gitloge15528bf1da1f1232fd08801ad382c915be94662..7bf665f125a4771db095c83a7ad6ed46692cd314 commit7bf665f125a4771db095c83a7ad6ed46692cd314(HEAD->6.0,tag:6.0.6,origin/6.0) Author:OranAgraDate:SunJul1914:00:202020+0300 Redis6.0.6. commita5696bdf4f2687ab45f633ccb7cdc4ee9c2f957d Author:OranAgra Date:SunJul1915:33:212020+0300 RundailyCIonPRstoreleaseabranch
这个特性有一个应用就是在merge分支之前可以查询究竟会merge哪些记录,常见的用法比如gitlogfeature..dev就是列举出feature分支合并到dev分支将要合并的提交记录有哪些。
$gitlog6.0..unstable commit324e22accf457edc996971bc97f5474349cd7c4c(unstable) Author:antirezDate:FriDec2012:29:022019+0100 FixipandmissingmodeinRM_GetClusterNodeInfo().
查询指定文件的提交记录
查询指定文件的提交记录一般直接在gitlog命令后面跟上文件名就可以,但是为了避免和分支名产生分歧,所以通常在文件名前面加上--用来区分,--这个标识符就是用来防止混淆的,放在--前面的是分支名,放在后面的是文件名,相同的作用不仅仅在gitlog命令中,在其他命令比如gitcheckout中也有相同的用法。
$gitlog-2--redis.conf commit7a536c2912be1fd9f62b26b7022a00644c88ef8b Author:YossiGottliebDate:FriJul1011:33:472020+0300 TLS:Sessioncachingconfigurationsupport.(#7420) *TLS:Sessioncachingconfigurationsupport. *TLS:Removeredundantconfiginitialization. (cherrypickedfromcommit3e6f2b1a45176ac3d81b95cb6025f30d7aaa1393) commit8312aa27d47c0befcf69eb74d0a5dc19745ffd32 Author:antirez Date:MonJun2211:21:212020+0200 Clarifymaxclientsandclusterinconf.Removemyselftoo. (cherrypickedfromcommit59fd178014c7cca1b0c668b30ab0d991dd3030f3)
显示格式
gitlog除了可以筛选提交记录,还可以控制显示格式,普通不加参数,会显示作者、邮件、提交描述信息、日期等信息。
通过添
$gitlog-1 commit7bf665f125a4771db095c83a7ad6ed46692cd314(HEAD->6.0,tag:6.0.6,origin/6.0) Author:OranAgraDate:SunJul1914:00:202020+0300 Redis6.0.6.
加参数可以控制和改变显示格式,下面来看几条常见的
显示单行信息
gitlog默认会显示多行信息,使用--oneline后每条提交记录只显示一行信息,可以在一屏幕中查看到更多的信息
$gitlog-10--oneline 7bf665f12(HEAD->6.0,tag:6.0.6,origin/6.0)Redis6.0.6. a5696bdf4RundailyCIonPRstoreleaseabranch e15528bf1AddsSHA256SUMtoredis-stabletarballupload e28aa99afSupportpassingstackallocatedmodulestringstomoduleCreateArgvFromUserFormat(#7528) 305143004Sendnullforinvalidateonflush(#7469) 29b20fd52Notifysystemdonsentinelstartup(#7168) 5b3668121AddregistersdumpsupportforApplesilicon(#7453) 0f75036c0correcterrormsgfornumconnectionsreachingmaxclientsinclustermode(#7444) b1a01fda9Fixcommandhelpforunexpectedoptions(#7476) 83f55f61aRefactorRM_KeyType()byusingmacro.(#7486)
显示每条记录中文件修改的具体行数和行体统计
使用--stat参数就可以显示每条记录的中修改文件的具体行数和行数统计
$gitlog-2--stat commit7bf665f125a4771db095c83a7ad6ed46692cd314(HEAD->6.0,tag:6.0.6,origin/6.0) Author:OranAgraDate:SunJul1914:00:202020+0300 Redis6.0.6. 00-RELEASENOTES|245++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/help.h|4+- src/version.h|2+- 3fileschanged,248insertions(+),3deletions(-) commita5696bdf4f2687ab45f633ccb7cdc4ee9c2f957d Author:OranAgra Date:SunJul1915:33:212020+0300 RundailyCIonPRstoreleaseabranch .github/workflows/daily.yml|6++++-- 1filechanged,4insertions(+),2deletions(-)
显示每条提交记录中文件的增加行数和删除行数
使用--numstat参数会把--stat参数中合并显示的修改行数拆分成增加行数和删除行数
$gitlog-2--numstat commit7bf665f125a4771db095c83a7ad6ed46692cd314(HEAD->6.0,tag:6.0.6,origin/6.0) Author:OranAgraDate:SunJul1914:00:202020+0300 Redis6.0.6. 245000-RELEASENOTES 22src/help.h 11src/version.h commita5696bdf4f2687ab45f633ccb7cdc4ee9c2f957d Author:OranAgra Date:SunJul1915:33:212020+0300 RundailyCIonPRstoreleaseabranch 42.github/workflows/daily.yml
依次罗列各提交记录中每个文件中增加的行数和删除的行数
要想达到这个目的需要用到--prety=tformat:--numstat参数,这样的显示格式便于统计
$gitlog-2--pretty=tformat:--numstat 245000-RELEASENOTES 22src/help.h 11src/version.h 42.github/workflows/daily.yml
统计修改的代码行数
有了前面的铺垫,想要统一修改的行数就容易了,只要配合awk工具就可以完成统计了
$$gitlog-2--pretty=tformat:--numstat|awk'{adds+=$1;subs+=$2;diffs+=$1-$2}END{printf"addedlines:%sremovedlines:%s,difflines:%s\n",adds,subs,diffs}' addedlines:252removedlines:5,difflines:247
还可以统计两个分支相差的代码行数
$gitlog6.0..unstable--pretty=tformat:--numstat|awk'{adds+=$1;subs+=$2;diffs+=$1-$2}END{printf"addedlines:%sremovedlines:%s,difflines:%s\n",adds,subs,diffs}' addedlines:5removedlines:2,difflines:3
到这里可以发现前面的知识都可以用上,前面筛选的参数变了,得到的结果就变了,我们可以根据需求来调整不同的参数
总结
- gitlog就是一部代码库记录的“史书”,对于曾经所做的修改可以做到有史可查
- gitlog的选项参数可以分为筛选参数和格式参数,筛选参数可以选择记录范围,格式参数可以控制显示样式
- 统计就是按照一定规律来将数据进行汇总,在进行汇总前需要将数据进行整理,这样汇总的工作才会更加顺利
到此这篇关于gitlog根据特定条件查询日志并统计修改的代码行数的文章就介绍到这了,更多相关gitlog统计修改代码行数内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。