2010-09-16 25 views
40

Abbiamo un sito Web che contiene tutti i suoi file PHP/HTML/JS/CSS/etc memorizzati in un repository Git.Git push al server live

Attualmente sono disponibili 3 tipi di computer (o casi d'uso) per il repository.

  • sviluppatore locale: tirare ultime modifiche, apportare le modifiche, si impegnano a repo locale, spingere al server master
  • server master: repository centrale, tutte le modifiche ottenere spinto al server master
  • server Web: i cambiamenti sono tirato giù dal server master durante la distribuzione del sito

Quindi attualmente siamo:

local: git push origin master 
local: password: ******** 
local: ssh [email protected] 
webserver: password: ******** 
webserver: cd ~/domain.com/ 
webserver: git pull origin master 

Quindi la mia domanda è: c'è un modo che dal mio computer locale posso spingere direttamente al server web?

ie.

local: git push origin master 
local: password: ******** 
local: git push webserver master 
local: password: ******** 
+0

possibile duplicato di [Distribuire un progetto utilizzando git push ] (http://stackoverflow.com/questions/279169/deploy-a-project-using-git-push). Una buona possibilità è [git config receive.denyCurrentBranch updateInstead] (http://stackoverflow.com/a/28381235/895245) sul telecomando. –

risposta

10

sguardo al git URL porzione del http://www.kernel.org/pub/software/scm/git/docs/v1.6.0.6/git-push.html

così si avrebbe cercato:

git push ssh://[email protected]/~admin/domain.com/ master 

aggiunto: Credo che parte di ciò che si sta chiedendo è come avere più repository remoti .

git remote add webserver ssh://[email protected]/~admin/domain.com/ 

che consente di eseguire:

git push origin master 
    git push webserver master 
+1

Il problema è che push e pull non sono intercambiabili. Passare a un repository non modificherà il ramo di lavoro. – cmcginty

+0

@Casey, se hai letto la domanda, sta solo chiedendo come spingere, non menziona il tentativo di aggiornare l'albero di lavoro. Probabilmente hai ragione su ciò che ha intenzione di fare, ma il voto negativo sembra un po 'duro per prendere la sua domanda al valore nominale. –

+0

Nella domanda il suo attuale flusso di lavoro è "git pull origin master" – cmcginty

4

Penso che la funzione che si sta cercando è descritto qui: http://debuggable.com/posts/git-tip-auto-update-working-tree-via-post-receive-hook:49551efe-6414-4e86-aec6-544f4834cda3

Da local è possibile aggiungere il server web come un telecomando, proprio come ne farebbe qualsiasi altro:

git remote add webserver [email protected]:/path/to/repo.git/ 
# push only master branch by default 
git config remote.webserver.push master 

Ora quando leggi y per spingere si può solo fare:

git push webserver 
33

sì, si può spingere direttamente al server web, ma io non lo consiglio dato che si dovrebbe solo spingere al repository clonati con l'argomento --bare. Userò il sistema git hook per consentire al repository principale di aggiornare automaticamente il repository sul server web. Controlla la gancio post-aggiornamento:

http://git-scm.com/docs/githooks

Questo script potrebbe a sua volta accesso al server web tramite ssh e fare

cd ~/domain.com/ 
git checkout master 
git pull origin master 

In questo modo hai solo bisogno di concentrarsi sulla spinta al server centrale e non devono preoccuparsi del server web, sarà sempre aggiornato una volta che è stata fatta una spinta.Se è possibile automatizzare qualcosa, quindi automatizzarlo :)

Ho anche trovato un buon articolo per l'accesso tramite ssh in uno script (se è necessario utilizzare la password, questo è banale se è stata configurata una chiave ssh) :

http://bash.cyberciti.biz/security/expect-ssh-login-script/

Spero che questo aiuti!

28

Ho avuto la stessa query e non sono soddisfatto della risposta attualmente votata in alto qui, ho finito per seguire git-website-howto che delinea il processo abbastanza bene e IMO è un approccio molto più pulito e veloce.

TL; DR, git init --bare per creare un nuovo repository sul server Web in cui verranno trasferite le modifiche dalla macchina di sviluppo. Quando il web repo riceve le tue modifiche, attiva il gancio di post-ricezione che copia i file nella tua web root.

Mi piace questo approccio perché il gancio di post-ricezione fa il lavoro sul tuo server in modo che la tua macchina locale possa spingere molto più velocemente e liberarsi. Ciò rende anche molto facile impostare il monitoraggio remoto per un particolare ramo. Quindi potresti avere un ramo chiamato production per aggiornare il tuo server web, mentre il tuo master continua ad essere per lo sviluppo e il link al tuo repository git altrove.

Nota: è necessario eseguire git config receive.denycurrentbranch ignore sul repository del server Web per sopprimere un avviso sulla casella dev locale quando si preme.

+0

l'howto ha funzionato alla grande per me. perché stavo lavorando in una directory del server a un'altra ho bisogno di sudo un utente nel file 'post-receive'. 'sudo -u -H sh -c" GIT_WORK_TREE =/percorso/a/git checkout live -f "' –

0

Prima di distribuire le modifiche locali, controllare se qualcosa è cambiato sul server di destinazione.

Aggiungi a script di distribuzione per garantire che niente è cambiato sul server:

$ git ls-files -dmo --exclude-standard 

sarà vuota se non ci sono file non modificati, più facile che il parsing git status