Pergunta

Estou tentando configurar o git para encenar meu site para que eu possa git pull Para fazer com que a versão atual funcione localmente e depois git push Para empurrar as alterações no servidor remoto. Eu o configurei para que funcione da maneira que eu quero, mas depois que eu pressiono, tenho que correr manualmente git checkout -f ou git reset --hard HEAD no servidor remoto.

Tentei colocá-los em um script de shell como o gancho pós-recepção no servidor, mas ele simplesmente não parece ter nenhum efeito. Eu sei que o script está em execução porque estou vendo "mudanças empurradas para o servidor" depois que eu pressiono. Aqui está o gancho pós-recebimento:

#!/bin/sh
git reset --hard HEAD
echo "Changes pushed to server."
Foi útil?

Solução

A resposta para sua pergunta está aqui: http://toroid.org/ams/git-website-owto

Em suma, o que você deseja fazer é adicionar uma "árvore de trabalho isolada" ao repositório nu. Normalmente você pensa em sua árvore de trabalho como contendo o .git diretório. Os repositórios nus não têm uma árvore de trabalho por definição, mas você pode criar um desde que esteja em um diretório diferente do repositório nu.

O gancho pós-recepção é apenas um simples git checkout -f para replicar o repositório HEAD no diretório de trabalho. O Apache usa isso como raiz de documento e você está pronto. Sempre que você pressionar para o repositório nu, o Apache começará imediatamente a servi -lo.

Geralmente, uso isso para empurrar automaticamente um servidor de estadiamento para ver se o ambiente "real" vomitará minhas alterações. Implantar para o servidor ao vivo é uma história completamente diferente. :-)

Outras dicas

Atualização de março de 2015

Como mencionei em "O que é essa mensagem de aviso do Git ao empurrar mudanças para um repositório remoto?", você realmente pode empurrar diretamente para um repo não bare agora (Git 2.3.0+, fevereiro de 2015) com:

git config receive.denyCurrentBranch updateInstead

Atualize a árvore de trabalho de acordo, mas recuse -se a fazê -lo se houver alguma alteração não comprometida.

Isso permitiria que você evite qualquer gancho pós-recepção.


(Resposta original: outubro de 2010)

o Gitfaq recomenda para Repo não barato Este gancho de pós-atualização:
(Pode lhe dar mais pista sobre o que realmente está acontecendo na execução do gancho. Observe que este é um gancho de pós-atualização, não um pós-recepção)

#!/bin/sh
#
# This hook does two things:
#
#  1. update the "info" files that allow the list of references to be
#     queries over dumb transports such as http
#
#  2. if this repository looks like it is a non-bare repository, and
#     the checked-out branch is pushed to, then update the working copy.
#     This makes "push" function somewhat similarly to darcs and bzr.
#
# To enable this hook, make this file executable by "chmod +x post-update".

git-update-server-info

is_bare=$(git-config --get --bool core.bare)

if [ -z "$is_bare" ]
then
    # for compatibility's sake, guess
    git_dir_full=$(cd $GIT_DIR; pwd)
    case $git_dir_full in */.git) is_bare=false;; *) is_bare=true;; esac
fi

update_wc() {
    ref=$1
    echo "Push to checked out branch $ref" >&2
    if [ ! -f $GIT_DIR/logs/HEAD ]
    then
        echo "E:push to non-bare repository requires a HEAD reflog" >&2
        exit 1
    fi
    if (cd $GIT_WORK_TREE; git-diff-files -q --exit-code >/dev/null)
    then
        wc_dirty=0
    else
        echo "W:unstaged changes found in working copy" >&2
        wc_dirty=1
        desc="working copy"
    fi
    if git diff-index --cached HEAD@{1} >/dev/null
    then
        index_dirty=0
    else
        echo "W:uncommitted, staged changes found" >&2
        index_dirty=1
        if [ -n "$desc" ]
        then
            desc="$desc and index"
        else
            desc="index"
        fi
    fi
    if [ "$wc_dirty" -ne 0 -o "$index_dirty" -ne 0 ]
    then
        new=$(git rev-parse HEAD)
        echo "W:stashing dirty $desc - see git-stash(1)" >&2
        ( trap 'echo trapped $$; git symbolic-ref HEAD "'"$ref"'"' 2 3 13 15 ERR EXIT
        git-update-ref --no-deref HEAD HEAD@{1}
        cd $GIT_WORK_TREE
        git stash save "dirty $desc before update to $new";
        git-symbolic-ref HEAD "$ref"
        )
    fi

    # eye candy - show the WC updates :)
    echo "Updating working copy" >&2
    (cd $GIT_WORK_TREE
    git-diff-index -R --name-status HEAD >&2
    git-reset --hard HEAD)
}

if [ "$is_bare" = "false" ]
then
    active_branch=`git-symbolic-ref HEAD`
    export GIT_DIR=$(cd $GIT_DIR; pwd)
    GIT_WORK_TREE=${GIT_WORK_TREE-..}
    for ref
    do
        if [ "$ref" = "$active_branch" ]
        then
            update_wc $ref
        fi
    done
fi

Para que isso funcione, você ainda precisaria permitir especificamente aumentar as alterações na filial atual usando uma dessas configurações:

git config receive.denyCurrentBranch ignore

ou

git config receive.denyCurrentBranch warn

Eu tinha exatamente o mesmo problema. Em uma resposta a este link: http://toroid.org/ams/git-website-owto - O seguinte comando fez isso:

sudo chmod +x hooks/post-receive

Perdemos um sudo A permissão configurou primeiro o material.

Versão fixa do script do VONC, funciona para mim (absolutamente nenhuma garantia).

#!/bin/sh
#
# This hook does two things:
#
#  1. update the "info" files that allow the list of references to be
#     queries over dumb transports such as http
#
#  2. if this repository looks like it is a non-bare repository, and
#     the checked-out branch is pushed to, then update the working copy.
#     This makes "push" function somewhat similarly to darcs and bzr.
#
# To enable this hook, make this file executable by "chmod +x post-update".

set -e

git update-server-info

is_bare=$(git config --get --bool core.bare)

if [ -z "${is_bare}" ]
then
    # for compatibility's sake, guess
    git_dir_full=$(cd $GIT_DIR; pwd)
    case $git_dir_full in */.git) is_bare=false;; *) is_bare=true;; esac
fi

update_wc() {
    ref=$1
    echo "Push to checked out branch $ref" >&2
    if [ ! -f ${GIT_DIR}/logs/HEAD ]
    then
        echo "E:push to non-bare repository requires a HEAD reflog" >&2
        exit 1
    fi
    if (cd ${GIT_WORK_TREE}; git diff-files -q --exit-code >/dev/null)
    then
        wc_dirty=0
    else
        echo "W:unstaged changes found in working copy" >&2
        wc_dirty=1
        desc="working copy"
    fi
    if git diff-index --cached HEAD@{1} >/dev/null
    then
        index_dirty=0
    else
        echo "W:uncommitted, staged changes found" >&2
        index_dirty=1
        if [ -n "$desc" ]
        then
            desc="$desc and index"
        else
            desc="index"
        fi
    fi
    if [ "$wc_dirty" -ne 0 -o "$index_dirty" -ne 0 ]
    then
        new=$(git rev-parse HEAD)
        echo "W:stashing dirty $desc - see git-stash(1)" >&2
        ( trap 'echo trapped $$; git symbolic-ref HEAD "'"$ref"'"' 2 3 13 15 ERR EXIT
        git update-ref --no-deref HEAD HEAD@{1}
        cd ${GIT_WORK_TREE}
        git stash save "dirty $desc before update to $new";
        git symbolic-ref HEAD "$ref"
        )
    fi

    # eye candy - show the WC updates :)
    echo "Updating working copy" >&2
    (cd ${GIT_WORK_TREE}
    git diff-index -R --name-status HEAD >&2
    git reset --hard HEAD
    # need to touch some files or restart the application? do that here:
    # touch *.wsgi
    )

}

if [ x"${is_bare}" = x"false" ]
then
    active_branch=$(git symbolic-ref HEAD)
    export GIT_DIR=$(cd ${GIT_DIR}; pwd)
    GIT_WORK_TREE="${GIT_DIR}/.."
    for ref in $(cat)
    do
        if [ x"$ref" = x"${active_branch}" ]
        then
            update_wc $ref
        fi
    done
fi

Script simples para definir esta implantação do Git:

Preparando o gancho pós-recepção:

echo '#!/bin/sh'        >  .git/hooks/post-receive
echo 'git checkout -f'  >> .git/hooks/post-receive
echo 'git reset --hard' >> .git/hooks/post-receive
chmod +x .git/hooks/post-receive

Permitindo o Push nesse repositório, embora não esteja vazio:

git config receive.denycurrentbranch false

Estou apenas adivinhando, mas isso pode ser algum problema de permissão (caminho completo necessário? cd?). Verifique o que realmente está acontecendo nos arquivos de log.

No entanto, publicar os arquivos via Git é sempre apenas uma tarefa do processo de publicação. Você geralmente precisa copiar alguns arquivos, excluir outras, configurar, atualizar permissões, gerar documentos etc.

Para uma solução complexa, um script de construção pode ser melhor do que qualquer gancho Git. Ferramentas que podem lidar muito bem com essas tarefas:

(Percebo que não é a resposta que você espera, mas é muito longo para postar como um comentário)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top