统计Git版本库每个人提交次数和代码的增加和删除行数脚本
一、简单说明基于git log的输出统计;
按照月份统计,当然稍微改动也可以按照年月进行统计;
遍历所有的版本库,可以在统计的时候指定不同的分支。
二、脚本内容
脚本分为三部分部分,一部分为格式化输出,如下:
<ol style="margin:0 1px 0 0px;padding-left:40px;" start="1" class="dp-css"><li>#!/bin/bash</li><li># 按照cdc.txt 中定义的目录统计个项目的总提交次数、增加、删除、留存代码行数</li><li># 统计按照自然月进行或者指定时段进行 $1 为月份(1-12)</li><li>### 当前目录###</li><li>if [ $(echo $0 | grep '^/') ]; then</li><li>cur_dir=$(dirname $0)</li><li>else</li><li>cur_dir=$(pwd)/$(dirname $0)</li><li>fi</li><li></li><li>### 定义使用文件###</li><li>repo_file=$cur_dir/cdc.txt #定义版本库目录文件</li><li>everyone_file=$cur_dir/every.txt</li><li>goluk_file=$cur_dir/goluk.csv</li><li>### 接收月份参数###</li><li>Month=$1</li><li>:>$goluk_file</li><li>while read name project_dir</li><li>do</li><li></li><li>echo $name |awk '{printf "%-20s%1s%10s%1s%10s%1s%10s%1s%10s\n",$1, \</li><li>"," , "提交次数" , "," , "增加代码" , "," , "减少代码" , "," , "留存代码"}' >> $goluk_file</li><li>everyone_file=$cur_dir/$project_dir/every.txt</li><li>### 汇总计算各人的代码行数</li><li>### 删除空行</li><li>awk '!/^$/' $everyone_file |\</li><li>### 计算</li><li>awk '{if($1 ~ /^[a-zA-Z]+$/) {if(NR==1){printf "%20s",$1 }else {printf "\n%20s%8d%8d",$1,adds,dels;adds=0;dels=0}} \</li><li>else{adds=adds+$1;dels=dels+$2;next} }' |\</li><li>### 汇总</li><li>awk '{cnt[$1]++;name[$1]=$1;adds[$1]+=$2;dels[$1]+=$3}END{for(i in name) printf "%-20s%1s%10d%1s%10d%1s%10d%1s%10d\n",\</li><li>name[i],",",cnt[i],",",adds[i],",",dels[i],",",adds[i]-dels[i]}' >> $goluk_file</li><li>done < $repo_file</li></ol>一部分为实际统计计算部分,代码如下:
<ol style="margin:0 1px 0 0px;padding-left:40px;" start="1" class="dp-css"><li>#!/bin/bash</li><li># 统计后台的总的提交次数、增加、删除、留存代码行数</li><li># 统计按照自然月进行或者指定时段进行 $1 为月份(1-12)</li><li>#### 定义分支 ####</li><li>if [ $2 = "" ] ; then</li><li>Branch=develop</li><li>else</li><li>Branch=$2</li><li>fi</li><li>#### 定义版本库 ####</li><li>#git_repo=cdc.txt</li><li>### 当前目录###</li><li>if [ $(echo $0 | grep '^/') ]; then</li><li>cur_dir=$(dirname $0)</li><li>else</li><li>cur_dir=$(pwd)/$(dirname $0)</li><li>fi</li><li></li><li>### 定义使用文件###</li><li>repo_file=$cur_dir/cdc.txt #版本库定义</li><li>commit_file=$cur_dir/commit.txt #提交次数明细</li><li>total_file=$cur_dir/total.txt #每人提交次数汇总</li><li>detail_file=$cur_dir/detail.txt #每人提交行数明细</li><li>everyone_file=$cur_dir/every.txt</li><li>### 接收月份参数###</li><li>Month=$1</li><li>### 初始化中间文件###</li><li>:>$commit_file</li><li>:>$detail_file</li><li>:>$everyone_file</li><li></li><li>### 首先统计每个人的提交次数,记录到中间文件</li><li>function Count() {</li><li>while read git_url</li><li>do</li><li>echo $git_url</li><li>goluk_repo=`echo $git_url |awk -F/ '{print $NF}'`</li><li>cd $goluk_repo</li><li>git checkout $Branch</li><li>git pull</li><li>git log --pretty='%aN' --since ==2016-$Month-01 --until=2016-$Month-31 | sort | uniq -c | sort -k1 -n -r >> $commit_file</li><li>cd ../</li><li>done < $repo_file</li><li>}</li><li>### 代码提交行数</li><li>function Codelines() {</li><li>while read git_url</li><li>do</li><li>echo $git_url</li><li>goluk_repo=`echo $git_url |awk -F/ '{print $NF}'`</li><li>cd $goluk_repo</li><li>git pull</li><li>git checkout $Branch</li><li># 统计各版本总行数</li><li>git log --author=^.* --pretty=tformat: --numstat --since=2016-$Month-01 --until=2016-$Month-31 |\</li><li>awk '{ add += $1 ; subs += $2 ; loc += $1 - $2 } \</li><li>END { print add,subs,loc ,repo_name }' repo_name=$goluk_repo - >> $detail_file</li><li>### debug begin</li><li>###git log --author=^.* --pretty=tformat:%aN --numstat --since=2016-$Month-01 --until=2016-$Month-31 |\</li><li>### awk '!/^$/' >> $cur_dir/every2.txt</li><li>## debug end</li><li># 记录各人代码、增加行数、删除行数明细</li><li>git log --pretty='tformat:%aN' --numstat --since=2016-$Month-01 --until=2016-$Month-31 >>$everyone_file</li><li>cd ../</li><li>done < $repo_file</li><li>}</li><li>#awk '{sum[$2]+=$1}END{for(i in sum)print i ,sum[i]}' scrope.txt |sort -k2 -nr ></li><li>Count $Month</li><li>### 计算总提交次数</li><li>awk '{sum[$2]+=$1}END{for(i in sum)print i ,sum[i]}' $commit_file |sort -k2 -nr > $total_file</li><li>Codelines $Month</li><li>### 汇总提交数</li><li>awk '{cnt+=$2}END{printf "%-20d%10d\n",Mon,cnt}' Mon=$Month $total_file</li><li>### 汇总代码行数</li><li>#awk '{adds+=$1;removes+=$2;saves+=$3}END{print adds,removes,saves}' $detail_file</li><li>### 汇总计算各人的代码行数</li><li>### 删除空行</li><li>awk '!/^$/' $everyone_file |\</li><li>### 计算</li><li>awk '{if($1 ~ /^[a-zA-Z]+$/) {if(NR==1){printf "%20s",$1 }else {printf "\n%20s%8d%8d",$1,adds,dels;adds=0;dels=0}} \</li><li>else{adds=adds+$1;dels=dels+$2;next} }' |\</li><li>### 汇总</li><li>awk '{cnt[$1]++;name[$1]=$1;adds[$1]+=$2;dels[$1]+=$3}END{for(i in name) printf "%-20s%10d%10d%10d%10d\n", name[i],cnt[i],adds[i],dels[i],adds[i]-dels[i]}'</li></ol>最后一部分脚本,是首次git clone版本库用的
<ol style="margin:0 1px 0 0px;padding-left:40px;" start="1" class="dp-css"><li>#!/bin/bash</li><li></li><li>#### 定义分支 ####</li><li>Branch=release</li><li>#### 定义版本库 ####</li><li>git_repo=cdc.txt</li><li>while read repo</li><li>do</li><li>git clone $repo</li><li>done < $git_repo</li></ol>
三、使用注意事项
1、三部分独立成三个脚本文件比较好
2、统计机器必须要有所有版本库的读权限,否则没法clone。
3、版本库定义文件格式,文件末尾不能留空行
<ol style="margin:0 1px 0 0px;padding-left:40px;" start="1" class="dp-css"><li>git@1.1.1.1:users/p1/cdc/authority</li><li>git@1.1.1.1:users/p2/cdc/business</li></ol>
4、关于多项目的统计目录结构
<ol style="margin:0 1px 0 0px;padding-left:40px;" start="1" class="dp-css"><li>.<br /></li><li><br /></li><li>├── GetStat.sh #第一部分脚本<br /></li><li>├── android #项目目录<br /></li><li>│ ├── GetAllByMon.sh #第二部分脚本<br /></li><li>│ ├── cdc.txt #本项目源码的git地址<br /></li><li>│ ├── commit.txt<br /></li><li>│ ├── detail.txt<br /></li><li>│ ├── every.txt<br /></li><li>│ ├── total.txt<br /></li><li>│ └── workspace-goluk #项目源码<br /></li><li><br /></li><li>├── cdc.txt # 项目名称和目录文件,以空格分隔<br /></li><li><br /></li><li>├── firmware #结构同上目录<br /></li><li>│ ├── GetAllByMon.sh<br /></li><li>│ ├── Getrepo.sh<br /></li><li>│ ├── cdc.txt<br /></li><li>│ ├── commit.txt<br /></li><li>│ ├── detail.txt<br /></li><li>│ ├── every.txt<br /></li><li>│ ├── goluk_src<br /></li><li>│ ├── s2l_linux_sdk<br /></li><li>│ └── total.txt</li></ol>

要保护应用免受与会话相关的XSS攻击,需采取以下措施:1.设置HttpOnly和Secure标志保护会话cookie。2.对所有用户输入进行输出编码。3.实施内容安全策略(CSP)限制脚本来源。通过这些策略,可以有效防护会话相关的XSS攻击,确保用户数据安全。

优化PHP会话性能的方法包括:1.延迟会话启动,2.使用数据库存储会话,3.压缩会话数据,4.管理会话生命周期,5.实现会话共享。这些策略能显着提升应用在高并发环境下的效率。

thesession.gc_maxlifetimesettinginphpdeterminesthelifespanofsessiondata,setInSeconds.1)它'sconfiguredinphp.iniorviaini_set().2)abalanceIsiseededeedeedeedeedeedeedto to to avoidperformance andununununununexpectedLogOgouts.3)

在PHP中,可以使用session_name()函数配置会话名称。具体步骤如下:1.使用session_name()函数设置会话名称,例如session_name("my_session")。2.在设置会话名称后,调用session_start()启动会话。配置会话名称可以避免多应用间的会话数据冲突,并增强安全性,但需注意会话名称的唯一性、安全性、长度和设置时机。

会话ID应在登录时、敏感操作前和每30分钟定期重新生成。1.登录时重新生成会话ID可防会话固定攻击。2.敏感操作前重新生成提高安全性。3.定期重新生成降低长期利用风险,但需权衡用户体验。

在PHP中设置会话cookie参数可以通过session_set_cookie_params()函数实现。1)使用该函数设置参数,如过期时间、路径、域名、安全标志等;2)调用session_start()使参数生效;3)根据需求动态调整参数,如用户登录状态;4)注意设置secure和httponly标志以提升安全性。

在PHP中使用会话的主要目的是维护用户在不同页面之间的状态。1)会话通过session_start()函数启动,创建唯一会话ID并存储在用户cookie中。2)会话数据保存在服务器上,允许在不同请求间传递数据,如登录状态和购物车内容。

如何在子域名间共享会话?通过设置通用域名的会话cookie实现。1.在服务器端设置会话cookie的域为.example.com。2.选择合适的会话存储方式,如内存、数据库或分布式缓存。3.通过cookie传递会话ID,服务器根据ID检索和更新会话数据。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

禅工作室 13.0.1
功能强大的PHP集成开发环境

DVWA
Damn Vulnerable Web App (DVWA) 是一个PHP/MySQL的Web应用程序,非常容易受到攻击。它的主要目标是成为安全专业人员在合法环境中测试自己的技能和工具的辅助工具,帮助Web开发人员更好地理解保护Web应用程序的过程,并帮助教师/学生在课堂环境中教授/学习Web应用程序安全。DVWA的目标是通过简单直接的界面练习一些最常见的Web漏洞,难度各不相同。请注意,该软件中

mPDF
mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),

SublimeText3 英文版
推荐:为Win版本,支持代码提示!

SublimeText3汉化版
中文版,非常好用