web-dev-qa-db-fra.com

clone git de local à distant

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

Premièrement, 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 fondamentalement notre CMS localement, le configurons puis nous le clonons sur le référentiel central et sur le serveur Web (hg clone . ssh://account@server/www). De cette façon, nous avons un accès instantané à la bonté Push/Pull. 

Cela m'amène au deuxième problème, le déploiement à distance.

Actuellement, chez Mercurial, j'ai un simple crochet dans le dépôt distant qui exécute hg up lors de la réception d'un changeset.

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 Web, comme c'est le cas avec Mercurial (il est protégé par Apache Config et je ne peux pas exporter GIT_DIR pour tous les comptes, car certains ont plus d'un site Web/repos).

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

26
hlidotbe

Pour répondre à votre première question, oui, vous le pouvez. Supposons que le répertoire distant est ssh://user@Host/home/user/repo. Ce doit être un référentiel git, créez-le avec git init --bare ou scp votre répertoire local repo.git (pouvant être créé avec git clone) sur distant. Alors fais:

git remote add Origin ssh://user@Host/home/user/repo
git Push --all Origin

Cela poussera toutes les branches existantes localement vers le référentiel distant.

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

$ 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 devez bien sûr exécuter les commandes à distance/Push au-dessus de après cette étape. Vous devrez peut-être extraire une branche spécifique par la suite, de sorte que le clone "somesite" sur le serveur sache réellement quelle branche suivre. À partir de là, pousser dans ce référentiel devrait déclencher une nouvelle vérification de cette branche.

37
cdhowie

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

Sur le serveur distant:

1: Créer un répertoire nommé/tmp/bare
2: Changer dans ce répertoire
3: Exécute git init --bare

Sur la machine locale:

1: Accédez au répertoire de votre projet git.
2: git remote ajoute bare ssh: // utilisateur @ serveur/tmp/bare
3: git Push - tout nu
4: git remote supprimer nu

Sur le serveur distant:

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

Sur la machine locale:

1: git remote ajoute Origin ssh: // utilisateur @ serveur/chemin/à/votre/clone

Ceci est un peu impliqué, mais cela fonctionne et ne nécessite pas la définition d’indicateurs étranges ou l’instruction donnée à git de remplacer ses comportements par défaut. C'est donc assez sûr.

23
OOPMan

Cette réponse est bonne mais je n'ai pas réussi à la faire fonctionner pour moi. Le code suivant de ce lien a 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 ayant déjà au moins une exécution de validation

git remote add Origin [email protected]:my_project.git
git Push -u Origin master

J'espère que cela aide tous ceux qui ont eu des problèmes avec l'autre réponse.

4
AmaDaden

Le plus simple équivalent git à hg clone . ssh://account@server/www est:

rsync -avz . ssh://account@server/www/reponame

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

alias mirror="rsync -avz . ssh://account@server`pwd` --delete"

Cela peut s'avérer dangereux si vous vous trouvez dans un répertoire spécial tel que/dev ou /bin.Be prudent.

3
presto8

Je suis d'accord avec et améliore sur presto8 en supprimant les fichiers non appariés.

rsync -avz . ssh://account@server/www/reponame --delete
1
jlettvin

Juste pour vous donner une alternative, vous pouvez utiliser:

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

Cela fonctionne aussi si votre repository git local pointe vers un autre repository distant

0
dani24