记-统计svn与git的log日志中的代码行变动

任务要求git

统计指定时间内,指定git地址与svn地址上的全部人员的代码行变动状况。数据库

 

解决方案json

最初为根据数据库中存储的全部git与svn地址来统计全部人员的提交代码行。以后因为库中存储的地址不全,改成经过gitlab api,找到上面的全部仓库,以后统计代码行。svn因为数据库中地址存储较全,因此仍是从库中获取地址。api

 

实际流程curl

git代码行统计:svn

任意一个git的ip地址内会包含不少仓库地址,每次调用api最多只能查出100条地址,须要设置起始查询的页数。gitlab

因此先调用api查询出来一共有多少页(须要传入每次每页展现多少条数据)url

curl --head --header 'PRIVATE-TOKEN:Token秘钥' 'gitlab仓库ip地址/api/v4/projects?per_page=100'

 

以后for循环每页,查询出该ip地址下全部的仓库地址。spa

这是查询某一页的地址的命令,返回的是json结果。日志

curl --header 'PRIVATE-TOKEN:Token秘钥' 'gitlab仓库ip地址/api/v4/projects?page=起始页数&per_page=查询条数'

 

拿到仓库地址后,须要先将仓库clone下来。而后查询该仓库的全部分支,并循环切换每个分支。

一、先查询出在指定时间节点上的全部提交人

git log  --format='%cn' --since="${start_time}" --until="${end_time}"

二、对人名去重后遍历每个提交人,

而后查询出该人员在指定时间段内的全部提交hash码(每一次提交都会生成一个惟一的hash码)

git log --format='%H' --committer="${name}" --since="${start_time}" --until="${end_time}"

三、此时须要注意一点:若是咱们以某一个分支为基础从新拉一个分支,那么旧分支的提交历史也被拉到新分支上,统计的时候就会形成重复统计(某一我的只提交了一次,但此次的提交历史会出如今多个分支上),但相同提交的hash值却不会重复。

因此咱们在查出“某个git地址的某个分支里的某次提交的hash值”后,须要将这条暂存起来,当统计该git地址的其余分支的时候,若是还出现这个提交hash值时,就不要统计了。

四、在肯定该此hash值没有重复后,根据该hash值查询出此次的提交详情

git show ${chash}

根据详情里面的+、-符号能够统计出增减的代码行,更具体的也能编写正则区分有效代码行、空行与注释行。

 

到此时咱们已经有了 在某个时间段内 某个git地址的某个分支的某我的的某次提交的代码变动行数详情。

 

svn代码行统计:

svn的提交历史的统计与git有所不一样。

svn不须要将仓库下载到本地,能够远程查看某一仓库地址的全部log日志。

svn的查看历史代码行详情为两个步骤:

一:能够经过命令

svn log -v -r {"$start_time"}:{"$end_time"} ${now_url}

查询出某个时间段内某个仓库地址的全部变动文件的路径,其中还包括了提交人和“变动的版本号”,可是看不到具体某文件的变动详情。

二:能够经过命令

svn diff -c ${rversion} ${fileurl}

查询出具体某变动文件(包括路径)的某个版本的变动详情。

 

因此第一步显示查询出全部变动文件路径,而后再对具体文件的具体版本进行变动详情的查询。

 

此处我采用的统计方法有些不稳,我是遍历每一行,根据每一行的内容,来进行统计。

一、若是当前行为"------------------------------------------------------------------------"

则表示下一行该显示用户名和版本号了,而后下一行遍历是就正则出这两个信息。

二、若是当前行为"Changed paths:"

则表示下一行该正则出文件路径了

此处须要对文件路径进行进一步排查,由于还存在不少:如图片文件等没法或不须要统计代码行的文件被提交的状况,这些文件就不须要进一步查看他们的内容变动详情。

三、若是文件格式正确,则能够经过命令查询出该版本下此文件的变动详情,而后进行统计。

依然可经过每行第一位的+-符号来判断具体行的变动状况。

 

后续的一些处理操做:

每次统计出结果后,能够将全部的统计参数传给其余脚本文件,最终将此次的统计结果传入数据库。

相关文章
相关标签/搜索