记-统计svn与git的log日志中的代码行变更
任务要求
统计指定时间内,指定git地址与svn地址上的所有人员的代码行变更情况。
解决方案
最初为根据数据库中存储的所有git与svn地址来统计所有人员的提交代码行。之后由于库中存储的地址不全,改为通过gitlab api,找到上面的所有仓库,之后统计代码行。svn由于数据库中地址存储较全,所以还是从库中获取地址。
实际流程
git代码行统计:
任意一个git的ip地址内会包含很多仓库地址,每次调用api最多只能查出100条地址,需要设置起始查询的页数。
所以先调用api查询出来一共有多少页(需要传入每次每页展示多少条数据)
curl --head --header 'PRIVATE-TOKEN:Token秘钥' 'gitlab仓库ip地址/api/v4/projects?per_page=100'
之后for循环每页,查询出该ip地址下所有的仓库地址。
这是查询某一页的地址的命令,返回的是json结果。
curl --header 'PRIVATE-TOKEN:Token秘钥' 'gitlab仓库ip地址/api/v4/projects?page=起始页数&per_page=查询条数'
拿到仓库地址后,需要先将仓库clone下来。然后查询该仓库的所有分支,并循环切换每一个分支。
1、先查询出在指定时间节点上的所有提交人
git log --format='%cn' --since="${start_time}" --until="${end_time}"
2、对人名去重后遍历每一个提交人,
然后查询出该人员在指定时间段内的所有提交hash码(每一次提交都会生成一个唯一的hash码)
git log --format='%H' --committer="${name}" --since="${start_time}" --until="${end_time}"
3、此时需要注意一点:如果我们以某一个分支为基础重新拉一个分支,那么旧分支的提交历史也被拉到新分支上,统计的时候就会造成重复统计(某一个人只提交了一次,但这次的提交历史会出现在多个分支上),但相同提交的hash值却不会重复。
所以我们在查出“某个git地址的某个分支里的某次提交的hash值”后,需要将这条暂存起来,当统计该git地址的其他分支的时候,如果还出现这个提交hash值时,就不要统计了。
4、在确定该此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}
查询出具体某变更文件(包括路径)的某个版本的变更详情。
所以第一步显示查询出所有变更文件路径,然后再对具体文件的具体版本进行变更详情的查询。
此处我采用的统计方法有些不稳,我是遍历每一行,根据每一行的内容,来进行统计。
1、如果当前行为"------------------------------------------------------------------------"
则表示下一行该显示用户名和版本号了,然后下一行遍历是就正则出这两个信息。
2、如果当前行为"Changed paths:"
则表示下一行该正则出文件路径了
此处需要对文件路径进行进一步排查,因为还存在很多:如图片文件等无法或不需要统计代码行的文件被提交的情况,这些文件就不需要进一步查看他们的内容变更详情。
3、如果文件格式正确,则可以通过命令查询出该版本下此文件的变更详情,然后进行统计。
依然可通过每行第一位的+-符号来判断具体行的变更情况。
后续的一些处理操作:
每次统计出结果后,可以将所有的统计参数传给其他脚本文件,最终将这次的统计结果传入数据库。
记-统计svn与git的log日志中的代码行变更的更多相关文章
- 删除log日志中包含某个字符的行
sed -i '/{Str}/d' abc.txt 假如你的log日志中某行有sleep字符,直接输入命令: sed -i '/sleep/d' log.log 如果删除的是一个变量的值,假如是var ...
- 数据库 alert.log 日志中出现 "[Oracle][ODBC SQL Server Wire Protocol driver][SQL Server] 'RECOVER'"报错信息
现象描述: (1).数据库通过调用透明网络实现分布式事务,但透明网关停用后,失败的分布式事务并未清理. (2).数据库 alert 日志 Thu Sep 06 06:53:00 2018 Errors ...
- rest-assured 将log()中的信息打印到log日志中去的方法
rest-assured 将log()中的信息打印到log日志中去的方法: ============方法1============== PrintStream fileOutPutStream = n ...
- 使用 Git 来管理 Xcode 中的代码片段
使用 Git 来管理 Xcode 中的代码片段 代码片段介绍 xcode4 引入了一个新 feature: code snippets,在整个界面的右下角,可以通过快捷键:cmd + ctrl + o ...
- git从远程仓库中更新代码到本地仓库
git从远程仓库中更新代码到本地仓库 有时候在使用git pull的时候,会莫名才报错.查了很多资料,尝试过git的很多命令.包括git fetch命令,都会报同样的错.最后终于发现了一条捷径,由网友 ...
- log日志中不打印异常栈的具体信息
问题与分析 最近在查项目的log时发现报了大量的NPE(NullPointerException),诡异的是只log了Exception的类名,却没有具体的堆栈信息,以致于无法对该NPE异常进行准确定 ...
- 使用vs的查找功能,简单大概的统计vs中的代码行数
VS强大的查找功能,可以使用正则表达式来进行查找,这里统计代码行数的原理就是: 在所有指定文件中进行搜索,统计匹配的文本行数. 但是匹配的行需要满足:非注释.非空等特殊非代码行. 使用Ctrl+Shi ...
- mycat的wrapper.log日志中发现主从切换报错
可能是MySQL在某些情况下重启(密切关注重启现象,关注日志,找出原因),导致mycat切换主从.由于设置了单向主从,mycat将从库切换为主库,原来的主库宕机.后来重新更新dnindex.conf之 ...
- Php 中如何将内容写入log日志中
$Str = '你想要存的内容'; file_put_contents('abc.log', "\r\n\r\n". $Str, FILE_APPEND); FILE_AP ...
随机推荐
- CF685B Kay and Snowflake 贪心
CF685B Kay and Snowflake 链接 CF 题目大意 给你一颗树,询问子树的重心 思路 贪心? 重心肯定是向上走的,所以直接向上跳就好了. 不优秀的时候就不要跳了 ,因为以后也不能更 ...
- mui中confirm在苹果出现bug,confirm点击确定跳转页面再返回后,页面被遮罩盖住无法使用
项目中使用confirm mui.confirm('您还未抽奖,现在去抽奖吗?', function (res) { if (res.index === 1) { window.location.hr ...
- centos 7安装phantomjs
centos 7安装phantomjs wget https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-2.1.1-linux-x86_6 ...
- Discuz3.2与Java 项目整合单点登陆
JAVA WEB项目与Discuz 论坛整合的详细步骤完全版目前未有看到,最近遇到有人在问,想到这个整个不是一时半会也解释不清楚.便把整个整合过程以及后续碰到的问题解决方案写下,以供参考. 原理 Di ...
- 剑指offer 10:矩形覆盖
题目描述 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形.请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? public class Solution { public ...
- SAM宏观生态学空间分析帮助文档
宏观生态学分析软件帮助文档: 引言: 该软件是由布鲁塞尔..大学开发,目的是提供一个综合的空间分析计算平台,主要针对的是宏观生态学数据.该软件可以从网站...上自由获取,该软件的主要特征以及发表在20 ...
- Batchnorm
Internal Covariate Shift:每一次参数迭代更新后,上一层网络的输出数据经过这一层网络计算后,数据的分布会发生变化,为下一层网络的学习带来困难(神经网络本来就是要学习数据的分布,要 ...
- echarts常用方法,饼图切换圆环中文字(三)
在echarts的饼图应用时,遇到过一个需求就是鼠标移到半环上可以切换环中的文字,同时支持legend点击事件.误区是,鼠标移动到环上重新渲染option,以切换内部的文字.重新渲染option的做法 ...
- Spring的事务初见
一.事务的特性 原子性: 事务是最小的执行单位,不允许分割.事务的原子性确保动作要么全部完成,要么完全不起作用: 一致性: 执行事务前后,数据保持一致: 隔离性: 并发访问数据库时,一个用户的事物不被 ...
- 解决JNI native 线程不能正常退出的问题
本人刚涉足学习C++ 安卓 java,遇到这个棘手的问题,多谢博客园作者lknlfy 看了你的博客解决了这个问题,此文转发, 方便日后学习 以下内容转自lknlfy作者博客 传送门:http:// ...