Назад | Перейти на главную страницу

git post-receive hook выдает ошибку «команда не найдена», но, похоже, работает правильно и без ошибок при запуске вручную

У меня есть обработчик post-receive, который запускается в центральном репозитории git, настроенном с помощью gitolite, для запуска git pull на промежуточном сервере. Кажется, что он работает правильно, но при запуске выдает ошибку «команда не найдена». Я пытаюсь найти источник ошибки, но мне не повезло. Выполнение тех же команд вручную не приводит к ошибке.

Ошибка меняется в зависимости от того, что было сделано в коммите, который помещается в центральный репозиторий. Например, если «git rm» был зафиксирован и помещен в центральное репо, сообщение об ошибке будет «удаленно: крючки / пост-прием: строка 16: удалено: команда не найдена», и если «git add» был зафиксирован и помещен в в центральном репо сообщение об ошибке будет «удаленно: крючки / пост-прием: строка 16: слияние: команда не найдена». В любом случае запуск git pull на промежуточном сервере работает правильно, несмотря на сообщение об ошибке.

Вот сценарий пост-получения:

#!/bin/bash
#
# This script is triggered by a push to the local git repository.  It will
# ssh into a remote server and perform a git pull.
#
# The SSH_USER must be able to log into the remote server with a
# passphrase-less SSH key *AND* be able to do a git pull without a passphrase.
#
# The command to actually perform the pull request on the remost server comes
# from the ~/.ssh/authorized_keys file on the REMOTE_HOST and is triggered
# by the ssh login. 

SSH_USER="remoteuser"
REMOTE_HOST="staging.server.com"

`ssh $SSH_USER@$REMOTE_HOST` # This is line 16

echo "Done!"

Команда, выполняющая git pull на промежуточном сервере, находится в файле ~ / .ssh / authorized_keys пользователя ssh и выглядит так:

command="cd /var/www/staging_site; git pull",no-port-forwarding,no-X11-forwarding,no-agent-forwarding, ssh-rsa AAAAB3NzaC1yc2EAAAABIwAA... (the rest of the public key)

Это фактический результат удаления файла из моего локального репо, его фиксации локально и отправки его в центральное репозиторий git:

ben@tamarack:~/thejibe/testing/web$ git rm ./testing
rm 'testing'
ben@tamarack:~/thejibe/testing/web$ git commit -a -m "Remove testing file"
[master bb96e13] Remove testing file
1 files changed, 0 insertions(+), 5 deletions(-)
delete mode 100644 testing
ben@tamarack:~/thejibe/testing/web$ git push 
Counting objects: 3, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (2/2), 221 bytes, done.
Total 2 (delta 1), reused 0 (delta 0)
remote: From gitolite@thejibe.com:testing
remote:    aa72ad9..bb96e13  master     -> origin/master
remote: hooks/post-receive: line 16: Removed: command not found # The error msg
remote: Done!
To gitolite@thejibe.com:testing
aa72ad9..bb96e13  master -> master
ben@tamarack:~/thejibe/testing/web$

Как видите, сценарий пост-получения попадает в echo "Done!" строки, и когда я смотрю на промежуточный сервер, git pull был успешно запущен, но сообщение об ошибке не исчезло.

Мы будем очень благодарны за любые предложения о том, где искать источник сообщения об ошибке. У меня возникает соблазн перенаправить stderr на / dev / null, но я бы предпочел знать, в чем проблема.

Перехватчик может работать без установки PATH на что-то разумное. Вы пробовали использовать полный путь к ssh? В противном случае взгляните на переменные среды при запуске сценария. Вы можете использовать «экспорт», чтобы выгрузить их список, они, вероятно, не будут такими, как вы думаете.