git统计代码量

记录一下
这个脚本应用场景是读取某个文件夹下所有git仓库的log,然后根据author 和 开始结束日期计算代码量(已在MacOS13.0验证)

#!/bin/bash
# author: zhangsan
# desc: 统计代码量

repository="/Users/xxx/Desktop/workspace/Apple/Migu_lib"

# 定义ANSI转义码
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
CYAN='\033[0;36m'
NC='\033[0m' # 重置颜色

author="zhangsan"

#入参传开始和结束时间 如2023-09-01 2023-09-30  不传则默认获取当月的代码统计
if [[ $# -eq 2 ]]; then

    # 获取日期的时间戳
    timestamp1=$(date -j -f "%Y-%m-%d" "$1" "+%s")
    timestamp2=$(date -j -f "%Y-%m-%d" "$2" "+%s")

    if [[ $timestamp1 -lt $timestamp2 ]]; then
        #"$1 在 $2 之前"
        start_date=$1
        end_date=$2
    elif [[ $timestamp1 -gt $timestamp2 ]]; then
        #"$1 在 $2 之后"
        start_date=$2
        end_date=$1
    else
        #$1 和 $2 相同 获取当月的
        start_date=$(date -j -v1d -v+1m -v-1d "+%Y-%m-01")
        end_date=$(date -j -v1d -v+1m -v-1d "+%Y-%m-%d")
    fi
    
else
    #不传日期则默认取当前月
    start_date=$(date -j -v1d -v+1m -v-1d "+%Y-%m-01")
    end_date=$(date -j -v1d -v+1m -v-1d "+%Y-%m-%d")
fi

# 搜索指定路径下的一级文件夹,存入列表
for folder in "$repository"/*; do
    if [[ -d "$folder" ]]; then
        list+=("$folder")
    fi
done

cd "$repository" || exit 1

read -p "是否忽略远端仓库日志(y/n):" input

for repo in "${list[@]}"; do
    cd "$repo" || exit 1
    
    if [ ! -d ".git" ]; then
        continue
    fi
    
    # 提取文件夹名字
    folder=$(basename "$repo")
    
    #同步提交记录 统计自己的代码一般不需要同步,除非你在别的电脑上提交过代码
    input=$(echo "$input" | tr '[:upper:]' '[:lower:]') # 将输入转换为小写字母

    #修改行数
    changed_lines=$(git log --all --branches --author="$author" --since="$start_date" --until="$end_date"  --pretty=tformat: --numstat | awk '{changed_lines+=$1+$2} END {print changed_lines}')
    #提交次数
    commits=$(git log --all --branches --author="$author" --since="$start_date" --until="$end_date"  --oneline | wc -l)
    
    #没改动的库不打印
    if [[ -z changed_lines ]] || [[ changed_lines -le 0 ]]; then
        cd - >/dev/null || exit 1
        continue
    fi
    
    #读取输入查询日志前是否需要pull
    if [[ "$input" == "y" || "$input" == "yes" || -z "$input" ]]; then
        echo ""
    elif [[ "$input" == "n" || "$input" == "no" ]]; then
        echo ""
        git pull >/dev/null
    else
        echo -e "\n${RED}输入y(yes)或者n(no) 白给这乱输入${NC}\n"
        exit 1
    fi
    
    # 删除所有空格
    commits=$(echo "$commits" | sed 's/ //g')
    
    git log --all --branches --author="$author" --since="$start_date" --until="$end_date" --pretty=tformat: --numstat | \
    awk -v commits="$commits" -v author="$author" -v folder="$folder" '
      BEGIN {
        added_lines = 0
        deleted_lines = 0
        modified_files = 0
      }
      NF == 3 {
        added_lines += $1
        deleted_lines += $2
        modified_files += 1
      }
      END {
        printf "代码仓库:\033[32m  %s \033[0m\n", folder
        printf "提交作者:\033[33m  %s \033[0m\n", author
        printf "新增行数:\033[32m  %d \033[0m\n", added_lines
        printf "删除行数:\033[31m  %d \033[0m\n", deleted_lines
        printf "改动行数:\033[33m  %d \033[0m\n", added_lines + deleted_lines
        printf "改动文件:\033[33m  %d \033[0m\n", modified_files
        printf "提交次数:\033[32m  %s \033[0m\n", commits
      }
    '
    
    #新增行
    additions=$(git log --all --branches --author="$author" --since="$start_date" --until="$end_date"  --pretty=tformat: --numstat | awk '{additions+=$1} END {print additions}')
    #删除行
    deletions=$(git log --all --branches --author="$author" --since="$start_date" --until="$end_date"  --pretty=tformat: --numstat | awk '{deletions+=$2} END {print deletions}')
    #修改文件
    changed_files=$(git log --all --branches --author="$author" --since="$start_date" --until="$end_date"  --pretty=tformat: --numstat | awk 'END {print NR}')
    
    #统计数据累加
    total_additions=$((total_additions + additions))
    total_commits=$((total_commits + commits))
    total_deletions=$((total_deletions + deletions))
    total_changed_lines=$((total_changed_lines + changed_lines))
    total_changed_files=$((total_changed_files + changed_files))
    
    cd - >/dev/null || exit 1
done


# 判断新增总代码行数是否大于1000
if [ $total_additions -gt 1000 ]; then
    echo -e "\n😂😂😂--------------------😂😂😂\n"
else
#需要补文档了老铁
    echo -e "\n😱😱😱--------------------😱😱😱\n"
fi

echo -e "${CYAN}总计:($start_date ~ $end_date) $NC"
echo -e "${YELLOW}提交作者: $author $NC"
echo -e "${GREEN}总新增行数: $total_additions $NC"
echo -e "${RED}总删除行数: $total_deletions $NC"
echo -e "${YELLOW}总改动行数: $total_changed_lines $NC"
echo -e "${YELLOW}总改动文件: $total_changed_files $NC"
echo -e "${GREEN}总提交次数: $total_commits $NC"



效果图如下:


xiaoguo.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,039评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,223评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,916评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,009评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,030评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,011评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,934评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,754评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,202评论 1 309
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,433评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,590评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,321评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,917评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,568评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,738评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,583评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,482评论 2 352

推荐阅读更多精彩内容

  • GIT统计代码量 Git统计个人提交代码行数 Git统计项目总行数 查看git上个人代码量(需要修改usernam...
    jeffrey_hjf阅读 11,375评论 0 4
  • Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理git任何或小或大的项目。 Git 是 Linus To...
    LeoLongl阅读 257评论 0 0
  • 参数:分支名:比如master,可选参数author:作者名,可选参数since:开始日期,可选参数until:截...
    xjkstar阅读 1,237评论 0 1
  • 概要 64学时 3.5学分 章节安排 电子商务网站概况 HTML5+CSS3 JavaScript Node 电子...
    阿啊阿吖丁阅读 9,180评论 0 3
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,651评论 18 139