3

Я хочу настроить репозиторий GIT для веб-сайта. У нескольких пользователей будет клон репо на их локальной машине, и в конце каждого дня они отправляют свою работу на сервер. Я могу установить репозиторий с открытым исходным кодом, но я хочу работающий репозиторий DIR /non-bare.

Идея в том, что рабочий каталог репозитория будет корневой папкой для сайта. В конце каждого дня все изменения будут видны напрямую. Но я не могу найти способ сделать это.

Инициализация репозитория сервера с помощью git init приводит к следующей ошибке, когда клиент пытается отправить некоторые файлы:

git push origin master
orangetux@xxx.xxx.xxx.xxx's password: 
Counting objects: 3, done.
Writing objects: 100% (3/3), 227 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
remote: error: refusing to update checked out branch: refs/heads/master
remote: error: By default, updating the current branch in a non-bare repository
remote: error: is denied, because it will make the index and work tree inconsistent
remote: error: with what you pushed, and will require 'git reset --hard' to match
remote: error: the work tree to HEAD.
remote: error: 
remote: error: You can set 'receive.denyCurrentBranch' configuration variable to
remote: error: 'ignore' or 'warn' in the remote repository to allow pushing into
remote: error: its current branch; however, this is not recommended unless you
remote: error: arranged to update its work tree to match what you pushed in some
remote: error: other way.
remote: error: 
remote: error: To squelch this message and still keep the default behaviour, set
remote: error: 'receive.denyCurrentBranch' configuration variable to 'refuse'.
To ssh://orangetux@xxx.xxx.xxx.xxx/home/orangetux/www/
 ! [remote rejected] master -> master (branch is currently checked out)
error: failed to push some refs to 'ssh://orangetux@xxx.xxx.xxx.xxx/home/orangetux/www/'

Так что мне интересно, если это правильный способ настроить репозиторий GIT для веб-сайта? Если так, как я должен сделать это? Если нет, то как лучше настроить GIT-репо для разработки веб-сайта?

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

2 ответа2

4

Чтобы увидеть результат коммита, я должен клонировать репозиторий каждый раз.

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

Чтобы сделать это автоматически, вам просто нужно добавить правильные команды в <barerepo>/hooks/post-update в вашем голом репозитории.

  • Метод А, веб-сайт является полным клоном основного хранилища:

    #!/bin/sh
    git update-server-info
    if dir=$(git config hooks.checkoutTo); then
        for ref; do
            if [ "$ref" = "refs/heads/master" ]; then
                (unset GIT_DIR && cd "$dir" && git pull --quiet --ff-only)
            fi
        done
    fi
    

    Совет: Если оба репозитория находятся на одном и том же компьютере, используйте git clone --shared /path/to/bare чтобы сэкономить место путем повторного использования каталога объектов голого репозитория.

    Примечание. Возможны проблемы с безопасностью метода А - посторонний может просто загрузить каталог .git с исходным кодом вашего сайта, если вы не переместите его в другое место.

  • Метод Б, веб-сайт - только проверка:

    #!/bin/sh
    git update-server-info
    if dir=$(git config hooks.checkoutTo); then
        for ref; do
            if [ "$ref" = "refs/heads/master" ]; then
                # Must give a path (such as ".") to avoid switching HEAD.
                git --work-tree="$dir" checkout -f "$ref" -- .
            fi
        done
    fi
    

Для обеих ловушек запустите git config hooks.checkoutTo /var/www внутри пустого хранилища (или отредактируйте <barerepo>/config вручную), чтобы установить целевой путь.

Оба хука написаны для активации только при обновлении master ветви.

Убедитесь, что файл ловушек является исполняемым (chmod +x). Смотрите githooks (5) для деталей.


Примечание: Технически вы можете перейти в не-пустой репозиторий - Git просто отклонит отправку в текущую извлеченную ветку (передача в другие ветки в порядке). Даже эту проверку можно отключить, но это всего лишь приглашение к неприятностям ... Кроме того, для резервных копий гораздо удобнее хранить пустые репозитории в одном каталоге (например, ~/srv/git или ~/Public/Git).

0

[удаленный отклонен] мастер -> мастер

Он отклоняется удаленно, поэтому убедитесь, что ваш репо, который вы открываете, обновлен, потянув и нажав снова:

git pull; git push

Если все еще отказано, попробуйте сначала перейти в другую ветку:

git push origin master:foo

поэтому владелец репо может объединить вашу ветку.

Если вы внесли некоторые изменения в коммиты через rebase , вы, вероятно, захотите форсировать его через -f .

В качестве альтернативы отключите denyCurrentBranch на удаленном компьютере через (не рекомендуется):

git config receive.denyCurrentBranch ignore

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .