如何在Git中自动检测给定类型的文件是否已更改?

时间:2014-09-10 12:26:21

标签: git

我的团队正在开发自动化测试,我们面临以下问题:当开发人员提交影响应用程序UI的更改时,自动化测试失败。

有没有办法,在Git中,只要特定文件类型(在我的情况下为.jsp)发生变化,我就会通过电子邮件收到通知?

请注意,此处设置电子邮件通知不是问题;我知道如何使用钩子。相反,问题是关于如何检测给定类型的文件(在我的情况下为.jsp)已经改变。有什么想法吗?

2 个答案:

答案 0 :(得分:2)

使用简单的post-receive挂钩会很容易,但它不是解决最终问题的好方法。

当开发人员提交对UI的更改时,他们还应该更新测试,以便它们在同一次提交中或至少在同一次提交中再次传递。这意味着测试应该与代码位于同一个存储库中。好吧,因为它们与用户界面的工作方式密切相关,所以应该这样做。

然后,只需使用持续集成(我习惯Jenkins;还有其他选项)和/或自动将更改部署到测试运行的测试环境(见例如Deploy a project using Git push)。


那就是说,你可以用钩子来做。

首先,要查看在您调用的修订*.jsp$old之间是否更改了任何$new个文件:

git diff --exit-code --quiet $old..$new -- '*.jsp'

如果以 false (非零)状态退出,则有些内容已更改(没有--quiet它会显示更改,--name-status会列出更改文件)。

所以现在你只需要输入像

这样的东西
while read old new ref
do
    if !git diff --exit-code --quiet $old..$new -- '*.jsp'
    then
        git diff --name-status $old $new | \
            mail -s "*.jsp files changed in $ref" \
                you@company.com
    fi
done

到您的存储库中的post-receive hook

或者您可以调整命令以防止开发人员将*.jsp文件直接推送到master(例如通过gitolite)以强制他们将此类更改推送到某个临时分支,其中自动化将由其他团队更新,然后由其他团队或指定的看门人整合。

答案 1 :(得分:0)

我终于创建了这个钩子,作为post-receive钩子:

for file in $(git show --pretty="format:" --name-only $1..$2 $3 | grep -i .jsp)
    do
       git diff $1..$2 -- $file | \
       mail -s "A '*.jsp' file has changed in the Repo" \
       sample1@israel.com,sample2@israel.com
    exit
done