git pre-push вызывает ошибку сломанной трубы

У меня есть большой предварительный скрипт, который я поддерживаю для проверки кода, сборки, запуска регрессии и отправки по электронной почте набора примечаний к выпуску. Он работал какое-то время, но недавно были внесены некоторые изменения, и теперь, когда мы делаем git push, это приводит к ошибке «Broken pipe». Кажется, ни одно из моих изменений не делает ничего, что могло бы вызвать ошибку канала.

Я пробовал работать с GIT_TRACE и через strace, и мне не кажется очевидным, в чем проблема:

... Email Sent Successfully No errors! 
[{WIFEXITED(s) &&  WEXITSTATUS(s) == 0}], 0, NULL) = 125625
--- SIGCHLD (Child exited) @ 0 (0) 
--- write(4, "009c4a23dfcd66ae44d23435e45a2371"..., 156) = -1 EPIPE (Broken pipe)
--- SIGPIPE (Broken pipe) @ 0 (0)
--- +++ killed by SIGPIPE +++

person Jay Doobie    schedule 04.05.2018    source источник


Ответы (2)


Чтобы прочитать его стандартный ввод, который состоит из серии строк формы, описанной в gitooks.html" rel="nofollow noreferrer">документация по gitooks. То есть ввод может состоять из много строк, а не только из одной. Иногда это может быть всего одна строка, а иногда и больше.

Если ваш pre-push хук не может прочитать все стандартного ввода, а Git записывает много ввода, запись Git в уже закрытый канал приведет к ошибке EPIPE и сигналу SIGPIPE. Поскольку это происходит, вы, должно быть, не прочитали весь ввод. Чтобы исправить это, прочитайте остальную часть ввода.

person torek    schedule 04.05.2018
comment
Я добавил код для чтения STDIN, и он все равно не работает. Я прочитал STDIN в начале в конце скрипта gitook perl. Может быть проблема в том, что скрипт Perl, а не скрипт оболочки? РЕДАКТИРОВАТЬ: эти скрипты работали на прошлой неделе и внезапно остановились. Я не знаю, изменилось ли что-то еще в моем вычислительном ENV. Мы застряли на старой версии git (1.8.5.4) - person Jay Doobie; 04.05.2018
comment
Perl и оболочка не должны иметь значения (как и эта довольно древняя версия Git). Если вы можете показать свой код или упростить его до короткой версии, которая не показывает ничего проприетарного или конфиденциального, но все равно не работает (т. е. создать минимально воспроизводимый пример), который поможет в диагностике. - person torek; 04.05.2018
comment
Я не смог сократить его с помощью небольших фрагментов нашего кода, и я не могу его опубликовать из-за размера кода и его проприетарного характера. - person Jay Doobie; 04.05.2018
comment
Сама ошибка EPIPE требует, чтобы Git записал в конвейер некоторое минимальное количество байтов сверх того, что вы уже читаете, поэтому неудивительно, что сложно придумать меньший воспроизводитель. Я не очень много пишу на Perl, но я бы, вероятно, решил эту проблему, заставив сценарий Perl сначала прочитать все из stdin (например, в массив), извлечь интересующие строки и только потом выполнить любая работа с ними. (см., например, stackoverflow.com/a/10762305/1256452) - person torek; 04.05.2018
comment
Я думаю, что нашел проблему. Время ожидания SSH может истечь, пока я выполняю сборку/регрессию. Я заметил сообщение о закрытии соединения на удаленном хосте в середине регрессии. Мне нужно посмотреть, изменил ли мой хост что-то, что может быть причиной этого. - person Jay Doobie; 07.05.2018
comment
Это может быть связано. Если это так, вы можете попробовать установить ServerAliveInterval в файле .ssh/config. - person torek; 07.05.2018

Да, ответом действительно был таймер ServerAliveInterval. Сервер закрылся, и поэтому он не работал.

person Jay Doobie    schedule 23.01.2019