一:命令行方式
获取最近提交的一次时间
git show --pretty=format:"%ci %cr" | head -1
git show --pretty=format:"%ci" | head -1|awk '{print $1}'
#2个时间比对
#!/bin/bash
date1="2008-4-09 12:00:00"
date2="2008-4-10 15:00:00"
date3="Aug 17 16:47:53 2011"
t1=`date -d "$date1" +%s`
t2=`date -d "$date2" +%s`
t3= date -d "$date3" +%s
if [ $t1 > $t2 ]; then
echo "$date1 > $date2"
elif [ $t1 = $t2 ]; then
echo "$date1 == $date2"
else [$t1 < $t3]; then
echo $date1 < $date3"
fi
git log // 普通查日志
git log --oneline // 简化输出
git log --pretty=oneline -3 // 指定输出行数
git shortlog // 输出汇总信息,以作者进行分类
git shortlog -s // 统计每个作者的commit数量
git shortlog -n // 用来对统计的量进行倒序排列
git log --author [authorname]// 用来过滤commit,限定输出给定的用户
开始结束时间
git shortlog -s --since="2020-01-08" --until="2020-01-13" "HEAD"
二:gitstats统计功能
#centos 操作系统
1.文件下载
https://github.com/hoxu/gitstats
2.安装依赖
#Gnuplot是一个命令行的交互式绘图工具
yum install gnuplot
3.解压文件
unzip gitstats-master.zip
cp gitstats /usr/local/bin
4.创建目录
cd code_stats
5.拉取源码
git clone http://192.168.102.84:10080/devops/jenkins.git
6.创建结果目录
mkdir jenkins_report
7.执行分析
#源码库,结果目录
gitstats jenkins jenkins_report
8.拷贝css文件,页面友好
cp /data/gitstats/gitstats-master/arrow-* .
cp /data/gitstats/gitstats-master/gitstats.css .
cp /data/gitstats/gitstats-master/sortable.js .
9.执行web展示
python -m SimpleHTTPServer
10.UI访问
http://192.168.10.14:8000/
11.指定时间段
gitstats -c start_date=2023-03-20 meta-codes/dev/umi-mo meta-reports/dev/umi-mo
12.复制前端展示页面
mkdir meta-codes/dev meta-reports/dev
mkdir /usr/share/gitstats
/bin/cp -f gitstats-master/{gitstats.css,sortable.js,arrow-up.gif,arrow-down.gif,arrow-none.gif} /usr/share/gitstats
目录结构
tree -L 3 gitstats
13.web访问
http://192.168.102.222:8000/dev/
#计划任务
crontab格式的说明
#add by mengsy 2023.03.24
2 3 * * 0 cd /data/gitstats; /bin/bash genReport.sh weekly >>/dev/null 2 >&1
#命令
./gitstats -c start_date=2023-03-10 -c end_date=2023-03-23 meta-codes/dev/umi-mo meta-reports/dev/umi-mo
[root@jenkins-master gitstats]# gitstats -c start_date=2023-03-10 meta-codes/dev/umi-mo meta-reports/dev/umi-mo
[0.01286] >> gnuplot --version
Output path: /home/data/gitstats/meta-reports/dev/umi-mo
Loading cache...
Git path: meta-codes/dev/umi-mo
Collecting data...
[0.00714] >> git shortlog -s --since="2023-03-10" "HEAD" | wc -l
[0.00566] >> git show-ref --tags
[0.00711] >> git rev-list --pretty=format:"%at %ai %aN <%aE>" --since="2023-03-10" "HEAD" | grep -v ^commit
[0.00737] >> git rev-list --pretty=format:"%at %T" --since="2023-03-10" "HEAD" | grep -v ^commit
[0.00902] >> git ls-tree -r -l -z HEAD
[0.01839] >> git log --shortstat --first-parent -m --pretty=format:"%at %aN" --since="2023-03-10" "HEAD"
[0.01758] >> git log --shortstat --date-order --pretty=format:"%at %aN" --since="2023-03-10" "HEAD"
Refining data...
Saving cache...
Generating report...
Warning: "gitstats.css" not found, so not copied (searched: ['/usr/local/bin', '/usr/local/bin/../share/gitstats', '/usr/share/gitstats'])
Warning: "sortable.js" not found, so not copied (searched: ['/usr/local/bin', '/usr/local/bin/../share/gitstats', '/usr/share/gitstats'])
Warning: "arrow-up.gif" not found, so not copied (searched: ['/usr/local/bin', '/usr/local/bin/../share/gitstats', '/usr/share/gitstats'])
Warning: "arrow-down.gif" not found, so not copied (searched: ['/usr/local/bin', '/usr/local/bin/../share/gitstats', '/usr/share/gitstats'])
Warning: "arrow-none.gif" not found, so not copied (searched: ['/usr/local/bin', '/usr/local/bin/../share/gitstats', '/usr/share/gitstats'])
>> git --git-dir=/usr/local/bin/.git --work-tree=/usr/local/bin rev-parse --short HEADfatal: Not a git repository: '/usr/local/bin/.git'
[0.00609] >> git --git-dir=/usr/local/bin/.git --work-tree=/usr/local/bin rev-parse --short HEAD
[0.00599] >> git --version
[0.01396] >> gnuplot --version
Generating graphs...
[0.02418] >> gnuplot "/home/data/gitstats/meta-reports/dev/umi-mo/hour_of_day.plot"
[0.02561] >> gnuplot "/home/data/gitstats/meta-reports/dev/umi-mo/day_of_week.plot"
[0.02435] >> gnuplot "/home/data/gitstats/meta-reports/dev/umi-mo/domains.plot"
[0.02639] >> gnuplot "/home/data/gitstats/meta-reports/dev/umi-mo/month_of_year.plot"
[0.02603] >> gnuplot "/home/data/gitstats/meta-reports/dev/umi-mo/commits_by_year_month.plot"
[0.02424] >> gnuplot "/home/data/gitstats/meta-reports/dev/umi-mo/commits_by_year.plot"
[0.02722] >> gnuplot "/home/data/gitstats/meta-reports/dev/umi-mo/files_by_date.plot"
[0.02744] >> gnuplot "/home/data/gitstats/meta-reports/dev/umi-mo/lines_of_code.plot"
[0.03248] >> gnuplot "/home/data/gitstats/meta-reports/dev/umi-mo/lines_of_code_by_author.plot"
[0.03264] >> gnuplot "/home/data/gitstats/meta-reports/dev/umi-mo/commits_by_author.plot"
Execution time 0.66406 secs, 0.38175 secs (57.49 %) in external commands)
You may now run:
sensible-browser '/home/data/gitstats/meta-reports/dev/umi-mo/index.html'
三:命令工具
genreport.sh
#!/bin/bash
if [ $# -lt 2 ]
then
echo "Useage: `basename $0` start_date end_date"
echo "eg: `basename $0` 2023-02-01 2023-03-24"
#exit 1
sleep 1
#default date
echo "[Default] startDate: 2022-08-01 endDate: 2023-12-30"
#weekly
if [ x$1 == x"weekly" ]
then
startDate="`date -d "7 days ago" +%Y-%m-%d`"
endDate="`date +%Y-%m-%d`"
dirDate=${startDate}-${endDate}
else
startDate="2022-08-01"
endDate="2023-12-30"
dirDate="all"
fi
else
startDate=$1
endDate=$2
dirDate=${startDate}-${endDate}
fi
#exit 1
git_pro_report_list=""
function compDate()
{
t1=`date -d "$1" +%s`
t2=`date -d "$2" +%s`
if [ $t1 -lt $t2 ]
then
echo "1"
else
echo "0"
fi
}
#git_url
gitURL="http://mengsy:Meng%[email protected]:10080/meta"
#date
#startDate=$1
#endDate=$2
#code patch
codePath="/data/gitstats/meta-codes/dev"
reportPath="/data/gitstats/meta-reports/dev"
#project_list
front_project_list="umi-mo home-web"
back_project_list="umi-user umi-uaa umi-sentinel-dashboard umi-oss umi-gateway umi-company umi-admin"
#bigdata
bigdata_pro_list="umi-tags"
#game
game_pro_list="game-logic-reward-points game-logic-relation game-logic-hall game-external game-chat game-broker"
#u3d
u3d_pro_list="client"
#branch
branch_dev="dev"
branch_develop="develop"
branch_v5="v0.5.0"
branch_v5_pub="v0.5.0_publish"
#git
#gitstats-date -c start_date=2023-03-10 -c end_date=2023-03-23 meta-codes/dev/umi-mo meta-reports/dev/umi-mo
########################
#update code
cd ${codePath}
#font project
for i in `echo ${front_project_list}`
do
echo $i
if [ ! -d ${i} ]
then
git clone -b ${branch_dev} ${gitURL}/meta-front/${i}.git
else
cd ${i}
git pull ${gitURL}/meta-front/${i}.git
#last commit date
last_commit_date=`git show --pretty=format:"%ci" | head -1|awk '{print $1}'`
echo "last_commit_date: ${last_commit_date}"
#compare date
return_code=`compDate ${startDate} ${last_commit_date}`
if [ "$return_code" == "1" ]
then
git_pro_report_list+=" $i"
gitstats-date -c start_date=${startDate} -c end_date=${endDate} ${codePath}/${i} ${reportPath}/${i}/${dirDate}
fi
fi
cd ${codePath}
done
#echo ${git_pro_report_list}
exit 1
#back project
for i in `echo ${back_project_list}`
do
echo $i
if [ ! -d ${i} ]
then
git clone -b ${branch_develop} ${gitURL}/meta-java/${i}.git
else
cd ${i}
git pull ${gitURL}/meta-java/${i}.git
#last commit date
last_commit_date=`git show --pretty=format:"%ci" | head -1|awk '{print $1}'`
echo "last_commit_date: ${last_commit_date}"
#compare date
return_code=`compDate ${startDate} ${last_commit_date}`
if [ "$return_code" == "1" ]
then
git_pro_report_list+=" $i"
gitstats-date -c start_date=${startDate} -c end_date=${endDate} ${codePath}/${i} ${reportPath}/${i}/${dirDate}
fi
fi
cd ${codePath}
done
#bigdata project
for i in `echo ${bigdata_pro_list}`
do
echo $i
if [ ! -d ${i} ]
then
git clone -b ${branch_develop} ${gitURL}/meta-bigdata/tags-backend/${i}.git
else
cd ${i}
git pull ${gitURL}/meta-bigdata/tags-backend/${i}.git
#last commit date
last_commit_date=`git show --pretty=format:"%ci" | head -1|awk '{print $1}'`
echo "last_commit_date: ${last_commit_date}"
#compare date
return_code=`compDate ${startDate} ${last_commit_date}`
if [ "$return_code" == "1" ]
then
git_pro_report_list+=" $i"
gitstats-date -c start_date=${startDate} -c end_date=${endDate} ${codePath}/${i} ${reportPath}/${i}/${dirDate}
fi
fi
cd ${codePath}
done
#game project
for i in `echo ${game_pro_list}`
do
echo $i
if [ ! -d ${i} ]
then
git clone -b ${branch_develop} ${gitURL}/meta-game-server/${i}.git
else
cd ${i}
git pull ${gitURL}/meta-game-server/${i}.git
#last commit date
last_commit_date=`git show --pretty=format:"%ci" | head -1|awk '{print $1}'`
echo "last_commit_date: ${last_commit_date}"
#compare date
return_code=`compDate ${startDate} ${last_commit_date}`
if [ "$return_code" == "1" ]
then
git_pro_report_list+=" $i"
gitstats-date -c start_date=${startDate} -c end_date=${endDate} ${codePath}/${i} ${reportPath}/${i}/${dirDate}
fi
fi
cd ${codePath}
done
#u3d project
for i in `echo ${u3d_pro_list}`
do
echo $i
if [ ! -d ${i} ]
then
git clone -b ${branch_v5} ${gitURL}/meta-app/${i}.git
else
cd ${i}
# git pull ${gitURL}/meta-app/${i}.git
#last commit date
last_commit_date=`git show --pretty=format:"%ci" | head -1|awk '{print $1}'`
echo "last_commit_date: ${last_commit_date}"
#compare date
return_code=`compDate ${startDate} ${last_commit_date}`
if [ "$return_code" == "1" ]
then
git_pro_report_list+=" $i"
gitstats-date -c start_date=${startDate} -c end_date=${endDate} ${codePath}/${i} ${reportPath}/${i}/${dirDate}
fi
fi
cd ${codePath}
done
#exit 1
##############update report
#update report
#for i in `echo ${git_pro_report_list}`
#for i in home-web
#do
# echo $i
#mkdir -p ${reportPath}/${dirDate}
# gitstats-date -c start_date=${startDate} -c end_date=${endDate} ${codePath}/${i} ${reportPath}/${i}/${dirDate}
#done
echo ${startDate} ${endDate}
echo ${git_pro_report_list}
##############
四:gitstat java开源库
1.jdk部署
rpm -ivh jdk-8u71-linux-x64.rpm
2.配置/etc/profile
#set java environment
JAVA_HOME=/usr/java/jdk1.8.0_71
JAVA_BIN=/usr/java/jdk1.8.0_71/bin
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
PATH=$JAVA_BIN:$PATH
export PATH JAVA_HOME CLASSPATH
3.下载源文件
statgit.war
4.下载apache tomcat
https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.73/bin/apache-tomcat-9.0.73.tar.gz
5.配置tomcat
tar zxvf apache-tomcat-9.0.73.tar.gz
cd /data/monitor/apache-tomcat-9.0.73/webapps/ROOT
把 statgit.war 文件放到 ROOT目录下
cd /data/monitor/apache-tomcat-9.0.73/conf
配置 server.xml
<Connector port="8080" address="192.168.10.13" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
b.配置war包路径
在<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> </host>中增加
<Context path="/gitstat" docBase="/data/monitor/apache-tomcat-9.0.73/webapps/ROOT/statgit.war" reloadable="true"></Context>
其中:path="/gitstat" 为URL需要访问的入口
6.启停服务配置
cd /data/monitor/apache-tomcat-9.0.73/bin
#启动
sh startup.sh
#停止
sh shutdown.sh
7.web访问
http://192.168.10.13:8080/gitstat/stat/gitstat.html
8.使用
支持多种时间格式
代码库配置:
需要在服务器存在库,如需要则使用不同分支
#clone 文件,如有需要则要定期更新代码
cd /data/git_code
git clone -b dev http://mengsy:Meng%[email protected]:10080/meta/meta-java/umi-user.git
git clone -b develop http://mengsy:Meng%[email protected]:10080/meta/meta-java/umi-user.git