Почему git push production master меняет владельца HEAD, index, logs на root?
На VPS c Ubuntu есть bare git репозиторий. Создан нерутовым пользователем. И на момент инициализации все папки и файлы принадлежат неруту. Пуш выполняется через нерутового пользователя, авторизация по ssh ключу. Пуш проходит успешно, но последующие не удаются. Посмотрел, и выяснил, что после первого пуша у файлов HEAD и index, а также у папки logs владелец изменяется на root. Почему так происходит?
Lynn «Кофеман», Я в linux не силен. Но раз я авторизуюсь как nonroot, мне предполагалось, что и действия производятся от его имени. Но выходит что нет?
Lynn «Кофеман», ls -la сразу после git init --bare покажет, что все nonroot:nonroot
После первого пуша, станет так, как я описывал.
Хук post-receive у меня добавлен. Его содержимое такое
#!/bin/sh
sudo /sbin/deploy-city-helpers
Содержимое /sbin/deploy-city-helpers такое
#!/bin/sh
# fix repo permissions after push
cd /home/nonroot/repo/city-helpers.git
# эти строки были добавлены как часть борьбы с проблемой
sudo chown -R nonroot:nonroot HEAD index logs
# all the staff
cd /srv/city-helpers/laravel
php artisan down --render="errors::503"
git --work-tree=/srv/city-helpers/laravel --git-dir=/home/nonroot/repo/city-helpers.git checkout master -f
cp -n ./.env.example ./.env
ln -s ../storage ./storage
COMPOSER_ALLOW_SUPERUSER=1 composer install --no-dev --optimize-autoloader
php artisan config:cache
php artisan route:cache
php artisan view:cache
php artisan up
> sudo /sbin/deploy-city-helpers
Ну, блин, ваш скрипт исполняется от рута и что-то меняет в репозитории.
Попробуйте эти строки переставить в конец скрипта.
> # эти строки были добавлены как часть борьбы с проблемой
> sudo chown -R nonroot:nonroot HEAD index logs
Lynn «Кофеман», это я как бы не сам придумал такой подход к развертке. Разве есть какой-то другой способ развернуть репозиторий вне /home/nonroot кроме как через sudo? Если я пишу sudo, он что буквально исполняется от имени root?
Когда авторизация по ключу, то не важно под каким локальным пользователем вы делаете push. Важно то, куда вы ранее сохранили открытый ключ на сервере. Если в /root/.ssh/ то и авторизует вас под root. Тут даже не важно, какое имя пользователя вы там вписали в URL remote production.
Но это не точно
Вот ещё версия:
После push на сервере срабатывает post-receive хук от имени рута и всё ломает. Может такое быть?
Вообще-то нет. Имя пользователя (nonroot@) используется что бы знать у какого пользователя искать публичную часть ключа. Не зря у github-а всегда используется git@.
Т.е. конечно никто не мешает написать ssh-сервер который работает не так, но вряд ли у автора что-то отличное от OpenSSH.