2010-09-16 9 views
40

Nous avons un site web qui contient tous ses fichiers PHP/HTML/JS/CSS/etc stockés dans un dépôt Git.Git push to live server

Nous avons actuellement 3 types d'ordinateurs (ou de cas d'utilisation) pour le référentiel.

  • développeur local: tirer les dernières modifications, apporter des modifications, engager à repo local, pousser au serveur maître
  • serveur maître: référentiel central, tous les changements sont poussés vers le serveur maître
  • serveur Web: changements tiré vers le bas à partir du serveur maître lors du déploiement du site

donc actuellement nous:

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

Donc, ma question est la suivante: y a-t-il un moyen que je puisse pousser directement sur le serveur web depuis mon ordinateur local?

ie.

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

double possible de [déployer un projet en utilisant git push ] (http://stackoverflow.com/questions/279169/deploy-a-project-using-git-push). Une bonne possibilité est [git config receive.denyCurrentBranch updateInstead] (http://stackoverflow.com/a/28381235/895245) sur la télécommande. –

Répondre

10

Regardez la git urls partie de http://www.kernel.org/pub/software/scm/git/docs/v1.6.0.6/git-push.html

vous tenterait donc:

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

AJOUTÉE: Je pense qu'une partie de ce que vous demandez comment d'avoir plusieurs dépôts distants .

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

qui vous permet d'exécuter:

git push origin master 
    git push webserver master 
+1

Le problème est que la poussée et la traction ne sont pas interchangeables. Pousser vers un repo ne modifiera pas la branche de travail. – cmcginty

+0

@Casey, si vous lisez la question, il demande simplement comment pousser, il ne mentionne pas d'essayer de mettre à jour l'arbre de travail. Vous avez probablement raison sur ce qu'il a l'intention de faire, mais le vote vers le bas semble un peu dur pour prendre sa question à leur valeur nominale. –

+0

Dans la question son flux de travail actuel est "git pull master master" – cmcginty

4

Je pense que la fonction que vous recherchez est décrit ici: http://debuggable.com/posts/git-tip-auto-update-working-tree-via-post-receive-hook:49551efe-6414-4e86-aec6-544f4834cda3

De local vous pouvez ajouter le serveur Web comme une télécommande, tout comme vous feriez tout autre:

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

maintenant, quand votre lecture y pousser, vous pouvez simplement faire:

git push webserver 
33

Oui vous pouvez pousser directement sur votre serveur web, mais je ne le recommanderais pas puisque vous ne devez pousser à des dépôts clonés avec l'argument --bare. J'utiliserais le système git hook pour que le référentiel principal mette à jour automatiquement le repo sur le serveur web. Consultez le crochet post-mise à jour dans:

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

Ce script pourrait en connexion à son tour sur le serveur Web via ssh et faire

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

De cette façon, vous avez seulement besoin de se concentrer sur pousser au serveur central et ne doivent pas se préoccuper du serveur Web, il sera toujours mis à jour une fois qu'une poussée a été faite.Si vous pouvez automatiser quelque chose, alors automatisez-le :)

J'ai même trouvé un bon article pour vous connecter via ssh dans un script (si vous devez utiliser un mot de passe, c'est trivial si une clé ssh a été configurée) :

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

Hope this helps!

28

J'ai eu la même requête et pas satisfait de la réponse actuellement la plus votée ici, a fini par suivre git-website-howto qui décrit assez bien le processus et est une approche beaucoup plus propre et plus rapide.

TL; DR, git init --bare pour créer un repo frais sur votre serveur web où vous pousserez vos changements de votre machine dev. Lorsque le référentiel Web reçoit vos modifications, il déclenche le hook post-réception qui copie ensuite les fichiers sur votre racine Web.

J'aime cette approche parce que le crochet post-réception fait le travail sur votre serveur afin que votre machine locale puisse pousser beaucoup plus vite et se libérer. Cela rend également très facile la configuration du suivi à distance pour une branche particulière. Ainsi, vous pouvez avoir une branche appelée production pour mettre à jour votre serveur Web, alors que votre maître continue d'être pour le développement et le lien vers votre repo git ailleurs.

Remarque: vous devez exécuter git config receive.denycurrentbranch ignore sur votre serveur Web pour supprimer un avertissement sur votre boîte de dev locale lorsque vous appuyez sur. Avant de déployer les modifications locales, vérifiez si quelque chose a changé sur le serveur cible.

+0

le howto a bien fonctionné pour moi. parce que je travaillais dans un répertoire du serveur à l'autre j'ai eu besoin de sudo un utilisateur dans le fichier 'post-receive'. 'sudo -u -H sh -c" GIT_WORK_TREE =/chemin/vers/live git checkout -f "' –

0

Ajouter au script de déploiement pour assurer rien n'a changé sur le serveur:

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

seront vides s'il y a des fichiers non modifiés, plus facile que l'analyse syntaxique git status