📌  相关文章
📜  检查特定用户删除的添加的代码行 - Shell-Bash (1)

📅  最后修改于: 2023-12-03 15:40:35.587000             🧑  作者: Mango

检查特定用户删除的添加的代码行 - Shell-Bash

有时我们需要检查特定用户在代码中添加或删除了哪些代码行,以便进行代码审核和管理。本文介绍如何使用Shell-Bash脚本编写一个检查特定用户删除的添加的代码行的工具。

第一步:获取历史代码提交记录

可以使用Git命令获取代码仓库的历史提交记录。例如,使用以下命令获取最近50次提交记录:

git log -50 --pretty=format:'%h %s' --author=<username>

其中,--author=<username>用于指定特定用户。

第二步:解析提交记录

解析获取到的提交记录,可以使用以下命令:

git log -50 --pretty=format:'%h %s' --author=<username> | while read commit; do
    commit_hash=$(echo ${commit} | awk '{print $1}')
    commit_msg=$(echo ${commit} | awk '{$1=""; print $0}')
    echo "Commit: ${commit_hash} Message: ${commit_msg}"
done

其中,echo "Commit: ${commit_hash} Message: ${commit_msg}"将输出每次提交的提交哈希和提交信息,方便后续处理。

第三步:获取变更的代码行

针对每一次提交,可以使用以下命令获取变更和修改的代码行:

git diff-tree --no-commit-id --name-only -r ${commit_hash} | while read file; do
    git diff ${commit_hash}~1..${commit_hash} -- ${file} | grep -E "^[-+]" | grep -Ev "^(--- a|\\+\\+\\+ b)" | while read line; do
        git_diff=$(echo ${line} | awk '{print $1}')
        code_line=$(echo ${line} | awk '{$1=""; print $0}')
        echo "${commit_hash} ${file} ${git_diff} ${code_line}"
    done
done

其中,git diff-tree --no-commit-id --name-only -r ${commit_hash}用于获取变更过的文件列表,git diff ${commit_hash}~1..${commit_hash} -- ${file}获取本次提交的具体变化,grep -E "^[-+]"匹配被删除或添加的代码行,grep -Ev "^(--- a|\\+\\+\\+ b)"排除Git Diff输出的无用信息。

以上命令会输出每次变更和修改的代码行,并包括提交哈希、文件名、变更(删除或添加)类型以及代码行内容。

第四步:完整Shell脚本

将以上命令整合为一个完整的Shell脚本:

#!/bin/bash

#Usage: ./check_user_changes.sh <username> <count>

git log -${2} --author="${1}" --pretty=format:'%h %s' | while read commit; do
    commit_hash=$(echo ${commit} | awk '{print $1}')
    commit_msg=$(echo ${commit} | awk '{$1=""; print $0}')
    echo -e "\nCommit: ${commit_hash} Message: ${commit_msg}\n"
    git diff-tree --no-commit-id --name-only -r ${commit_hash} | while read file; do
        git diff ${commit_hash}~1..${commit_hash} -- ${file} | grep -E "^[-+]" | grep -Ev "^(--- a|\\+\\+\\+ b)" | while read line; do
            git_diff=$(echo ${line} | awk '{print $1}')
            code_line=$(echo ${line} | awk '{$1=""; print $0}')
            echo "${commit_hash} ${file} ${git_diff} ${code_line}"
        done
    done
done

可执行./check_user_changes.sh <username> <count>以检查特定用户最近<count>次提交中所做出的修改。

Markdown返回的代码片段
# 检查特定用户删除的添加的代码行 - Shell-Bash 

有时我们需要检查特定用户在代码中添加或删除了哪些代码行,以便进行代码审核和管理。本文介绍如何使用Shell-Bash脚本编写一个检查特定用户删除的添加的代码行的工具。

## 第一步:获取历史代码提交记录

可以使用Git命令获取代码仓库的历史提交记录。例如,使用以下命令获取最近50次提交记录:

```bash
git log -50 --pretty=format:'%h %s' --author=<username>

其中,--author=<username>用于指定特定用户。

第二步:解析提交记录

解析获取到的提交记录,可以使用以下命令:

git log -50 --pretty=format:'%h %s' --author=<username> | while read commit; do
    commit_hash=$(echo ${commit} | awk '{print $1}')
    commit_msg=$(echo ${commit} | awk '{$1=""; print $0}')
    echo "Commit: ${commit_hash} Message: ${commit_msg}"
done

其中,echo "Commit: ${commit_hash} Message: ${commit_msg}"将输出每次提交的提交哈希和提交信息,方便后续处理。

第三步:获取变更的代码行

针对每一次提交,可以使用以下命令获取变更和修改的代码行:

git diff-tree --no-commit-id --name-only -r ${commit_hash} | while read file; do
    git diff ${commit_hash}~1..${commit_hash} -- ${file} | grep -E "^[-+]" | grep -Ev "^(--- a|\\+\\+\\+ b)" | while read line; do
        git_diff=$(echo ${line} | awk '{print $1}')
        code_line=$(echo ${line} | awk '{$1=""; print $0}')
        echo "${commit_hash} ${file} ${git_diff} ${code_line}"
    done
done

其中,git diff-tree --no-commit-id --name-only -r ${commit_hash}用于获取变更过的文件列表,git diff ${commit_hash}~1..${commit_hash} -- ${file}获取本次提交的具体变化,grep -E "^[-+]"匹配被删除或添加的代码行,grep -Ev "^(--- a|\\+\\+\\+ b)"排除Git Diff输出的无用信息。

以上命令会输出每次变更和修改的代码行,并包括提交哈希、文件名、变更(删除或添加)类型以及代码行内容。

第四步:完整Shell脚本

将以上命令整合为一个完整的Shell脚本:

#!/bin/bash

#Usage: ./check_user_changes.sh <username> <count>

git log -${2} --author="${1}" --pretty=format:'%h %s' | while read commit; do
    commit_hash=$(echo ${commit} | awk '{print $1}')
    commit_msg=$(echo ${commit} | awk '{$1=""; print $0}')
    echo -e "\nCommit: ${commit_hash} Message: ${commit_msg}\n"
    git diff-tree --no-commit-id --name-only -r ${commit_hash} | while read file; do
        git diff ${commit_hash}~1..${commit_hash} -- ${file} | grep -E "^[-+]" | grep -Ev "^(--- a|\\+\\+\\+ b)" | while read line; do
            git_diff=$(echo ${line} | awk '{print $1}')
            code_line=$(echo ${line} | awk '{$1=""; print $0}')
            echo "${commit_hash} ${file} ${git_diff} ${code_line}"
        done
    done
done

可执行./check_user_changes.sh <username> <count>以检查特定用户最近<count>次提交中所做出的修改。