Голое и не голое репо на сервере

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

Первоначально я сосредоточился на настройке репозитория без репо на сервере и извлечении из репозитория без репо, но для этого потребуется, чтобы кто-то git pull каждый раз выполнял push с локальной машины. У меня вопрос: можно ли настроить репозитории без оболочки и без нее таким образом, чтобы я мог вносить изменения в код на локальном компьютере, отправлять эти изменения и автоматически размещать их на сервере. Если требуется репо на стороне сервера, можно ли заблокировать отправку с него?


person balkon16    schedule 21.02.2019    source источник


Ответы (1)


Вместо того, чтобы использовать git pull вручную на сервере, можно ли использовать обработчики на стороне сервера? Это можно было бы использовать для того, чтобы каким-то образом инициировать извлечение репозитория на сервере.

Хук получения сообщения может быть чем-то вроде

#!/bin/bash

unset GIT_DIR
git -C /path/to/non/bare/repo pull

Другой вариант, если вы можете позволить себе отложить обновление серверного репозитория non-bare, - использовать cron-job для периодического извлечения данных из открытого репозитория.

person Simon Doppler    schedule 21.02.2019
comment
Я бы пошел на eval unset ${!GIT_*} на всякий случай, но да, развертывание после получения - это то, что вам нужно. Создайте не-чистый клон с помощью git clone -s bare.git deploy, и вытягивание будет настолько близко к максимально эффективному, что я не вижу практических причин для использования вместо этого основных команд, предназначенных для написания сценариев. - person jthill; 21.02.2019
comment
unset $(git rev-parse --local-env-vars) - person phd; 21.02.2019
comment
Что означает -C в git -C /path/to/non/bare/repo pull - person balkon16; 22.02.2019
comment
@ balkon16 он указывает путь, на который git должен измениться перед выполнением действия (его можно заменить на cd /path/to/non/bare/repo && git pull - person Simon Doppler; 22.02.2019
comment
Должен ли я добавлять какие-либо хуки в каталог .git/hooks репозитория без голого сервера на сервере? Я спрашиваю, потому что я создал post-receive файл в каталоге hooks репо и поместил туда следующий контент (точка с запятой разделяет строки только в этом комментарии): !/bin/sh; cd /data/11_prywatne/14_Pawel/repo_pawel_non_bare/deploy || exit; unset GIT_DIR; git pull origin master, но репо на сервере не извлекается автоматически из чистого репо. - person balkon16; 22.02.2019
comment
Я не вижу причин, по которым вам нужно что-то помещать в репозиторий non-bare. Просто убедитесь, что вы сделали хук исполняемым. - person Simon Doppler; 22.02.2019
comment
Я просто хотел отредактировать свой последний комментарий. Я установил hooks/post-receive как исполняемый файл (chmod +x hooks/post-receive), но репо на сервере не обновляется автоматически. - person balkon16; 22.02.2019
comment
При отправке в пустой репозиторий, содержит ли push-сообщение какие-либо строки, начинающиеся с remote:? - person Simon Doppler; 22.02.2019
comment
@SimonDoppler, в итоге hooks/post-receive работает как задумано. Спасибо за помощь. Однако оказывается, что может быть ситуация, когда кто-то редактирует код в репозитории без чистого сервера. Необходимо, чтобы следующий толчок из локального репозитория, не являющегося голым, перезаписал эти изменения. Пока есть конфликты, которые нужно разрешать вручную. Я предполагаю, что есть способ автоматически разрешать конфликты в пользу версии локального репо. - person balkon16; 22.02.2019
comment
@ balkon16 Вы можете использовать git checkout --ours ., чтобы использовать все локальные файлы репозитория. Для этого потребуется больше шагов, чем просто тяга, но это должно быть выполнимо. Я предлагаю вам найти этот ответ для получения дополнительной информации - person Simon Doppler; 22.02.2019