#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 /… — возможно, некоторые из решений могут сработать, но сейчас ваш вопрос определенно не по теме.