2009-10-12 23 views
5

Sto usando Git errato. Voglio usarlo bene.Spingere un albero di sorgenti Git, non solo un repository

Ecco quello che ho:

Da questa parte, sulla mia macchina di sviluppo è un repository Git, che mi impegno a e prova su.

Laggiù, c'è il mio server web, ovvero il posto in cui verrà distribuito questo codice. Il server Web ha un altro repository git nudo su cui posso eseguire il push, tramite SSH, quando sono pronto per la distribuzione.

Quello che voglio succedere è avere una vista nel repository Git che ha sempre le ultime versioni dei file sorgente (su qualche ramo o con qualche tag).

Quello che potrei fare è creare un altro repository git (non nullo) sul server web, e fare un pull manuale dopo ogni push, ma speravo di evitare di dover accedere al server web ciascuno volta faccio una spinta git.

C'è un modo per fare un "push sul server Web remoto e aggiornare i file estratti, se prometto che non ho modificato nessun file sul server web"?

O lo sto facendo così male che vuoi darmi uno schiaffo? :-)

risposta

7

Io di solito creare un repository non-nudo con un file .git/ganci/post-ricezione contenente

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

Questo file deve essere eseguibile e un ramo deve essere estratto.

Quindi ogni volta che si preme su quel repository, l'albero di lavoro verrà reimpostato sull'ultima versione del ramo corrente. Qualsiasi modifica locale verrà sovrascritta (ma i file non tracciati non verranno rimossi).

Git ora visualizza un avviso quando si preme su un ramo estratto (e lo rifiuterà nelle versioni future). per evitare questo è possibile impostare questa configurazione sul repository remoto:

git config receive.denyCurrentBranch ignore 

È possibile lavorare su questo repository, ma è necessario confermare le modifiche prima di ogni spinta è fatto ad esso.

ho trovato la punta c'è: http://debuggable.com/posts/git-tip-auto-update-working-tree-via-post-receive-hook:49551efe-6414-4e86-aec6-544f4834cda3

7

Il hooks potrebbe essere quello che stai cercando.

Si crea un hook di post-ricezione. E verrà eseguito sul server dopo ogni push che stai facendo. poi si fa un tiro sul secondo repository nuda e sarai sempre aggiornato :)

1

uso per cose un repository nudo (all'interno di un account utente) e un archivio condiviso che è la radice del web.
Il repository nudo ha un hook post-aggiornamento per estrarre la web root, quindi dopo aver premuto sul repository verrà eseguita la root web.

Per avere accesso in lettura/scrittura dal server Web, il mio utente git è anche nel gruppo www-data e la directory Web principale era chmod ug + rwx, g + s in modo che i nuovi file creati acquisiscano la proprietà del gruppo.La umask si assicura che il gruppo abbia accesso in lettura/scrittura perché Git usa la umask predefinita che normalmente è 0022 (la documentazione dice qualcosa sull'uso di una propria umask nella configurazione ma questo non ha mai funzionato per me)

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