git clone via ssh


233

J'ai un projet sur lequel j'ai créé un référentiel git:

$ cd myproject  
$ git init  
$ git add .  
$ git commit  

Je voulais créer un clone nu sur une autre machine:

$ cd ..  
$ git clone --bare myproject  ssh://user@server:/GitRepos/myproject.git  

J'ai exécuté le clone mais n'ai imprimé aucune réponse. Je me suis connecté à la machine serveur et j'ai essayé de voir comment les fichiers sont stockés. Le chemin / GitRepos était vide, j'ai donc décidé de refaire le clone:

$ git clone --bare myproject  ssh://user@server:/GitRepos/myproject.git

Cette fois, la réponse fut:

fatal: le chemin de destination 'ssh: // user @ server: /GitRepos/myproject.git' existe déjà et n'est pas un répertoire vide.

Mais j'ai vu que le chemin était vide.
Que se passe t-il ici ?


Je ne pense pas que courir git clone --barefera ce que vous pensez qu'il fera.
Wolfer

3
Pour moi, le ssh: // a créé un dossier, au lieu d'utiliser un protocole distant. Vous avez des choses à travailler en utilisant la réponse de @ alec-the-geek. Pourriez-vous choisir une réponse préférée pour cela - c'est votre travail.
akauppi

1
@akauppi: Il est de la responsabilité du PO de considérer toutes les réponses, mais il n'est pas obligé de sélectionner une réponse jusqu'à ce qu'il soit satisfait. (Bien sûr, cela ne fait pas de mal de leur rappeler ou de demander de quelles informations supplémentaires ils ont besoin pour qu'une réponse soit acceptable pour eux!)
jvriesem

@jvriesem bien sûr. Supprimerait le "c'est votre travail" maintenant. Mais c'est une vieille chose ... :)
akauppi

Réponses:


219

Ceci n'est peut-être pas directement lié à la question; mais une erreur que je viens de faire moi-même, et je vois dans l'OP, est la spécification d'URL ssh://user@server:/GitRepos/myproject.git- à savoir, vous avez à la fois un deux-points :et une barre oblique /après cela signifiant un chemin absolu.

J'ai ensuite trouvé le clone Git, ssh: Impossible de résoudre le nom d'hôte - git, développement - Nicolas Kuttler (car c'était l'erreur que j'obtenais, sur la gitversion 1.7.9.5), notant:

Le problème avec la commande que j'ai utilisée au départ était que j'essayais d'utiliser une syntaxe de type scp.

... qui était aussi mon problème! Donc , fondamentalement , dans gitavec ssh, soit vous utilisation

  • ssh://username@host.xz/absolute/path/to/repo.git/ - juste une barre oblique pour le chemin absolu sur le serveur
  • username@host.xz:relative/path/to/repo.git/- juste deux points (il ne doit pas avoir le ssh://chemin relatif pour sur le serveur (par rapport au répertoire personnel de la usernamemachine serveur)

J'espère que cela aide quelqu'un,
Cheers!


84
Ça ne marche pas. Si vous souhaitez spécifier un chemin relatif avec ssh, vous devez perdre le ssh://préfixe. Je viens de passer 20 minutes à essayer de comprendre cela. git clone username@host.xz:relative/path/to/repo.git/devrait marcher.
bobbaluba

2
Je l'ai essayé avec git 2.1.4 sur un Debian 8. Les deux suggestions ne fonctionnent pas. Aucun répertoire n'a été créé sous / GitRepos à la première tentative, et à la deuxième tentative, il s'est plaint que le chemin existait déjà. Tout comme le problème d'origine signalé
dlsa

5
En raison de votre commentaire @bobbaluba (et de la réponse mise à jour), je n'ai pas eu à consacrer 20 minutes à cela également. Merci!
olafure

143

Pour les référentiels sur GitHub, essayez:

git clone ssh://git@github.com/<user>/<repository name>.git

Pour configurer git pour cloner via ssh, voir:


est <utilisateur> mon nom d'utilisateur dans github ou mon adresse e-mail pour le github? car ce lien me suggère d'utiliser l'adresse e-mail lors de la génération de la clé publique. help.github.com/en/github/authenticating-to-github/… après avoir essayé cela (phrase de passe vide pour la génération de clé ssh), je ne pouvais toujours pas cloner le dépôt à partir de github. ps je n'ai pas ajouté la clé à l'agent.
Minnie

fonctionne également pour gitlab. avant cela, nous devons activer la configuration de la clé SSH, comme vous l'avez suggéré
Venkataraman R

45

Vous devez exécuter la commande clone sur ce que vous appelez le serveur. Mais je parie que vous n'exécutez pas de serveur ssh sur votre client local, ce qui ne fonctionnera pas de toute façon. Je vous suggère de suivre cette approche (consultez le manuel car je le fais de mémoire)

  1. Connectez-vous à la machine serveur.
  2. Créer un référentiel nu à l'aide git init --bare
  3. Sur la machine cliente, vous pouvez envoyer votre dépôt au serveur. git remote add origin ssh://user@server:/GitRepos/myproject.gitsuivi pargit push origin master

Très bon conseil! Quelques notes pour les nouveaux arrivants (comme moi) qui n'ont pas traité de dossiers git-pure-server avant: 2. cd / GitRepos; mkdir myproject.git; cd myproject.git avant le git init --bare. Vous n'obtiendrez pas de copie de travail ici - les fichiers et dossiers de dépôt (normalement en .git) seront dévoilés pour vous, d'où le nom du drapeau. Merci
akauppi

2
"git init --bare" ne crée pas de répertoire .git. Il place les fichiers directement dans le dossier. Lors de l'ajout de l'origine distante, j'obtiens: "" fatal: Pas un dépôt git (ou aucun parent jusqu'au point de montage / home) Arrêt à la limite du système de fichiers (GIT_DISCOVERY_ACROSS_FILESYSTEM non défini).
dlsa

10

Avertissement: Ceci est juste une copie d'un commentaire de bobbaluba rendu plus visible pour les futurs visiteurs. Cela m'a aidé plus que toute autre réponse.


Vous devez supprimer le ssh://préfixe lors de l'utilisation git clonecomme exemple

git clone git@github.com:owner/repo.git

5

essaye ça.

Étape 1:

ls -al ~/.ssh

entrez la description de l'image ici

Étape 2:

ssh-keygen 

(en utilisant la touche entrée pour la valeur par défaut) entrez la description de l'image ici Étape 3: pour configurer le fichier de configuration

vim /c/Users/Willie/.ssh/config

Hôte gitlab.com
HostName gitlab.com
Utilisateur git
IdentityFile ~ / .ssh / id_rsa

Étape 4:

git clone git@gitlab.com:<username>/test2.git

entrez la description de l'image ici

Étape 5:
Lorsque vous avez terminé l'étape 4
1. le fichier test2.git sera téléchargé
2. vous obtiendrez le nouveau fichier (known_hosts) dans le ~ / .ssh
entrez la description de l'image ici

PS: je crée id_rsa et id_rsa.ub par meself et je le remets au serveur Gitlab. en utilisant les deux clés vers n'importe quel côté client (Windows et Linux).


4

Git 101:

gitest un système de contrôle de version décentralisé. Vous n'avez pas besoin d'un serveur pour être opérationnel avec git. Pourtant, vous voudrez peut-être faire cela car il a l'air cool, non? (Il est également utile si vous souhaitez travailler sur un seul projet à partir de plusieurs ordinateurs.)

Donc, pour faire fonctionner un "serveur", vous devez l'exécuter git init --bare <your_project>.gitcar cela créera un référentiel vide, que vous pourrez ensuite importer sur vos machines sans avoir à fouiller dans les fichiers de configuration de votre répertoire .git.

Après cela, vous pouvez cloner le référentiel sur vos clients car il est censé fonctionner, mais j'ai constaté que certains clients (à savoir git-gui) ne parviendront pas à cloner un référentiel complètement vide. Pour contourner ce problème, vous devez exécuter cd <your_project>.git && touch <some_random_file> && git add <some_random_file> && git commit && git push origin master. (Notez que vous devrez peut-être configurer votre nom d'utilisateur et votre e-mail pour le git de cette machine si vous ne l'avez pas déjà fait dans le passé. Les commandes réelles à exécuter seront dans le message d'erreur que vous obtenez, je vais donc les omettre.)

Donc, à ce stade, vous pouvez cloner le référentiel sur n'importe quelle machine simplement en exécutant git clone <user>@<server>:<relative_path><your_project>.git. (Comme d'autres l'ont souligné, vous devrez peut-être le préfixer ssh://si vous utilisez le chemin absolu.) Cela suppose que vous pouvez déjà vous connecter de votre client au serveur. (Vous obtiendrez également des points bonus pour la configuration d'un fichier de configuration et des clés pour ssh, si vous avez l'intention de pousser beaucoup de choses vers le serveur distant.)

Quelques liens pertinents:
cela vous indique à peu près ce que vous devez savoir.
Et c'est pour ceux qui connaissent le fonctionnement de base de git mais oublient parfois la syntaxe exacte.


Ces deux liens semblent maintenant morts ou ne montrent pas ce que vous attendiez d'eux.
Todd

2

Je veux tenter une réponse qui inclut git-flow, et trois «points» ou cas d'utilisation, le référentiel central git, le développement local et la machine de production. Ce n'est pas bien testé .

Je donne des commandes incroyablement spécifiques. Au lieu de dire <your folder>, je dirai /root/git. Le seul endroit où je modifie la commande d'origine est de remplacer mon nom de serveur spécifique par example.com. Je vais expliquer le but des dossiers afin que vous puissiez l'ajuster en conséquence. Veuillez me faire part de toute confusion et je mettrai à jour la réponse.

La version git sur le serveur est 1.7.1. Le serveur est CentOS 6.3 (Final).

La version git sur la machine de développement est 1.8.1.1. Il s'agit de Mac OS X 10.8.4.

Le référentiel central et la machine de production sont sur la même machine.

le référentiel central, auquel les utilisateurs svn peuvent associer en tant que «serveur» est configuré comme suit. J'ai un dossier /root/gitoù je garde tous mes dépôts git. Je veux créer un référentiel git pour un projet que j'appelle «fleurs».

cd /root/git
git clone --bare flowers flowers.git

La commande git a donné deux messages:

Initialized empty Git repository in /root/git/flowers.git/
warning: You appear to have cloned an empty repository.

Rien à craindre.

Sur la machine de développement est configurée comme suit. J'ai un dossier /home/kinjal/Sitesoù je mets tous mes projets. Je veux maintenant obtenir le référentiel central git.

cd /home/kinjal/Sites
git clone root@example.net:/root/git/flowers.git

Cela m'amène à un point où je peux commencer à y ajouter des choses. J'ai d'abord configuré Git Flow

git flow init -d

Par défaut, c'est sur la branche develop. J'ajoute mon code ici, maintenant. Ensuite, je dois m'engager dans le référentiel central git.

git add .
git commit -am 'initial'
git push

À ce stade, il a poussé la branche de développement. Je veux également l'ajouter à la branche principale.

git flow release start v0.0.0 develop
git flow release finish v0.0.0
git push

Notez que je n'ai rien fait entre le début et la fin de la version. Et lorsque j'ai terminé la sortie, j'ai été invité à modifier deux fichiers. Cela a poussé la branche de développement à maîtriser.

Sur le site de production, qui se trouve sur la même machine que mon référentiel central git, je veux mettre le référentiel dedans /var/www/vhosts/example.net. Je l'ai déjà /var/www/vhosts.

cd /var/www/vhosts
git clone file:///root/git/flowers.git example.net

Si la machine de production devait également se trouver sur une autre machine, la git clonecommande ressemblerait à celle utilisée sur la machine de développement.


1

Au départ, je manque un peu de mes compétences GIT.

Cela va cloner un référentiel nu sur votre machine, qui ne contient que les dossiers dans .gitlesquels se trouve un répertoire caché. exécutez ls -alet vous devriez voir .gitou à l' cd .gitintérieur de votre référentiel.

Pouvez-vous ajouter une description de votre intention afin qu'une personne possédant plus de compétences GIT puisse vous aider? Qu'est-ce que vous voulez vraiment faire, pas comment vous comptez le faire?


J'ai mal interprété la commande. J'ai créé une arborescence de sous-répertoires ssh: /myproject.git sous le répertoire courant. Je pensais que je clonais vers un répertoire distant, mais ce que la commande fait vraiment, c'est cloner à partir d'un référentiel.
dlsa

0

J'ai fait: git clone --bare "/ GITREPOSITORIES / RepoA" "ssh: // luc @ EERSTENASDS119J / volume1 / RepoA" Résultat: fatal: chemin de destination 'ssh: // luc @ EERSTENASDS119J / volume1 / RepoA' existe déjà et est pas un répertoire vide.

Le système a créé un répertoire ssh: // luc @ EERSTENASDS119J / volume1 / RepoA dans mon chemin actuel.

Donc, git clone n'a pas interprété la spécification d'URL. Utilisé la solution de contournement d'Alec.


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.