2011-08-22 2 views
9

Je dois pousser git à distance, et cette poussée doit être copie de travail en cours. Parce que, la source poussée est un hôte Web. Donc, les fichiers poussés doivent être en cours d'utilisation. Je suis sûr que personne ne va éditer des fichiers à l'hôte :)git force push répertoire de travail en cours

Cette question est suivi de ces 2 questions, Is it possible to have a git repo inside another git repo et what difference does --bare switch make when initing a git repo?

Edit: repo nu est pas ce que je veux, puisque les fichiers doivent être directement utilisé sur la machine à distance, et doivent être trouvés sur les lieux où je les ai mis.

Edit2: Je crois comprendre que repo nu ne tient pas le fichier hieararchy, et conserver les données de prise en pension dans le répertoire racine

Répondre

10

Voici une étape par étape sur la façon de créer un git sur votre web hôte qui permettra les poussées directes, le configurer comme une télécommande pour votre repo local, et pousser les modifications. Notez que vous devez avoir un accès ssh à votre hébergeur et que git soit installé.

Sur votre hébergeur (ssh'd in):

# create an empty repo on your web host; note its path 
mkdir site 
cd site 
git init 

# configure it to allow pushes to the current checked-out branch 
# without complaining (direct push) 
git config receive.denyCurrentBranch ignore 

avec votre repo local (exécuter ces commandes git à l'intérieur du repo):

# create the reference to the web host remote for pushing 
# /path/to/the/repo is the path to the repo you made above on the web host: 
# it will be an absolute path OR relative to your ssh chroot (depends on the host) 
git remote add deploy ssh://[email protected]_host/path/to/the/repo 

# finally, push your changes! 
git push deploy master 

Maintenant, vos modifications ont été poussé vers le repo check-out sur l'hébergeur. Cependant, ils ne seront pas reflétés dans le répertoire de travail (c'est-à-dire que vos modifications ne prendront pas effet immédiatement). C'est parce que vous avez poussé directement à la branche active. Pour terminer, vous devez soit

  • effectuer manuellement un git checkout -f mettre à jour le Répertoire de travail
  • faire un crochet git post-receive pour le faire automatiquement.

Pour avoir instant, le déploiement automatique avec un crochet post-receive vérifier cette git site deployment howto.

+0

hmm, tout ce dont j'avais besoin était recieve.denyCurrentBranch. Merci :) – yasar

+0

@ yasar11732, assurez-vous de lire la note sur la mise à jour du répertoire de travail. Sans cela, les changements que vous appuierez seront reflétés dans l'historique git mais pas nécessairement dans la branche empruntée qui est votre site. – shelhamer

+0

ouf, c'était un travail difficile pour moi, mais je l'ai quand même réussi. Merci! – yasar

4

Bien que ce soit plutôt ancien, il est extrêmement déconseillé de pousser jusqu'à un arbre qui fonctionne. https://git.wiki.kernel.org/index.php/GitFaq#Unexpected_behavior

Une meilleure méthode serait de créer un repo nu reflétant l'arbre de travail du site.

Tout un repo nu est, est un référentiel sans arbre de travail ou plutôt sans aucun fichier extrait. La hiérarchie existe tout compte fait et peut être vérifiée. En d'autres termes, il agit comme un hôte pour les modifications uniquement.

Sans connaître la hiérarchie des répertoires que vous travaillez avec votre web, je vais supposer qu'il est une mise en page d'un site Web standard en utilisant la maison chroot EG:/home/user/www

Sur le serveur en utilisant ssh avec git installé:

Créer un arbre de travail du site actuel

cd /home/user/public_html 
git init 
git add . 
git commit -m "Initial Commit" 

Créez un dépôt nu à pousser à distance à partir de votre système local

mkdir /home/user/deploy.git 
cd /home/user/deploy.git 
git init --bare 

Lien votre référentiel d'arbre de travail et votre référentiel deploy nu

cd /home/user/public_html 
git remote add deploy /home/user/deploy.git 
git remote show deploy 
* remote deploy 
    URL: /home/user/deploy.git 
git push deploy master 

maintenant mis en place un nouveau repo sur votre système local

git clone ssh://[email protected]/home/user/deploy.git 
git branch -a 
*master 
    remotes/origin/HEAD 
    remotes/origin/master 

Maintenant, nous installons 2 crochets pour faire instantanément des changements à votre web repo à distance quand vous poussez dessus ou si quelqu'un d'autre vous donne accès à la pousser. Depuis ignorer receive.denyCurrentBranch git config conduira à des problèmes à long terme

Sur le serveur distant activer post-mise à jour pour déployer

cd /home/user/deploy.git/hooks 
mv post-update.sample post-update 
vi post-update 

Changer votre crochet post-mise à jour du dessous et enregistrer

#!/bin/sh 
echo "Pulling changes into public_html [deploy post-update]" 
cd /home/user/public_html || exit 
unset GIT_DIR 
git pull deploy master 
exec git update-server-info 

Maintenant, nous configurons votre arborescence de travail Web pour que ses modifications soient déployées si quelque chose est engagé.

cd /home/user/public_html/.git/hooks 
mv post-commit.sample post-commit 
vi post-commit 

changer ensuite post-commit hook à la

#!/bin/sh 
echo "Pushing changes to deploy [public_html post-commit]" 
git push deploy 

suivant Vous avez toujours la possibilité de extrayez votre arbre de travail Web si vous avez besoin. Cela vous permettra de retirer vos modifications du déploiement à l'arborescence de travail de votre site Web lorsque vous appuierez le maître de votre système local. Vous pouvez effectuer des branchements, des rebasages, des restaurations, etc., sans affecter l'arborescence de travail de votre site Web, sans vous soucier des marqueurs de conflit, en utilisant simplement le référentiel de déploiement strict. Si vous avez besoin de plus de contrôle sur ce qui est engagé, vous pouvez utiliser la post-réception au lieu de ou après la mise à jour.

Espérons que cela aide quelqu'un d'autre à faire la même chose que l'OP.

5

Cette question est vraiment ancienne, mais j'ai trouvé une bien meilleure solution (pour ma situation au moins) que les solutions listées ici.

De l'manual pour git config, à partir de Git 2.3.0:

Une autre option est « updateInstead » qui mettra à jour le répertoire de travail (doit être propre) se pousser dans la branche actuelle. Cette option est destinée à la synchronisation des répertoires de travail lorsqu'un côté n'est pas facilement accessible via ssh interactif (par exemple, un site Web en direct, d'où l'exigence que le répertoire de travail soit propre).

Donc git config receive.denyCurrentBranch updateInstead (sur le référentiel de réception) a parfaitement fonctionné pour moi. Il me permet de pousser et met à jour le répertoire de travail du dépôt de réception automatiquement (tant que ce répertoire de travail est propre quand le push se produit).

Questions connexes