【工具】检测git提交内容

获取远程仓库的提交记录,并对每次提交记录中的文件变更进行静态分析,以发现潜在的代码质量问题。

相关文章

检测git提交内容


功能清单

  • 通过 simple-git 库获取远程仓库的提交记录。
  • 对每次提交记录中的文件变更进行静态分析,特别是针对 JavaScript 文件进行 ESLint 静态代码分析。
  • 输出每个提交记录中 JavaScript 文件的变更内容以及潜在的代码质量问题。

一、simple-git是什么

simple-git 是一个用于在 Node.js 环境下简化 Git 操作的库。它提供了一组易于使用的方法,用于执行 Git 命令并处理 Git 仓库的各种操作,如克隆、提交、拉取、推送、分支管理等。通过 simple-git,开发者可以在 Node.js 应用中方便地集成和操作 Git,从而实现自动化的版本控制和代码管理功能。

二、使用详细流程

1、初始化 simple-git 实例

1
2
3
4
5
6
7
8
9
10
11
const simpleGit = require('simple-git');

// 指定远程仓库和分支
const remoteRepoUrl = 'https://github.com/yourusername/your-repo.git';
const branchName = 'main';

// 创建 simple-git 实例
const git = simpleGit();

// 设置远程仓库 URL
git.addRemote('origin', remoteRepoUrl);

2、获取远程仓库的提交记录

1
2
3
4
5
6
7
8
9
// 获取远程仓库的提交记录,并处理
git.log((err, log) => {
if (err) {
console.error('获取提交记录时出错:', err);
return;
}
console.log('提交记录:', log);
processLogs(log); // 处理提交记录
});

3、分析提交记录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// 定义函数:处理提交记录
function processLogs(log) {
log.all.forEach(commit => {
printCommitInfo(commit);
getAndPrintFileChanges(commit);
});
}

// 打印提交信息
function printCommitInfo(commit) {
console.log(`提交ID: ${commit.hash}`);
console.log(`提交信息: ${commit.message}`);
}

// 获取并打印文件变更信息
function getAndPrintFileChanges(commit) {
git.diffSummary(commit.hash, (err, summary) => {
if (err) {
console.error('获取文件变更摘要信息时出错:', err);
return;
}
console.log('文件变更摘要信息:', summary);

analyzeCommitChanges(commit.hash, summary.files);
});
}

4、获取并分析提交的变更内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
async function analyzeCommitChanges(commitHash, fileChanges) {
try {
// 对每个文件的变更内容进行分析
for (const fileChange of fileChanges) {
const { file } = fileChange;
if (file.endsWith('.js')) {
const diff = await getFileDiff(commitHash, file);
if (diff) {
console.log(`文件名: ${file}`);
console.log('变更内容:', diff);
const results = await analyzeJavaScriptCode(diff);
if (results) {
results.forEach(result => {
console.log(`- ${result.message} (${result.ruleId}) at line ${result.line}`);
});
}
}
}
}
} catch (error) {
console.error('静态分析变更内容时出错:', error);
}
}

// 获取文件的变更内容
async function getFileDiff(commitHash, file) {
return new Promise((resolve, reject) => {
git.diff([commitHash, file], (err, diff) => {
if (err) {
console.error('获取文件变更内容时出错:', err);
resolve(null);
} else {
resolve(diff);
}
});
});
}

5、对 JavaScript 代码进行静态分析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
const { ESLint } = require('eslint');

// 定义 ESLint 实例
const eslint = new ESLint();

async function analyzeJavaScriptCode(code) {
try {
const results = await eslint.lintText(code);
return results[0].messages;
} catch (error) {
console.error('静态分析 JavaScript 代码时出错:', error);
return null;
}
}

三、完整示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
const simpleGit = require('simple-git');
const { ESLint } = require('eslint');

// 创建 simple-git 实例
const git = simpleGit();

// 创建 ESLint 实例
const eslint = new ESLint();

// 获取并分析提交的变更内容
async function analyzeCommitChanges(commitHash, fileChanges) {
try {
// 对每个文件的变更内容进行分析
for (const fileChange of fileChanges) {
const { file } = fileChange;
// 仅对 JavaScript 文件进行静态分析
if (file.endsWith('.js')) {
// 获取文件的变更内容
const diff = await getFileDiff(commitHash, file);
if (diff) {
console.log(`文件名: ${file}`);
console.log('变更内容:', diff);
// 对 JavaScript 代码进行静态分析
const results = await analyzeJavaScriptCode(diff);
if (results) {
// 输出潜在问题
results.forEach(result => {
console.log(`- ${result.message} (${result.ruleId}) at line ${result.line}`);
});
}
}
}
}
} catch (error) {
console.error('静态分析变更内容时出错:', error);
}
}

// 获取文件的变更内容
async function getFileDiff(commitHash, file) {
return new Promise((resolve, reject) => {
git.diff([commitHash, file], (err, diff) => {
if (err) {
console.error('获取文件变更内容时出错:', err);
resolve(null);
} else {
resolve(diff);
}
});
});
}

// 对 JavaScript 代码进行静态分析
async function analyzeJavaScriptCode(code) {
try {
const results = await eslint.lintText(code);
return results[0].messages;
} catch (error) {
console.error('静态分析 JavaScript 代码时出错:', error);
return null;
}
}

// 获取远程仓库的提交记录,并处理
git.log((err, log) => {
if (err) {
console.error('获取提交记录时出错:', err);
return;
}
console.log('提交记录:', log);
// 遍历每次提交记录,并获取并分析文件的变更内容
log.all.forEach(commit => {
getAndAnalyzeFileChanges(commit);
});
});

// 获取并分析文件的变更内容
function getAndAnalyzeFileChanges(commit) {
git.diffSummary(commit.hash, (err, summary) => {
if (err) {
console.error('获取文件变更摘要信息时出错:', err);
return;
}
console.log('文件变更摘要信息:', summary);
// 分析文件的变更内容
analyzeCommitChanges(commit.hash, summary.files);
});
}

【工具】检测git提交内容
https://www.cccccl.com/20240201/工具/检测git提交内容/
作者
Jeffrey
发布于
2024年2月1日
许可协议