2010-11-10 7 views
22

Nous sommes en train de migrer de Mercurial vers Git pour notre flux de travail et j'ai deux problèmes mineurs.git clone de local à distant

D'abord, est-il possible de "cloner" un référentiel local directement dans un répertoire distant (ssh) vide?

Actuellement, lorsque nous créons un nouveau site web, nous clonons notre CMS localement, nous le configurons et ensuite nous le clonons sur le repo central et sur le serveur web (hg clone . ssh://[email protected]/www). De cette façon, nous avons un accès instantané à la qualité push/pull. Cela m'amène au deuxième problème, le déploiement à distance.

Actuellement avec Mercurial, j'ai un simple hook dans le repos distant qui exécute hg up quand un changeset est reçu. Pour faire la même chose avec Git, j'ai suivi les instructions ici: http://caiustheory.com/automatically-deploying-website-from-remote-git-repository mais j'aimerais conserver le répertoire .git dans la racine du site comme c'est le cas avec Mercurial (il est protégé par Apache config et je peux N'exportez pas GIT_DIR pour tous les comptes, car certains ont plusieurs sites Web/repos).

Est-il possible d'avoir fondamentalement la même configuration sans séparer le répertoire de travail des repos?

Répondre

31

Pour répondre à votre première question, oui, vous pouvez. Supposons que le répertoire distant est ssh://[email protected]/home/user/repo. Cela doit être un référentiel git, créez cela avec git init --bare ou scp votre répertoire local repo.git (peut être créé avec git clone) à distance. Puis faites:

git remote add origin ssh://[email protected]/home/user/repo 
git push --all origin 

Cela va pousser toutes les branches existantes localement vers le dépôt distant.

Pour passer à la question suivante, vous devriez pouvoir faire la même chose en utilisant un ensemble de commandes différent. Essayez:

$ cd /var/www # or wherever 
$ mkdir somesite 
$ cd somesite/ 
$ git init 
$ git --bare update-server-info 
$ git config receive.denycurrentbranch ignore 
$ cat > hooks/post-receive 
#!/bin/sh 
git checkout -f 
^D 
$ chmod +x hooks/post-receive 

Vous, bien sûr, exécutez les commandes à distance/push ci-dessus après cette étape. Vous devrez peut-être vérifier une branche spécifique après cela, de sorte que le clone "somesite" sur le serveur sache réellement quelle branche suivre. À partir de ce moment-là, pousser vers ce dépôt devrait déclencher une nouvelle vérification de cette branche.

+0

comme un ajout, sur la « git push ", j'ai l'habitude de spécifier la branche sur laquelle je pousse. Donc, votre déclaration push dans mon cas va lire "git push --all origine maître" – iGbanam

+0

Si vous voulez faire cela, sortez le --all ou git les poussera tous de toute façon. :) – cdhowie

+0

Merci pour la réponse. La première partie fonctionne bien même si je reçois un avertissement concernant la mise à jour de la branche actuelle lorsque je la pousse (sur un repos seul qui disparaît). Pour la deuxième partie, je manque peut-être quelque chose. Après "git init" je devais entrer dans .git sinon le update-server-info ne fonctionnerait pas. Après cela, les hooks post-réception semblent fonctionner mais ne supprime pas les fichiers, il les marque seulement comme non-suivis (la mise à jour de hg me ramènerait dans l'état correct s'il n'y avait pas de changements sur la télécommande). – hlidotbe

4

Cette réponse est bonne mais je n'ai pas réussi à la faire fonctionner pour moi. Le code suivant de ce lien a fait http://thelucid.com/2008/12/02/git-setting-up-a-remote-repository-and-doing-an-initial-push/. Sur la course à distance

mkdir my_project.git 
cd my_project.git 
git init --bare 
git-update-server-info # If planning to serve via HTTP 

localement sur un référentiel existant qui a déjà au moins un allouent exécuter

git remote add origin [email protected]:my_project.git 
git push -u origin master 

J'espère que cela aide quelqu'un qui a eu des problèmes avec l'autre réponse.

2

git équivalent à Easiest hg clone . ssh://[email protected]/www est:

rsync -avz . ssh://[email protected]/www/reponame 

En fait, j'ai ajouté cette ligne à ~ /.bash_aliases pour refléter un répertoire où:

alias mirror="rsync -avz . ssh://[email protected]`pwd` --delete" 

Il pourrait se révéler dangereux si vous arrive d'être dans un répertoire spécial/dev ou/bin. Faites attention.

22

J'ai aussi rencontré ce problème récemment et résolu comme suit:

sur le serveur distant:

1: Créer un répertoire/tmp/nu
2: Changement dans ce répertoire
3 : Exécuter git initialisation --bare

sur la machine locale:

1: Modification de votre projet git répertoire
2: git ajouter à distance ssh nu: // serveur utilisateur @/tmp/nu
3: git push --all nu
4: git supprimer à distance nu

sur le serveur distant:

1 : clone git/tmp/nu/chemin/vers/votre/clone

sur la machine locale:

1: git remote add origine ssh: // serveur utilisateur @/chemin/vers/votre/clone

Ceci est un peu impliqué, mais cela fonctionne et ne nécessite pas de définir des drapeaux étranges ou d'instruire git pour remplacer ses comportements par défaut. Il est donc très sûr.

+0

Depuis que vous avez indiqué que c'est * sûr *, je l'ai essayé. Ça a l'air ça marche (pour moi). –

+0

Celui-ci a travaillé avec moi ... –

1

Je suis d'accord avec, et améliorer sur presto8 en supprimant les fichiers sans correspondance.

rsync -avz . ssh://[email protected]/www/reponame --delete 
0

Juste pour vous donner une alternative, vous pouvez utiliser:

git remote set-url origin git://other.url.here 

Ceux-ci fonctionnent également si votre respository git locale pointe vers un autre dépôt distant

Questions connexes