Git pós-receita gancho para estadiamento de sites
-
27-09-2019 - |
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."
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)