统计git上传,修改,删除的代码行数
大约 1 分钟
提示
每个版本统计一下每个人的贡献
1. 命令行执行
#!/bin/bash
current_path="/d/code/pet-saas-all"
## 需要拉取的项目路径
project_pathArr=(
"project-a"
"project-b"
)
## 开始拉取
for ((i=0;i<${#project_pathArr[*]};i++))
do
project_path=${current_path}/${project_pathArr[i]}
cd $project_path
#git pull
git log --format='%aN' | sort -u | while read name; do echo -en "$name\t"; git log --author="$name" --pretty=tformat: --numstat | awk '{ add += $1; subs += $2; loc += $1 - $2 } END { printf "added lines: %s, removed lines: %s, total lines: %s\n", add, subs, loc }' -; done
done
2. 读取完成后分析
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.util.Map;
import java.util.Objects;
import java.util.function.Function;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
public class Test {
private static final Pattern PATTERN = Pattern.compile("^(.*)added lines: (-?\\d+), removed lines: (-?\\d+)+, total lines: (-?\\d+)$");
public static void main(String[] args) throws IOException {
File file = new File("src/main/resources/result.txt");
var map = Files.lines(file.toPath())
.map(Test::parse)
.filter(Objects::nonNull)
.collect(Collectors.toMap(Result::getName, Function.identity(), (result, result2) -> {
result2.setAddLine(result2.addLine + result.addLine);
result2.setRemoveLine(result2.removeLine + result.removeLine);
result2.setTotalLine(result2.totalLine + result.totalLine);
return result2;
}));
for (Map.Entry<String, Result> entry : map.entrySet()) {
System.out.println(entry.getKey() + ": 新增:" + entry.getValue().getAddLine() + "\t 删除:"+ entry.getValue().removeLine + "\t 总行数:"+entry.getValue().totalLine);
}
}
private static Result parse(String s) {
Matcher matcher = PATTERN.matcher(s);
if (!matcher.matches()){
return null;
}
String name = matcher.group(1);
String addLine = matcher.group(2);
String removeLine = matcher.group(3);
String totalLine = matcher.group(4);
return new Result(name.trim(), Integer.parseInt(addLine), Integer.parseInt(removeLine), Integer.parseInt(totalLine));
}
public static class Result {
String name;
int addLine;
int removeLine;
int totalLine;
public Result(String name, int addLine, int removeLine, int totalLine) {
this.name = name;
this.addLine = addLine;
this.removeLine = removeLine;
this.totalLine = totalLine;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAddLine() {
return addLine;
}
public void setAddLine(int addLine) {
this.addLine = addLine;
}
public int getRemoveLine() {
return removeLine;
}
public void setRemoveLine(int removeLine) {
this.removeLine = removeLine;
}
public int getTotalLine() {
return totalLine;
}
public void setTotalLine(int totalLine) {
this.totalLine = totalLine;
}
}
}