git clone a través de ssh


233

Tengo un proyecto en el que creé un repositorio git:

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

Yo quería crear un clon desnudo en otra máquina:

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

Ejecuté el clon pero no imprimí ninguna respuesta. Me conecté a la máquina del servidor e intenté ver cómo se almacenan los archivos. El camino / GitRepos estaba vacío, así que decidí hacer el clon nuevamente:

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

Esta vez la respuesta fue:

fatal: la ruta de destino 'ssh: // usuario @ servidor: /GitRepos/myproject.git' ya existe y no es un directorio vacío.

Pero vi que el camino estaba vacío.
Que está pasando aqui ?


No creo que correr git clone --barehaga lo que crees que hará.
Wolfer

3
Para mí, ssh: // creó una carpeta, en lugar de usar un protocolo remoto. Tengo cosas para trabajar usando la respuesta de @ alec-the-geek. ¿Le importaría seleccionar una respuesta preferida para esto? Es su trabajo.
akauppi

1
@akauppi: Es responsabilidad del PO a considerar todas las respuestas, pero están bajo ninguna obligación de seleccionar una respuesta hasta que esté satisfecho. (¡Por supuesto, no está de más recordarles o preguntar qué información adicional necesitan para que una respuesta sea aceptable para ellos!)
jvriesem

@jvriesem, por supuesto. Eliminaría el "es tu trabajo" ahora. Pero es una cosa vieja ... :)
akauppi

Respuestas:


219

Esto posiblemente no esté relacionado directamente con la pregunta; pero un error que acabo de cometer, y veo en el OP, es la especificación de la URL, es ssh://user@server:/GitRepos/myproject.gitdecir, tiene dos puntos :y una barra diagonal /después de que significa una ruta absoluta.

Luego encontré el clon de Git, ssh: No se pudo resolver el nombre de host - git, desarrollo - Nicolas Kuttler (ya que ese fue el error que estaba recibiendo, en la gitversión 1.7.9.5), señalando:

El problema con el comando que usé inicialmente fue que intenté usar una sintaxis similar a scp.

... que también fue mi problema! Básicamente , gitcon ssh, o usas

  • ssh://username@host.xz/absolute/path/to/repo.git/ - solo una barra diagonal para la ruta absoluta en el servidor
  • username@host.xz:relative/path/to/repo.git/- solo dos puntos (no debe tener la ssh://ruta relativa para en el servidor (en relación con el directorio de inicio de la usernamemáquina del servidor)

Espero que esto ayude a alguien,
¡salud!


84
Esto no funciona Si desea especificar una ruta relativa con ssh, debe perder el ssh://prefijo. Acabo de pasar 20 minutos tratando de resolver esto. git clone username@host.xz:relative/path/to/repo.git/Deberia trabajar.
bobbaluba

2
Lo probé con git 2.1.4 en un Debian 8. Cualquiera de las sugerencias no funciona. No se creó ningún directorio bajo / GitRepos en el primer intento, y en el segundo intento se quejó de que la ruta ya existía. Al igual que el problema original informado
dlsa

55
Debido a tu comentario @bobbaluba (y la respuesta actualizada), no tuve que dedicar 20 minutos a esto también. ¡Gracias!
olafure

143

Para repositorios en GitHub, intente:

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

Para configurar git para clonar a través de ssh, consulte:


¿Es el <usuario> mi nombre de usuario en github o mi dirección de correo electrónico para github? porque este enlace me sugiere usar la dirección de correo electrónico durante la generación de la clave pública help.github.com/en/github/authenticating-to-github/… después de intentar eso (frase de contraseña vacía para la clave ssh gen), todavía no podía clonar el repositorio de github. ps No agregué la clave al agente.
Minnie

Lo mismo funciona para Gitlab también. antes de eso, debemos habilitar la configuración de la clave SSH, como usted ha sugerido
Venkataraman R

45

Debe ejecutar el comando clonar en lo que está llamando al servidor. Pero apuesto a que no está ejecutando un servidor ssh en su cliente local, por lo que no funcionará de todos modos. Le sugiero que siga este enfoque (consulte el manual porque lo estoy haciendo de memoria)

  1. Inicie sesión en la máquina del servidor.
  2. Crea un repositorio simple usando git init --bare
  3. En la máquina cliente, puede enviar su repositorio al servidor. git remote add origin ssh://user@server:/GitRepos/myproject.gitseguido porgit push origin master

¡Buen consejo! Algunas notas para los recién llegados (como yo) que no han tratado con pure-server-git-folder antes: 2. cd / GitRepos; mkdir myproject.git; cd myproject.git antes del git init --bare. No obtendrá una copia del trabajo aquí: los archivos y carpetas de repositorio (normalmente en .git) estarán al descubierto para usted, de ahí el nombre de la bandera. Gracias
akauppi

2
"git init --bare" no crea un directorio .git. Pone los archivos directamente en la carpeta. Al agregar el origen remoto obtengo: "" fatal: no es un repositorio git (o cualquier padre hasta el punto de montaje / inicio) Deteniéndose en el límite del sistema de archivos (GIT_DISCOVERY_ACROSS_FILESYSTEM no establecido).
dlsa

10

Descargo de responsabilidad: Esta es solo una copia de un comentario de bobbaluba que se hizo más visible para futuros visitantes. Me ayudó más que cualquier otra respuesta.


Debe soltar el ssh://prefijo cuando lo use git clonecomo ejemplo

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

5

prueba esto.

Paso 1:

ls -al ~/.ssh

ingrese la descripción de la imagen aquí

Paso 2:

ssh-keygen 

(usando la tecla Intro para el valor predeterminado) ingrese la descripción de la imagen aquí Paso 3: Para configurar el archivo de configuración

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

Host gitlab.com
HostName gitlab.com
Usuario git
IdentityFile ~ / .ssh / id_rsa

Paso 4:

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

ingrese la descripción de la imagen aquí

Paso 5:
Cuando termine el Paso 4
1. se descargará
el archivo test2.git 2. obtendrá el nuevo archivo (conocido_hosts) en ~ / .ssh
ingrese la descripción de la imagen aquí

PD: creo el id_rsa e id_rsa.ub por mí mismo y lo entrego al servidor de Gitlab. usando ambas teclas para cualquier lado del cliente (Windows y Linux).


4

Git 101:

gites un sistema de control de versiones descentralizado. No es necesario que necesite un servidor para comenzar a usar git. Aún así, es posible que desee hacer eso, ya que se ve bien, ¿verdad? (También es útil si desea trabajar en un solo proyecto desde varias computadoras).

Por lo tanto, para ejecutar un "servidor", debe ejecutarlo, git init --bare <your_project>.gitya que esto creará un repositorio vacío, que luego puede importar en sus máquinas sin tener que manipular los archivos de configuración en su .gitdirectorio.

Después de esto, podría clonar el repositorio en sus clientes, ya que se supone que funciona, pero descubrí que algunos clientes (a saber git-gui) no podrán clonar un repositorio que está completamente vacío. Para evitar esto, debes correr cd <your_project>.git && touch <some_random_file> && git add <some_random_file> && git commit && git push origin master. (Tenga en cuenta que es posible que necesite configurar su nombre de usuario y correo electrónico para el git de esa máquina si no lo ha hecho en el pasado. Los comandos reales para ejecutar estarán en el mensaje de error que recibe, así que los omitiré).

Entonces, en este punto, puede clonar el repositorio a cualquier máquina simplemente ejecutando git clone <user>@<server>:<relative_path><your_project>.git. (Como otros han señalado, es posible que deba agregarle un prefijo ssh://si usa la ruta absoluta). Esto supone que ya puede iniciar sesión desde su cliente al servidor. (También obtendrá puntos de bonificación por configurar un archivo de configuración y claves para ssh, si tiene la intención de enviar muchas cosas al servidor remoto).

Algunos enlaces relevantes:
esto te dice más o menos lo que necesitas saber.
Y esto es para aquellos que conocen el funcionamiento básico de git pero a veces olvidan la sintaxis exacta.


Ambos enlaces ahora parecen estar muertos o no muestran lo que esperabas.
Todd

2

Quiero intentar una respuesta que incluya git-flow y tres 'puntos' o casos de uso, el repositorio central de git, el desarrollo local y la máquina de producción. Esto no está bien probado .

Estoy dando comandos increíblemente específicos. En lugar de decir <your folder>, diré /root/git. El único lugar donde estoy cambiando el comando original es reemplazar mi nombre de servidor específico con example.com. Explicaré el propósito de las carpetas para que pueda ajustarlo en consecuencia. Avíseme si hay alguna confusión y actualizaré la respuesta.

La versión de git en el servidor es 1.7.1. El servidor es CentOS 6.3 (Final).

La versión de git en la máquina de desarrollo es 1.8.1.1. Este es Mac OS X 10.8.4.

El repositorio central y la máquina de producción están en la misma máquina.

El repositorio central, que los usuarios de svn pueden relacionar como 'servidor', se configura de la siguiente manera. Tengo una carpeta /root/gitdonde guardo todos mis repositorios git. Quiero crear un repositorio git para un proyecto que llamo 'flores'.

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

El comando git dio dos mensajes:

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

Nada de que preocuparse.

En la máquina de desarrollo se configura de la siguiente manera. Tengo una carpeta /home/kinjal/Sitesdonde pongo todos mis proyectos. Ahora quiero obtener el repositorio central de git.

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

Esto me lleva a un punto en el que puedo comenzar a agregarle cosas. Primero configuré git flow

git flow init -d

Por defecto esto está en la rama develop. Agrego mi código aquí, ahora. Entonces necesito comprometerme con el repositorio central de git.

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

En este punto, empujó a la rama de desarrollo. También quiero agregar esto a la rama maestra.

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

Tenga en cuenta que no hice nada entre el inicio del lanzamiento y el final del lanzamiento. Y cuando terminé el lanzamiento, se me solicitó editar dos archivos. Esto empujó a la rama de desarrollo a dominar.

En el sitio de producción, que está en la misma máquina que mi repositorio central de git, quiero poner el repositorio /var/www/vhosts/example.net. Ya tengo /var/www/vhosts.

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

Si la máquina de producción también estuviera en una máquina diferente, el git clonecomando se vería como el utilizado en la máquina de desarrollo.


1

Por adelantado, me faltan un poco mis habilidades GIT.

Eso va a clonar un repositorio desnudo en su máquina, que solo contiene las carpetas dentro de las .gitcuales hay un directorio oculto. ejecutar ls -aly debería ver .gito cd .gitdentro de su repositorio.

¿Puedes agregar una descripción de tu intención para que alguien con más habilidades GIT pueda ayudar? ¿Qué es lo que realmente quieres hacer, no cómo planeas hacerlo?


Interpreté mal el comando. Lo que hice fue crear un árbol de subdirectorios ssh: /myproject.git en el directorio actual. Pensé que estaba clonando en un directorio remoto, pero lo que realmente hace el comando es clonar desde un repositorio.
dlsa

0

Hice: git clone --bare "/ GITREPOSITORIES / RepoA" "ssh: // luc @ EERSTENASDS119J / volume1 / RepoA" Resultado: fatal: ruta de destino 'ssh: // luc @ EERSTENASDS119J / volume1 / RepoA' ya existe y es No es un directorio vacío.

El sistema creó un directorio ssh: // luc @ EERSTENASDS119J / volume1 / RepoA en mi ruta actual.

Entonces git clone no interpretó la especificación de URL. Usó la solución alternativa de Alec.


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.