Выполнение git-хуков при ошибках Windows

So,

Я написал простой git-hooks для предварительной отправки, который отлично работает на Linux или Mac, но не работает на Windows.

Сценарий: пытается сопоставить сообщение коммита с регулярным выражением и должен вернуть 0, если совпадает, или выйти.

Судя по статьям, которые я читал, говорят, что крючок должен просто работать.

Команда:

if [[ "$message" =~ "$regular_expression" ]]; 

Ошибка:

.git/hooks/pre-push: line 6: conditional binary operator expected
.git/hooks/pre-push: line 6: syntax error near `=~'
.git/hooks/pre-push: line 6: `  if [[ "$message" =~ "$regular_expression" ]]; then'

Так что, по-видимому, он не работает на "[[" и "]]".

Теперь я также попытался удалить двойные скобки и оставить только одну.

Команда:

if [ "$message" =~ "$regular_expression" ];

Ошибка:

.git/hooks/pre-push: line 6: [: =~: binary operator expected
This message is flawed: TRY-1 Sample

Кто-нибудь знает, как решить эту проблему?


person Jason    schedule 02.06.2015    source источник
comment
Какой тип скрипта? Баш? ша? zsh и т. д. похоже, что это не жалоба на вашу среду Windows. Какая у вас среда git? msysGit? git-скм?   -  person CodeWizard    schedule 02.06.2015
comment
Не могли бы вы начать свой сценарий с #!/bin/bash? (и посмотреть, сохраняется ли ошибка)   -  person VonC    schedule 02.06.2015
comment
Уже пробовал /bin/bash, но проблема с запуском в Windows   -  person Jason    schedule 02.06.2015


Ответы (1)


Конструкция =~ в условных выражениях bash не поддерживается в версии bash, поставляемой с Git для Windows. Похоже, что оператор =~ был введен в bash 3.0, но хотя Git для Windows использует bash 3.1, похоже, этот оператор отсутствует.

Возможно, $(echo $message | grep "$regexp") сработает как замена. например:

$ bash -c '[[ "hello" =~ "^h" ]]'
bash: -c: line 0: conditional binary operator expected
bash: -c: line 0: syntax error near `=~'
bash: -c: line 0: `[[ "hello" =~ "^h" ]]'

$ bash -c '[ $(echo hello | grep "^h") ] && echo matched || echo nomatch'
matched

Обновить

Вот пример скрипта, который работает, чтобы соответствовать чему-то подобному, используя Git для Windows bash:

#!/bin/bash
#
# grep returns 0 on matching something, 1 whn it fails to match
msg='TEST-111 Sample'
re='([A-Z]{2,8}-[0-9]{1,4}[[:space:]])+[A-Za-z0-9]+[[:space:]]*[A-Za-z0-9]+$'
rx='^([A-Z]{2,8}-[0-9]{1,4})[[:space:]][[:alnum:]]+$'

echo $msg | grep -qE "$rx"
[ $? = 0 ] && echo matched || echo nomatch

Этот скрипт возвращает совпадение с образцом фразы, используя второе регулярное выражение. Не совсем понятно, что исходное выражение пытается сопоставить - похоже на несколько слов, поэтому я не уверен, почему вы просто не сопоставляете .*$. Однако это показывает способ опробовать регулярное выражение. Примечание: мы используем расширенные регулярные выражения ([[:space:]]), поэтому нам нужно использовать grep -E. Также мы должны позаботиться о цитировании, так как $ используется в регулярном выражении.

person patthoyts    schedule 02.06.2015
comment
Вот тревожная часть: message="TEST-111 Sample" regex="([A-Z]{2,8}-[0-9]{1,4}[[:space:]])+[A-Za-z0-9]+[[:space:]]*[A-Za-z0-9]+$" bash -c '[ $(echo "$message" | grep "$regex") ] && echo matched || echo nomatch' возвращает несовпадение bash -c '[[ "$commit_message" =~ $regex ]] && echo matched || echo nomatch' возвращает совпадение - person Jason; 02.06.2015
comment
Я надеюсь, расширенный ответ, чтобы покрыть это. - person patthoyts; 02.06.2015
comment
Эй, @patthoyts, что, если сообщение изменится с TEST-111 Sample на TEST-111 Sample Order, запрошенный мной? Значение добавления нескольких слов. В этом случае [[:alnum:]]+ не работает. - person Jason; 08.06.2015
comment
Зависит от. Вам действительно нужно захватить это? Если вы просто сопоставляете строку, игнорируйте конечные части. В вашем вопросе никогда не говорилось много о том, что вы пытаетесь сделать, и о том, какой вклад вы можете внести. Я бы потерял окончательный [[:alnum:]]+$, если только вы действительно не заботитесь о том, что там, или если вы не соответствуете другому вводу только с передней частью регулярного выражения. - person patthoyts; 08.06.2015
comment
Кажется, я получил ответ: regex="^([A-Z]{2,8}-[0-9]{1,4}[[:space:]])+([[:alnum:]][[:space:]]*)+$" - person Jason; 08.06.2015