new - git clone a través de ssh
git show tags (6)
Tengo un proyecto en el que creé un repositorio de 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. La ruta / GitRepos estaba vacía, así que decidí volver a hacer el clon:
$ 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 ?
Git 101:
git
es un sistema de control de versiones descentralizado. No es necesario que necesites un servidor para comenzar a trabajar con git. Aún así, es posible que desee hacer eso, ya que se ve bien, ¿verdad? (También es útil si quieres trabajar en un solo proyecto desde varias computadoras).
Entonces para ejecutar un "servidor" necesita ejecutar git init --bare <your_project>.git
ya que esto creará un repositorio vacío, que luego puede importar en sus máquinas sin tener que perder el tiempo en los archivos de configuración en su .git
dir.
Después de esto, podría clonar el repositorio de sus clientes, ya que se supone que debería funcionar, pero descubrí que algunos clientes (a saber, git-gui
) no podrán clonar un repositorio completamente vacío. Para cd <your_project>.git && touch <some_random_file> && git add <some_random_file> && git commit && git push origin master
este problema, debe ejecutar cd <your_project>.git && touch <some_random_file> && git add <some_random_file> && git commit && git push origin master
. (Tenga en cuenta que puede que necesite configurar su nombre de usuario y correo electrónico para el git de esa máquina si no lo hubiera hecho anteriormente. Los comandos reales para ejecutar estarán en el mensaje de error que reciba, así que simplemente los omitiré).
Entonces, en este punto puede clonar el repositorio en cualquier máquina simplemente ejecutando git clone <user>@<server>:<relative_path><your_project>.git
. (Como otros han señalado, es posible que deba agregar 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 más o menos te dice lo que necesitas saber.
Y esto es para aquellos que conocen el funcionamiento básico de git pero a veces olvidan la sintaxis exacta.
Necesita ejecutar el comando de clonación 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 desde la memoria)
- Inicie sesión en la máquina del servidor.
- Crea un repositorio
git init --bare
usandogit init --bare
- En la máquina cliente, puede enviar su repositorio al servidor.
git remote add origin ssh://user@server:/GitRepos/myproject.git
seguido degit push origin master
Para repositorios en GitHub, intente:
git clone ssh://[email protected]/<user>/<repository name>.git
Para configurar git para clonar a través de ssh, consulte:
Generando claves SSH y agregue su clave generada en Configuraciones de cuenta -> Llaves SSH
Posiblemente, esto no esté relacionado directamente con la pregunta; pero un error que acabo de hacer, y veo en el OP, es la especificación de URL ssh://user@server:/GitRepos/myproject.git
, es decir, tiene dos puntos :
y una barra inclinada /
después significando un camino absoluto.
Luego encontré el clon de Git, ssh: No se pudo resolver el nombre de host - git, desarrollo - Nicolas Kuttler (ya que ese era el error que estaba obteniendo, en la versión de Git 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! Así que básicamente en git
con ssh
, o bien usas
-
ssh://[email protected]/absolute/path/to/repo.git/
- solo una barra inclinada para la ruta absoluta en el servidor -
[email protected]:relative/path/to/repo.git/
- solo dos puntos (no debe tener elssh://
para la ruta relativa en el servidor (relativo al directorio principal delusername
deusername
en la máquina del servidor)
Espero que esto ayude a alguien,
¡Aclamaciones!
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. Por favor, avíseme sobre cualquier 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. Esto 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 svn pueden relacionar como ''servidor'' está configurado de la siguiente manera. Tengo una carpeta /root/git
donde 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 está configurado de la siguiente manera. Tengo una carpeta /home/kinjal/Sites
donde pongo todos mis proyectos. Ahora quiero obtener el repositorio git central.
cd /home/kinjal/Sites
git clone [email protected]:/root/git/flowers.git
Esto me lleva a un punto donde puedo comenzar a agregar cosas. Primero configuré el flujo de git
git flow init -d
Por defecto, esto es en la rama de develop
. Agregué 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 principal.
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 de lanzamiento y el final de lanzamiento. Y cuando terminé, me pidieron que editara dos archivos. Esto empujó 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 en /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 estaría en una máquina diferente, el comando git clone
se parecería al utilizado en la máquina de desarrollo.
Por adelantado, estoy un poco ausente en mis habilidades de GIT.
Eso va a clonar un repositorio desnudo en su máquina, que solo contiene las carpetas dentro de .git
que es un directorio oculto. ejecuta ls -al
y deberías ver .git
o cd .git
dentro de tu repositorio.
¿Puede agregar una descripción de su intención para que alguien con más habilidades GIT pueda ayudar? ¿Qué es lo que realmente quieres hacer, no cómo planeas hacerlo?