📜  每个用户的 git 行数 - Shell-Bash (1)

📅  最后修改于: 2023-12-03 14:55:55.753000             🧑  作者: Mango

每个用户的 git 行数 - Shell-Bash

简介

在一个多人协作的项目中,需要时常统计每个用户在 Git 仓库中的代码贡献情况,以便评估每个用户的工作量和工作质量。本文将介绍如何使用 Shell-Bash 脚本快速统计每个用户在 Git 仓库中的代码行数。

实现思路

Git 提供了 git log 命令,可以列出 Git 仓库中的提交日志。我们可以通过解析这些提交日志来计算每个用户在 Git 仓库中的代码行数。

具体实现思路如下:

  1. 使用 git log 命令列出 Git 仓库中的提交日志,并限制时间范围以减少计算量。

    git log --since=2021-01-01 --until=2022-01-01 --pretty="%H;%an;%ae;%ad;%s"
    

    上述命令将列出 2021 年 1 月 1 日至 2022 年 1 月 1 日之间的提交日志,并按照以下格式输出:

    commit_id;author_name;author_email;author_date;subject
    
  2. 使用 Bash 的循环和条件语句,遍历每个提交日志,解析出每个用户的代码行数,并保存到文件中。

    while read line; do
      commit_id=$(echo "$line" | cut -d";" -f1)
      author_name=$(echo "$line" | cut -d";" -f2)
      author_email=$(echo "$line" | cut -d";" -f3)
      author_date=$(echo "$line" | cut -d";" -f4)
      subject=$(echo "$line" | cut -d";" -f5)
    
      if [[ -n "$commit_id" ]]; then
        git diff --shortstat $commit_id $commit_id^ | grep -Eo '^[0-9]+' | paste -sd+ - | bc >> code_lines.txt
        echo "$author_name;$author_email;$author_date;$subject"
      fi
    done < <(git log --since=2021-01-01 --until=2022-01-01 --pretty="%H;%an;%ae;%ad;%s")
    

    上述代码将对每个提交日志执行 git diff 命令,计算出每个用户新增的代码行数和删除的代码行数,然后相加得到该用户在该提交中的代码行数。

    最后将计算出的代码行数保存到 code_lines.txt 文件中。

  3. 统计每个用户的总代码行数,并输出到控制台或文件中。

    awk 'BEGIN {FS=";"} { lines[$1]+=$2 } END {for (name in lines) {print name,lines[name]}}' code_lines.txt
    

    上述代码将使用 awk 命令统计每个用户的总代码行数,并将结果输出到控制台。

运行方式

将上述三个代码段复制到一个脚本文件中,然后执行该脚本即可。

#!/bin/bash

# 列出 Git 仓库中的提交日志
git log --since=2021-01-01 --until=2022-01-01 --pretty="%H;%an;%ae;%ad;%s" > commit_logs.txt

# 遍历每个提交日志,解析出每个用户的代码行数,并保存到文件中
while read line; do
  commit_id=$(echo "$line" | cut -d";" -f1)
  author_name=$(echo "$line" | cut -d";" -f2)
  author_email=$(echo "$line" | cut -d";" -f3)
  author_date=$(echo "$line" | cut -d";" -f4)
  subject=$(echo "$line" | cut -d";" -f5)

  if [[ -n "$commit_id" ]]; then
    git diff --shortstat $commit_id $commit_id^ | grep -Eo '^[0-9]+' | paste -sd+ - | bc >> code_lines.txt
    echo "$author_name;$author_email;$author_date;$subject"
  fi
done < commit_logs.txt

# 统计每个用户的总代码行数,并输出到控制台或文件中
awk 'BEGIN {FS=";"} { lines[$1]+=$2 } END {for (name in lines) {print name,lines[name]}}' code_lines.txt

使用以下命令执行脚本:

chmod +x git-lines.sh # 添加执行权限
./git-lines.sh # 执行脚本