59 votes

Git Post-Recevoir Crochet pour le Site web de mise en scène

Je suis en train de configurer Git pour l'organisation de mon site afin que je puisse git pull pour obtenir la version actuelle de travailler localement et puis, git push pour pousser les modifications sur le serveur distant. Je l'ai mis en place de sorte qu'il fonctionne de la façon dont je le veux, mais après je pousse, je dois exécuter manuellement git checkout -f ou git reset --hard HEAD sur le serveur distant.

J'ai essayé de les mettre dans un script shell, alors que l'après-recevoir crochet sur le serveur, mais il ne semble pas avoir d'effet. Je sais que le script est en cours d'exécution parce que je suis de voir des "Changements poussé au serveur" après je push. Voici le post-recevoir crochet:

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

Merci.

73voto

Paul Points 1294

La réponse à votre question est ici: http://toroid.org/ams/git-website-howto

En bref, ce que vous voulez faire est d'ajouter un "travail isolé de l'arbre" pour le dépôt nu. Normalement, vous pensez à votre travail arborescence contenant de l' .git répertoire. Nu référentiels de ne pas avoir un arbre, par définition, mais vous pouvez en créer un en tant qu'il est dans un autre répertoire que le nu-repo.

L'après-recevoir crochet est juste un simple git checkout -f à reproduire le référentiel de l' HEAD dans le répertoire de travail. Apache utilise comme sa racine du document, et vous êtes tous ensemble. Tout le temps de vous pousser à le dépôt nu, Apache va immédiatement commencer à servir.

Je l'utilise généralement ce à pousser automatiquement à un serveur de test pour voir si le "vrai" environnement vomir sur mes changements. Déploiement sur le serveur live est une histoire complètement différente. :-)

15voto

VonC Points 414372

Le GitFAQ recommande pour les non-nue pensions de ce post-mise à jour de crochet:
(il pourrait vous donner plus d'idée de ce qui se passe réellement dans le crochet de l'exécution. Remarque: ceci est un post-mise à jour de crochet, pas un post-receive)

#!/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

11voto

ido Points 486

J'ai eu exactement le même problème. Dans une réponse à ce lien: http://toroid.org/ams/git-website-howto - La commande suivante il l'a fait:

sudo chmod +x hooks/post-receive

Nous avons manqué un sudo la permission d'abord configuré le truc.

6voto

Tronic Points 6457

Version fixe de VonC du script, qui fonctionne pour moi (absolument pas de garantie).

#!/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

6voto

Honza Points 112

Script Simple pour le réglage de ce déploiement git:

La préparation de l'après-recevoir crochet:

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

Permettant d'aller dans ce référentiel, même si elle n'est pas nue:

git config receive.denycurrentbranch false

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X