【问题标题】:Git pre-commit hook to check for a string and exit code 1 if the string existsGit 预提交钩子检查字符串,如果字符串存在则退出代码 1
【发布时间】:2023-04-10 14:45:33
【问题描述】:

我正在尝试使预提交挂钩起作用,以检查暂存文件并读取差异以检查一些字符串。如果字符串存在,则提交必须失败。

#!/bin/bash
#import os

echo "Running pre-commit hook" 
checks=os.environ["APPSETTING_DEVPASSWORD"],os.environ["APPSETTING_DEVUSER"],os.environ["APPSETTING_DEVPASS_ELMAH"]



git diff --cached --name-status | while read x file; do

      if [ "$x" == 'D' ]; then continue; fi
    for word in $checks
    do
        if egrep $word $file ; then
            echo "ERROR: Disallowed expression \"${word}\" in file: ${file}"
            exit 1
        fi
    done
done || exit $? 

即使文件中存在字符串,它仍会提交文件。任何指导将不胜感激。我对 bash 还很陌生。

【问题讨论】:

    标签: bash git pre-commit-hook


    【解决方案1】:

    一定是这样的:

    #!/bin/bash
    
    echo "Running pre-commit hook" 
    checks=($APPSETTING_DEVPASSWORD $APPSETTING_DEVUSER $APPSETTING_DEVPASS_ELMAH) # create an array
    
    git diff --cached --name-status | while read flag file; do
        if [ "$flag" == 'D' ]; then continue; fi
    
        for word in ${checks[@]}
        do
            if egrep -q "$word" "$file"; then
                echo "ERROR: Disallowed expression \"${word}\" in file: ${file}" >&2
                exit 1
            fi
        done
    done
    

    【讨论】:

    • 我可以在服务器端添加相同的钩子来强制所有开发者机器吗?
    • 您不能对开发者主机强制使用pre-commit 挂钩,但您可以设置server-side hook 来停止推送。 pre-receiveupdate 钩子,我想。请注意——每个钩子都有一组不同的参数和标准输入数据,服务器端钩子通常无法访问文件(裸存储库),因此您需要使用 git grep 或从提交对象和树中提取文件到磁盘。
    猜你喜欢
    • 1970-01-01
    • 2013-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多