如何使用Git识别存储库的不同版本中的功能更改?

时间:2017-08-06 18:52:38

标签: ruby git bash github version-control

我有一堆包含大量C文件的存储库。给定两次提交的SHA哈希值,

<commit-sha-1><commit-sha-2>

我想写一个脚本(可能是bash / ruby​​ / python)来检测存储库中C文件中哪些函数在这两个提交中发生了变化。

我目前正在查看git loggit commitgit diff的文档。如果有人之前做过类似的事情,你能否给我一些关于从哪里开始或如何继续的建议。

2 个答案:

答案 0 :(得分:2)

这看起来不太好,但你可以将git与你的结合起来 最喜欢的标记系统,如GNU global来实现这一目标。对于 例如:

#!/usr/bin/env sh

global -f main.c | awk '{print $NF}'  | cut -d '(' -f1 | while read i
do
    if [ $(git log -L:"$i":main.c HEAD^..HEAD | wc -l) -gt 0 ]
    then
        printf "%s() changed\n" "$i"
    else
        printf "%s() did not change\n" "$i"
    fi
done

首先,您需要在项目中创建函数数据库:

$ gtags .

然后运行上面的脚本来查找main.c中的函数 自上次提交后修改。脚本当然可以更多 灵活,例如它可以处理由*.c报告的2次提交之间更改的所有git diff --stats个文件。

在脚本中,我们使用-L的{​​{1}}选项:

git log

答案 1 :(得分:0)

请参阅this question

Bash脚本:

#!/usr/bin/env bash

git diff | \
grep -E '^(@@)' | \
grep '(' | \
sed 's/@@.*@@//' | \
sed 's/(.*//' | \
sed 's/\*//' | \
awk '{print $NF}' | \
uniq

说明:

  

1:获得差异

     

2:只获取带有hunk标题的行;如果“可选”部分标题为&#39;存在一个Hunk头,它将是修改函数的函数定义

     

3:只选择包含开括号的hunk标题,因为它们将包含函数定义

     

4:摆脱&#39; @@ [old-file-range] [new-file-range] @@&#39;行中的部分

     

5:打开括号后摆脱一切

     

6:摆脱&#39; *&#39;来自指针

     

7:[见&#39; awk&#39;]:打印记录的最后一个字段(即:列)。()。

     

8:摆脱重复的名字。