2009-10-12 8 views
5

J'utilise Git mal. Je veux l'utiliser correctement.Pousser un arbre source Git, pas seulement un référentiel

Voici ce que j'ai:

Ici, sur ma machine de développement est un dépôt Git, que je commets et tester sur. Là-bas, est mon serveur Web - le seul endroit où ce code sera déployé. Le serveur Web dispose d'un autre référentiel git que je peux utiliser, via SSH, lorsque je suis prêt à être déployé. Ce que je veux arriver est d'avoir une vue dans le dépôt Git qui a toujours les dernières versions des fichiers sources (sur une branche ou avec une balise). Ce que JE POUVAIS faire est de créer un autre dépôt git (non-nu) sur le serveur web, et de faire une extraction manuelle après chaque poussée, mais j'espérais éviter d'avoir à me connecter au serveur web chaque fois temps que je fais une poussée de git.

Existe-t-il un moyen de pousser à distance le serveur web et d'actualiser ses fichiers retirés, si je promets de ne pas éditer de fichiers sur le serveur web? Ou est-ce que je le fais juste si mal que tu veux me gifler? :-)

Répondre

7

Je crée généralement un référentiel non-nu avec un fichier .git/hooks/post-réception contenant

#!/bin/sh 
cd .. 
env -i git reset --hard 

Ce fichier doit être exécutable et une branche doit être extraite.

Ensuite, chaque fois que vous déposez dans ce référentiel, l'arborescence de travail est réinitialisée à la dernière version de la branche en cours. Toute modification locale sera remplacée (mais les fichiers non traités ne seront pas supprimés). Git affiche maintenant un avertissement lorsque vous poussez sur une branche empruntée (et la rejettera dans les versions ultérieures). Pour éviter cela, vous pouvez définir cette configuration sur le dépôt distant:

git config receive.denyCurrentBranch ignore 

Vous pouvez travailler sur ce dépôt, mais vous devez valider vos modifications avant toute poussée est fait pour elle.

Je trouve la pointe là-bas: http://debuggable.com/posts/git-tip-auto-update-working-tree-via-post-receive-hook:49551efe-6414-4e86-aec6-544f4834cda3

7

Le hooks pourrait être ce que vous cherchez.

Vous créez un hook après réception. Et il sera exécuté sur le serveur après chaque poussée que vous faites. Ensuite, vous faites une traction sur le second dépôt nu et vous serez toujours à jour :)

1

J'utilise pour de telles choses de dépôt nu (dans un compte utilisateur) et un référentiel partagé qui est la racine de la bande.
Le référentiel nu dispose d'un point d'ancrage post-mise à jour pour extraire la racine Web. Après avoir poussé vers le référentiel, la racine Web sera tirée. Pour avoir un accès en lecture/écriture depuis le serveur web, mon utilisateur git est aussi dans le groupe www-data et le répertoire racine web était chmod ug + rwx, g + s donc les nouveaux fichiers créés deviendront la propriété de groupe.L'umask s'assure que le groupe a un accès en lecture/écriture car Git utilise le umask par défaut qui est normalement 0022 (la documentation dit quelque chose sur l'utilisation d'un umask dans la config mais cela n'a jamais fonctionné pour moi)

#!/bin/bash 
# post-update hook 

WEB_DIR="/var/www/myweb" 
pushd $WEB_DIR > /dev/null 
export GIT_DIR="$WEB_DIR/.git" 
umask 0007 
git pull 
popd > /dev/null 
Questions connexes