Запретить git перезаписать владельца файла при вытягивании git - PullRequest
3 голосов
/ 16 июня 2020

Я видел здесь несколько похожих вопросов, но ни одно из приведенных решений, похоже, не работает ... интересно, устарели ли они, или этот случай каким-то образом отличается ... поэтому я хотел открыть новая ветка, чтобы поговорить об этом.

Я столкнулся с неприятной проблемой, когда каждый раз, когда я выполняю и git pull, он меняет владельца на пользователя пуллера. Затем на сайте отображается следующая ошибка:

Warning: file_get_contents(/var/www/html/wp-content/themes/<my-theme>/resources/views/<changed-file>): failed to open stream: Permission denied in /var/www/html/wp-includes/class-wp-theme.php on line 1207

, которую можно исправить, только запустив chown www-data в измененном файле.

Это будет становится проблемой, когда над сайтом начинает работать больше людей, или когда изменяются важные файлы (шаблон / заголовок / нижний колонтитул по умолчанию ..), и сайт становится пустым, пока не будет запущен chown.


Сайт подробности

Laravel, wordpress, ubuntu 18, хостинг брони

Git репо, хранящееся в настраиваемой теме


Я пробовал несколько решений, но похоже, что ни один из них не работает (возможно, потому, что они реализованы неправильно ..)

Решения, которые я пробовал

1: установить для filemode значение false - я установил для filemode значение false, локально и глобально, на моем локальном компьютере и рассматриваемом сервере. Я тоже пробовал изменить регистр на "fileMode".

2: реализовать ловушку после обновления - я добавил ловушку после обновления, чтобы автоматически обновлять права / права собственности на файл. Вот сценарий (обратите внимание, что репо git находится в настраиваемой теме):

#!/bin/sh

# default owner user
OWNER="www-data:www-data"

# changed file permission
PERMISSION="664"

# web repository directory
REPO_DIR="/var/www/html/wp-content/themes/quorum-theme"

# remote repository 
REMOTE_REPO="origin"

# public branch of the remote repository
REMOTE_REPO_BRANCH="master"

cd $REPO_DIR || exit
unset GIT_DIR
files="$(git diff-tree -r --name-only --no-commit-id HEAD@{1} HEAD)"
git merge FETCH_HEAD

for file in $files
do
  sudo chown $OWNER $file
  sudo chmod $PERMISSION $file
done

exec git-update-server-info

Сообщите мне, есть ли еще что-то, что стоит попробовать, или если вы заметили проблему с моим кодом ...

Всего наилучшего,

Джилл

Ответы [ 2 ]

3 голосов
/ 21 июня 2020

Судя по вашему вопросу, похоже, что вы используете git pull для развертывания в производственной среде.

git не является инструментом развертывания. Если вы хотите развернуть свой код, я предлагаю вам написать сценарий развертывания.

Первая версия вашего сценария может быть:

# deploy.sh

# cd to the appropriate directory :
cd /var/www/mysite

# change to the correct user before pulling :
sudo -u www-data git pull

Обновленная версия должна останавливаться в зависимости от git pull.

В идеале: вы хотите иметь возможность идентифицировать версии вашего кода, которые могут быть развернуты в производстве, и не зависеть от того, что «git pull будет работать, не вызывая конфликтов слияния».

Вот схема рабочего процесса c, которому вы можете следовать:

Если вы хотите развернуть в производственной среде:

  1. создает некоторый артефакт, который упаковывает ваш код из идентифицированного коммита: для кода php это может быть простой .tar.gz

    # set a clearly identifiable tag on target commit
    git tag v-x.y.z
    
    # create a tar.gz archive that stores the files :
    # look at 'git help archive'
    git archive -o ../myapp-x.y.z.tgz v-x.y.z
    
  2. pu sh, который является артефактом вашего производственного сервера

    scp myapp-x.y.z.tgz production-server:
    
  3. запустите сценарий развертывания, больше не вызывая git:

    # deploy.sh :
    #   usage :   ./deploy.sh myapp-x.y.z.tgz
    
    archive="$1"
    
    # extract the archive to a fresh folder :
    mkdir /var/www/mysite.new
    tar -C /var/www/mysite.new -xzf "$archive"
    
    chown -R www-data: /var/www/mysite.new
    
    # replace old folder with new folder :
    mv /var/www/mysite /var/www/mysite.old
    mv /var/www/mysite.new /var/www/mysite
    

Некоторые дополнительные действия, которыми вы обычно захотите управлять при развертывании:

  • резервное копирование базы данных перед развертыванием
  • параметры конфигурации hanlde (скопируйте рабочий файл конфигурации? Настройте среду? ...)
  • применить действия миграции
  • перезапуск apache или nginx
  • ...

Вероятно, вы захотите версию этот deploy.sh скрипт вместе с вашим проектом.

2 голосов
/ 19 июня 2020

Вы очень близки к правильному решению.

Вам необходимо включить следующие хуки:

  • post-merge, вызывается после успешного git pull
  • post-checkout, вызывается после успешного git checkout

Если вы уверены, что используете только git pull, ловушки post-merge будет достаточно.
Включение обеих ловушек гарантирует вам ловушка всегда вызывается без дополнительных затрат.

Содержимое ловушки должно быть таким:

#!/bin/sh

# default owner user
OWNER="www-data:www-data"

# web repository directory
REPO_DIR="/var/www/html/wp-content/themes/quorum-theme"

echo
echo "---"
echo "--- Resetting ownership to ${OWNER} on ${REPO_DIR}"

sudo chown -R $OWNER $REPO_DIR

echo "--- Done"
echo "---"

Скрипт сбросит владение на OWNER для всех файлов и каталогов внутри REPO_DIR.
Я скопировал значения из вашего сообщения, в конечном итоге изменил его в соответствии с вашими потребностями.

Чтобы включить ловушку, вы должны:

  • создать файл с именем post-merge с помощью приведенного выше сценария
  • переместите его в каталог .git/hook/ вашего репо
  • дайте ему разрешение на выполнение с помощью chmod +x post-merge

Повторите эти шаги для крючка post-checkout, который должен быть равен крючку post-merge.

Обратите внимание t o выполнить sudo git pull, если ваш пользователь не root. Все файлы и каталоги в целевом каталоге принадлежат www-data, вам необходимо выполнить команду git pull с привилегиями суперпользователя, иначе команда завершится ошибкой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...