clone git tramite ssh


233

Ho un progetto sul quale ho creato un repository git:

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

Volevo creare un clone nudo su un'altra macchina:

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

Ho eseguito il clone ma non ho stampato alcuna risposta. Ho effettuato l'accesso al computer server e ho provato a vedere come sono archiviati i file. Il percorso / GitRepos era vuoto, quindi ho deciso di fare di nuovo il clone:

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

Questa volta la risposta è stata:

fatal: il percorso di destinazione 'ssh: // user @ server: /GitRepos/myproject.git' esiste già e non è una directory vuota.

Ma ho visto che il percorso era vuoto.
Cosa sta succedendo qui ?


Non penso che correre git clone --barefarà quello che pensi che farà.
Wolfer,

3
Per me, ssh: // ha creato una cartella, invece di usare un protocollo remoto. Fai funzionare le cose usando la risposta di @ alec-the-geek. Ti dispiacerebbe selezionare una risposta preferita per questo - è il tuo lavoro.
akauppi

1
@akauppi: E 'responsabilità del PO a prendere in considerazione tutte le risposte, ma sono sotto alcun obbligo di selezionare una risposta fino a quando non sono soddisfatti. (Certo, non fa male ricordare loro o chiedere quali ulteriori informazioni sono necessarie affinché una risposta sia accettabile per loro!)
jvriesem,

@jvriesem ovviamente. Rimuoverebbe "è il tuo lavoro" ora. Ma è una cosa vecchia ... :)
akauppi,

Risposte:


219

Questo è probabilmente non correlato direttamente alla domanda; ma un errore che ho appena fatto, e vedo nell'OP, è la specifica dell'URL ssh://user@server:/GitRepos/myproject.git- vale a dire, hai entrambi i due punti :e una barra /dopo che significa un percorso assoluto.

Ho quindi trovato il clone di Git, ssh: Impossibile risolvere il nome host - git, sviluppo - Nicolas Kuttler (dato che era l'errore che stavo ottenendo, nella gitversione 1.7.9.5), notando:

Il problema con il comando che ho usato inizialmente era che ho provato a usare una sintassi simile a SCP.

... che era anche il mio problema! Quindi, fondamentalmente in gitcon ssh, si sia uso

  • ssh://username@host.xz/absolute/path/to/repo.git/ - solo una barra per il percorso assoluto sul server
  • username@host.xz:relative/path/to/repo.git/- solo due punti (non deve avere il ssh://percorso relativo sul server (rispetto alla directory home del usernamecomputer server)

Spero che questo aiuti qualcuno,
Salute!


84
Questo non funziona Se si desidera specificare un percorso relativo con ssh, è necessario perdere il ssh://prefisso. Ho appena trascorso 20 minuti cercando di capirlo. git clone username@host.xz:relative/path/to/repo.git/dovrebbe funzionare.
bobbaluba,

2
Ho provato con git 2.1.4 su un Debian 8. O le sugestions non funzionano. Nessuna directory è stata creata in / GitRepos al primo tentativo e al 2 ° tentativo si è lamentata dell'esistenza del percorso. Proprio come il problema originale riportato
dlsa

5
A causa del tuo commento @bobbaluba (e della risposta aggiornata), non ho dovuto dedicare 20 minuti anche a questo. Grazie!
olafure il

143

Per i repository su GitHub, prova:

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

Per configurare git per clonare tramite ssh, consultare:


<user> è il mio nome utente in github o il mio indirizzo e-mail per github? perché questo link mi suggerisce di utilizzare l'indirizzo e-mail durante la generazione della chiave pubblica. help.github.com/en/github/authenticating-to-github/… dopo aver provato (passphrase vuota per il gen chiave ssh), non riuscivo ancora a clonare repository da github. ps non ho aggiunto la chiave all'agente.
Minnie,

lo stesso vale anche per gitlab. prima di ciò, dobbiamo abilitare la configurazione della chiave SSH, come hai suggerito
Venkataraman R

45

È necessario eseguire il comando clone su ciò che si chiama il server. Ma scommetto che non stai eseguendo un server SSH sul tuo client locale, quindi non funzionerà comunque. Ti suggerisco di seguire questo approccio (controlla il manuale perché lo sto facendo dalla memoria)

  1. Accedi al server.
  2. Creare un repository nudo utilizzando git init --bare
  3. Sul computer client è possibile inviare il repository al server. git remote add origin ssh://user@server:/GitRepos/myproject.gitseguito dagit push origin master

Ottimo consiglio! Alcune note per i nuovi arrivati ​​(come me) che non hanno mai trattato cartelle pure-server-git: 2. cd / GitRepos; mkdir myproject.git; cd myproject.git prima di git init --bare. Non otterrai una copia di lavoro qui: i file e le cartelle dei repository (normalmente in .git) saranno nudi per te, quindi il nome della bandiera. Grazie
akauppi il

2
"git init --bare" non crea una directory .git. Mette i file direttamente nella cartella. Quando aggiungo l'origine remota ottengo: "" fatale: non un repository git (o nessun genitore fino al mount point / home) Arresto al limite del filesystem (GIT_DISCOVERY_ACROSS_FILESYSTEM non impostato).
dlsa,

10

Disclaimer: questa è solo una copia di un commento di bobbaluba reso più visibile per i futuri visitatori. Mi ha aiutato più di ogni altra risposta.


Devi rilasciare il ssh://prefisso quando lo usi git clonecome esempio

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

5

prova questo.

Passo 1:

ls -al ~/.ssh

inserisci qui la descrizione dell'immagine

Passo 2:

ssh-keygen 

(usando il tasto Invio per il valore predefinito) inserisci qui la descrizione dell'immagine Passaggio 3: per impostare il file di configurazione

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

Host gitlab.com
Nome host gitlab.com
User git
IdentityFile ~ / .ssh / id_rsa

Step 4:

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

inserisci qui la descrizione dell'immagine

Passaggio 5:
Al termine del passaggio 4
1. il file test2.git verrà scaricato fatto
2. otterrai il nuovo file (known_hosts) in ~ / .ssh
inserisci qui la descrizione dell'immagine

PS: creo id_rsa e id_rsa.ub da solo e lo invio al server Gitlab. utilizzando entrambe le chiavi su qualsiasi lato client (Windows e Linux).


4

Git 101:

gitè un sistema di controllo versione decentralizzato. Non è necessario un server per essere operativo con git. Potresti comunque volerlo fare perché sembra bello, giusto? (È anche utile se si desidera lavorare su un singolo progetto da più computer.)

Quindi per far funzionare un "server" è necessario eseguire in git init --bare <your_project>.gitquanto ciò creerà un repository vuoto, che sarà quindi possibile importare sui propri computer senza dover passare in rassegna i file di configurazione nella propria directory .git.

Successivamente, è possibile clonare il repository sui client in quanto dovrebbe funzionare, ma ho scoperto che alcuni client (in particolare git-gui) non riusciranno a clonare un repository completamente vuoto. Per ovviare a questo è necessario eseguire cd <your_project>.git && touch <some_random_file> && git add <some_random_file> && git commit && git push origin master. (Si noti che potrebbe essere necessario configurare il nome utente e l'e-mail per il git di quella macchina se non lo si fosse fatto in passato. I comandi effettivi da eseguire saranno nel messaggio di errore visualizzato, quindi li ometterò.)

Quindi a questo punto puoi clonare il repository su qualsiasi macchina semplicemente eseguendo git clone <user>@<server>:<relative_path><your_project>.git. (Come altri hanno sottolineato, potrebbe essere necessario aggiungere il prefisso ssh://se si utilizza il percorso assoluto.) Ciò presuppone che sia già possibile accedere dal client al server. (Riceverai anche punti bonus per l'impostazione di un file di configurazione e chiavi per ssh, se hai intenzione di inviare un sacco di cose al server remoto.)

Alcuni collegamenti pertinenti:
questo ti dice praticamente quello che devi sapere.
E questo è per coloro che conoscono il funzionamento di base di Git ma a volte dimenticano l'esatta sintassi.


Entrambi questi collegamenti ora sembrano essere morti o non mostrano ciò che ti aspettavi.
Todd,

2

Voglio tentare una risposta che includa git-flow e tre "punti" o casi d'uso, il repository centrale git, lo sviluppo locale e la macchina di produzione. Questo non è ben testato .

Sto dando comandi incredibilmente specifici. Invece di dire <your folder>, dirò /root/git. L'unico posto in cui sto cambiando il comando originale è la sostituzione del mio nome server specifico con example.com. Spiegherò lo scopo delle cartelle in modo da poterlo regolare di conseguenza. Per favore fatemi sapere di qualsiasi confusione e aggiornerò la risposta.

La versione git sul server è 1.7.1. Il server è CentOS 6.3 (Final).

La versione git sulla macchina di sviluppo è 1.8.1.1. Questo è Mac OS X 10.8.4.

Il repository centrale e la macchina di produzione si trovano sulla stessa macchina.

il repository centrale, a cui gli utenti svn possono riferirsi come 'server' è configurato come segue. Ho una cartella in /root/gitcui conservo tutti i miei repository git. Voglio creare un repository git per un progetto che chiamo "fiori".

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

Il comando git ha dato due messaggi:

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

Nulla di cui preoccuparsi.

Sulla macchina di sviluppo è configurato come segue. Ho una cartella in /home/kinjal/Sitescui metto tutti i miei progetti. Ora voglio ottenere il repository git centrale.

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

Questo mi porta a un punto in cui posso iniziare ad aggiungere roba. Ho prima impostato git flow

git flow init -d

Per impostazione predefinita, questo è sul ramo develop. Aggiungo il mio codice qui, ora. Quindi devo impegnarmi nel repository git centrale.

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

A questo punto ha spinto al ramo di sviluppo. Voglio aggiungere anche questo al ramo principale.

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

Nota che non ho fatto nulla tra l'inizio e la fine del rilascio. E quando ho terminato il rilascio, mi è stato chiesto di modificare due file. Ciò ha spinto il ramo di sviluppo a padroneggiare.

Sul sito di produzione, che si trova sulla stessa macchina del mio repository git centrale, voglio inserire il repository /var/www/vhosts/example.net. L'ho già fatto /var/www/vhosts.

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

Se anche la macchina di produzione si trovasse su una macchina diversa, il git clonecomando sarebbe simile a quello utilizzato sulla macchina di sviluppo.


1

In anticipo, mi mancano un po 'le mie capacità GIT.

Questo clonerà un repository nudo sul tuo computer, che contiene solo le cartelle all'interno delle .gitquali è una directory nascosta. eseguire ls -ale si dovrebbe vedere .gito cd .gitall'interno del proprio repository.

Puoi aggiungere una descrizione del tuo intento in modo che qualcuno con più abilità GIT possa aiutarti? Cosa vuoi davvero fare non come pensi di farlo?


Ho frainteso il comando. Quello che ho fatto è stato creare un albero della sottodirectory ssh: /myproject.git nella directory corrente. Pensavo di clonare su una directory remota, ma ciò che fa veramente il comando è clonare da un repository.
dlsa,

0

Ho fatto: git clone --bare "/ GITREPOSITORIES / RepoA" "ssh: // luc @ EERSTENASDS119J / volume1 / RepoA" Risultato: fatale: percorso di destinazione 'ssh: // luc @ EERSTENASDS119J / volume1 / RepoA' esiste già ed è non una directory vuota.

Il sistema ha creato una directory ssh: // luc @ EERSTENASDS119J / volume1 / RepoA nel mio percorso attuale.

Quindi git clone non ha interpretato la specifica dell'URL. Utilizzata la soluzione alternativa di Alec.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.