Как добавить GIT pre-push-хук, чтобы запретить использование макетной функциональности

#bash #git #hook

#bash #git #перехват

Вопрос:

Я хочу написать Git pre-push-хук, чтобы отменить нажатие [Mock] или [MockAttribute] в файлах с именем XXXController.cs в каталоге MyProj Controllers в моем репозитории в ветке разработки. Как это сделать на bash или любом другом языке? Спасибо.

Комментарии:

1. Похоже, это довольно легко сделать. Что вы уже пробовали?

2. Я понятия не имею, как использовать bash и использовать расширенные команды Git

Ответ №1:

Я не уверен pre-push , подходит ли для этого хук, поскольку pre-commit , вероятно, это лучший выбор, но вот простой хук, написанный на Bash, который просто проверяет наличие [Mock] или [MockAttribute] вхождение:

 #!/bin/bash

# read the input from git (local refs and remote refs are "ignored" by reading into the _ variable)
while read _ LOCAL_OID _ REMOTE_OID; do
    #echo "running the pre-push check for the range $REMOTE_OID..$LOCAL_OID" >amp;2
    # git-rev-list produces commit IDs only, so process each commit id line by line
    while read OID; do
        #echo "verifying $OID" >amp;2
        # figure out files changed in the commit identified by the OID variable
        while read STATUS FILE_PATH; do
            # and if it's either added or modified ...
            case "$STATUS" in
            A|M)
                #echo "checking $FILE_PATH" >amp;2
                # ... run the check (-q produces no output but sets exit code only)
                git show "$OID:$FILE_PATH" | grep -qP '[Mock(?:Attribute)?]'
                # if grep found anything, 0 is returned, so we consider the check failed
                if test $? == '0'; then
                    echo -e "e[31m$OID:$FILE_PATH does not pass the checke[0m" >amp;2
                    exit 1
                fi
                ;;
            *)
                #echo "ignoring $FILE_PATH" >amp;2
                ;;
            esac
        done < <(git diff-tree --no-commit-id --name-status -r "$OID")
    done < <(git rev-list --reverse "$REMOTE_OID..$LOCAL_OID")
done

exit 0
 

Конечно, использование grep не является надежным способом выполнения такой проверки, но, вероятно, есть более подходящие инструменты из .NET world делает это.

Комментарии:

1. Спасибо @fluffy. Я попробовал это, но возникла ошибка: Ошибка: не удается создать .git/ hooks/ pre-push: нет такого файла или каталога Ошибка: ошибка ожидания для .git/hooks/ pre-push: дочерних процессов нет

2. @Morteza Вы используете компьютер с Windows? Я только что погуглил несколько причин, по которым это может привести к сбою. Кроме того, как это работает, если вы замените хук простым скриптом только для эха, например #!/bin/bash , и echo 'all ok' ?

3. Да, у меня компьютер с Windows, но на моем компьютере установлен Git-Bash.

4. @Morteza Я больше не пользователь Windows, но, пожалуйста, погуглите Error: waitpid for .git/hooks/pre-push failed: No child processes , и это приведет к чему-то вроде superuser.com/questions/1465176 /… — возможно, некоторые из решений могут сработать, но сейчас ваш вопрос определенно не по теме.