git hook не ведет себя согласованно между linux и windows - PullRequest
1 голос
/ 30 марта 2019

После настройки локального сервера GIT я попытался установить хук после получения, чтобы развернуть мой код после каждого нажатия.Это работало как ветер на моем компьютере с Windows 10, но не на моем сервере Linux.Чтобы продолжить работу над этим вопросом, я установил Raspberry Pi, чтобы проверить, было ли это связано с Linux, и я встретил то же самое поведение:

#!/bin/bash
TARGET="C:/GIT/repoPROJECT/Test"
GIT_DIR="C:/GIT/repoGIT/Test"
BRANCH="master"

while read oldrev newrev ref
do
    # only checking out the master (or whatever branch you would like to deploy)
    if [ "$ref" = "refs/heads/$BRANCH" ];
    then
        echo "Ref $ref received. Deploying ${BRANCH} branch to production..."
        git --work-tree=$TARGET --git-dir=$GIT_DIR checkout -f $BRANCH
    else
        echo "Ref $ref received. Doing nothing: only the ${BRANCH} branch may be deployed on this server."
    fi
done

(repoGIT / Test - пустое git-репо, другой -клон. Я нажимаю на голое и устанавливаю хук)

с той же конфигурацией, авторизациями, это не будет работать на моем Linux (Raspberry), но будет отлично работать на моем компьютере с Windows.Я проверил, что мой хук запущен и он (он создает папку).

В конце концов это сработало:

#!/bin/bash
unset $(git rev-parse --local-env-vars)

TARGET="/home/pi/GIT/repoPROJECT/Test"
GIT_DIR="/home/pi/GIT/repoGIT/Test"
BRANCH="origin"

cd $TARGET
git pull

но я не уверен, почему мне пришлосьиспользуйте другой скрипт, поэтому мне пришлось переключаться с мастера на источник, когда я точно так же настраивал проект (при экспериментировании с верхним скриптом).

Я предполагаю, что это связано с ОС, но я 'Я хотел бы понять, чтобы я мог справиться с такими проблемами в будущем.

(Я не могу вспомнить все ошибки, которые у меня были, но иногда это был master, а не git-репозиторий, иногда скриптзастрял бы в цикле. обратите внимание, что я пытался сбросить переменную var в верхнем скрипте, но она все равно не работала)

1 Ответ

1 голос
/ 31 марта 2019

Я не совсем понимаю, как я оказался в этой ситуации, но вот что я нашел:

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

Я пытался установить локальный сервер GIT, чтобы я мог работать на своем компьютере, перенести свой код на сервер Linux и затем соответствующим образом обновить развернутый проект.

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

Я думаю, что тот факт, что я просматривал смонтированную папку, был частью проблемы, так как эта установка работала с несколькими тестовыми программами и файлами локально.

Теперь проблема, создаваемая этим, заключается в том, что мой код действительно будет помещен в пустое хранилище, будет запущен хук post-receive, но переменные ref и т. Д., Используемые в сценарии, по какой-то причине будут пустыми. У меня также было несколько забавных результатов, когда я пытался решить эту проблему, когда мои удаленные / ответвления использовали бы контекст моей машины вместо сервера.

В любом случае, это не сработало. Мне удалось воспроизвести это поведение на моем собственном компьютере и Raspberry Pi: другой механизм, одинаковые настройки. хук будет запущен, но скрипт застрянет, переменные останутся пустыми. (это та часть, которую я до сих пор не понимаю, потому что удаленные пути были хорошими, все выглядело хорошо, толкание сработало бы, тянет и т. д.)

Теперь, что в итоге решило, это установило это по-другому:

1) создание пустого репо, пустого (на стороне сервера) 2) создание клона этого пустого репо, все еще на сервере (вероятно, не имеет значения). 3) поместить мой код в это новое хранилище и перенести его на новый, чтобы он был в курсе. 4) создание нового клона голого репо (для моего развернутого проекта) 5) добавление хука к голому репо, пост-получение, цель - развернутое репо, git dir - голое. (+ chmod 777 и + x в этом файле)

(оттуда изменение чего-либо и отталкивание от первого клона должно привести к срабатыванию крюка и правильной проверке развернутого репо)

6) затем я вернулся на свою IDE, клонировал голое хранилище, попытался внедрить что-то новое, и вот, наконец, все заработало, как и ожидалось.

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

Буду признателен, если кто-то с большим опытом в этом вопросе сможет дать более подробное объяснение. Тем временем моя проблема решена.

...