Cómo presionar para git en EC2


78

Estoy tratando de seguir esta instrucción. Tengo un repositorio de git local y cuando hago un empuje de git, necesito que el repositorio se envíe a mi instancia EC2.

Pero, en el tutorial anterior, cuando hago un git push origin master, obtengo un Permission denied (publickey)error porque no especifiqué el archivo de identidad.

Diga, inicio sesión en EC2 así: ssh -i my_key.pem username@11.111.11.11

Entonces, ¿puedo hacer algo similar aquí a: git -i my_key.pem push origin mastero configurar el archivo de identidad en.git/config

Entonces, ¿cómo puedo configurarlo?

Actualización: Salida de git config -l

user.name=my name
user.email=my_email_addreess@gmail.com
github.user=userid
core.repositoryformatversion=0
core.filemode=true
core.bare=false
core.logallrefupdates=true
core.ignorecase=true
remote.origin.url=ec2_id@my_e2_ip_address:express_app
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*

Actualización (del comentario de @ Jon ):

Si tiene su clave en un camino extraño, simplemente ejecute ssh-add /private/key/path. Esto funcionó para mí.


16
ssh-add /private/key/path¡trabajó!
zengr

1
Cuando dice que funcionó, ¿puede agregar instrucciones sobre lo que realmente hizo paso a paso?
designermonkey

@Designermonkey actualizado.
Zengr

¿En qué máquina ejecuta eso, local o instancia EC2? ¿Qué hay express_appen tu configuración?
designermonkey

@Designermonkey está en la instancia ec2. Es el nombre del repositorio de git, que es la aplicación de framework express de un nodo.
zengr

Respuestas:


53

Para copiar su clave ssh local a Amazon, intente esto

cat ~/.ssh/id_?sa.pub | ssh -i amazon-generated-key.pem ec2-user@amazon-instance-public-dns "cat >> .ssh/authorized_keys"

reemplazando los nombres de la clave y amazon ec2 public dns, por supuesto.

entonces podrá configurar su control remoto en Amazon


3
Seguí esto, pero usé una clave rsa en lugar de una clave dsa. Además, agregué un espacio entre gato y >>, como: "gato >> .ssh / allowed_keys"
cmcculloh

4
esto no responde a la pregunta de cómo especificamos la clave al ejecutar un comando git push
psvj

27

Las instrucciones que se enumeran aquí me resultaron más útiles.

Desde el enlace:

Ajusta tu ~/.ssh/configy agrega:

Host example
Hostname example.com
User myuser
IdentityFile ~/.ssh/other_id_rsa

Ahora use el alias de host ssh como su repositorio:

$ git remote add origin example:repository.git
$ git pull origin master

¡Y debería usar la other_id_rsaclave!


2
También encontré útil de eso a git remote add ec2 ssh://ubuntu@54.243.293.151:zivot. No sabía que uno pudiera prefijar direcciones ssh://antes de eso.
isomorfismos

Gran respuesta, esperaba aprovechar la configuración ssh que ya estoy usando.
Eric Wilson

Increíble. Esto es mejor que averiguar la URL completa.
Saifur Rahman Mohsin

20

En su máquina local, edite su ~ / .ssh / config y agregue:

Host example
Hostname example.com
User myuser
IdentityFile ~/.ssh/YOURPRIVATEKEY

Debería poder iniciar sesión en su instancia con "ssh example". Recuerde que su clave privada debe ser chmod 400. Una vez que pueda ingresar sin usar "ssh -i mykey.pem username @ host", haga lo siguiente.

En su instancia EC2, inicialice un repositorio simple, que se usa para enviar exclusivamente. La convención es agregar la extensión ".git" al nombre de la carpeta. Esto puede parecer diferente a su repositorio local que normalmente tiene una carpeta .git dentro de su carpeta "proyecto". Los repositorios desnudos (por definición) no tienen un árbol de trabajo adjunto, por lo que no puede agregarles archivos fácilmente como lo haría en un repositorio normal no desnudo. Así es como se hace. En su instancia ec2:

mkdir project_folder.git
cd project_folder.git
git init --bare

Ahora, de vuelta en su máquina local, use el alias de host ssh cuando configure su control remoto.

git remote add ec2 EXAMPLEHOSTFROMSSHCONFIG:/path/to/project_folder.git

Ahora, debería poder hacer:

git push ec2 master

Ahora su código se envía al servidor sin problemas. Pero el problema en este punto es que su carpeta www en la instancia ec2 no contiene los "archivos de trabajo" reales que su servidor web necesita ejecutar. Por lo tanto, necesita configurar un script de "gancho" que se ejecutará cuando presione a ec2. Esta secuencia de comandos llenará la carpeta apropiada en su instancia ec2 con sus archivos de proyecto reales.

Entonces, en su instancia ec2, vaya a su directorio project_folder.git / hooks. Luego cree un archivo llamado "post-receive" y chmod 775 (debe ser ejecutable). Luego inserte este script bash:

#!/bin/bash
while read oldrev newrev ref
do
  branch=`echo $ref | cut -d/ -f3`
  if [ "ec2" == "$branch" -o "master" == "$branch" ]; then
    git --work-tree=/var/www/example.com/public_html/ checkout -f $branch    
    echo 'Changes pushed to Amazon EC2 PROD.'
  fi
done

Ahora, en su máquina local, haga un "git push ec2 master" y debería enviar el código a su repositorio básico, y luego el script de enlace posterior a la recepción revisará sus archivos en la carpeta apropiada que su servidor web está configurado para leer.


1
esto funciona para mi. los chmods son muy importantes. @devdrc, es posible que deba editarlo más y enfatizar las declaraciones de la línea de comandos.
Abel Callejo

la parte anterior al script bash funcionó muy bien, pero el script bash no funcionó para mí. Esta respuesta stackoverflow.com/a/24027870/847954 funcionó muy bien para mí. Gracias devdrc por esta publicación y @blamb por publicar el script.
Jeff Musk

@jeffmusk, debe asegurarse de que el post-receivearchivo sea ejecutable
Abel Callejo

5

Debe generar y cargar una clave SSH en la instancia EC2. Siga este tutorial: http://alestic.com/2010/10/ec2-ssh-keys


2
pero ya tengo la clave privada del par clave-valor conmigo, que utilicé para iniciar sesión en EC2.
zengr

Pruebe algunas de las soluciones en este hilo: serverfault.com/questions/39733/…
Jon

2
Entiendo esa parte, pero este es un problema de configuración de Git.
Zengr

No veo nada malo con su configuración, así que creo que hay algo mal con sus claves SSH, ya sea fuera de lugar o lo que no, lo más probable es que sea eso y no su configuración.
Jon

6
Si tiene su clave en un camino extraño, simplemente ejecute ssh-add /private/key/path.
Jon

4

Descubrí que esta era la forma más rápida: https://gist.github.com/matthewoden/b29353e266c554e04be8ea2058bcc2a0

Básicamente:

ssh-add /path/to/keypair.pem (el "-add" debe estar JUSTO DESPUÉS del ssh)

verifique si funcionó por: ssh ubuntu@crazylongAWSIP(tal vez su nombre de usuario no sea ubuntu)

Después de eso, puede configurar un repositorio de git en su ec2 y presionarlo:

git remote add origin ec2Username@long-crazy-amazon-ip.com:/path/to/your/repo-name.git 
git config --global remote.origin.receivepack "git receive-pack" # needed for aws ec2 stuff.
git push origin master

Sus opciones son configurar un repositorio de git 'desnudo' en su ec2 (lo que significa que otros repositorios de git pueden extraerlo y enviarlo, pero no contendrá ningún archivo), o puede configurar un repositorio NORMAL y presionar a él directamente (mi preferencia si desea introducir cambios locales en su ec2 sin tener que hacer ssh constantemente en su ec2).

Si desea configurar un repositorio NORMAL en el ec2, ingrese al ec2, haga lo git initque desee y luego haga esto:

git config receive.denyCurrentBranch updateInstead

Ver: no se puede insertar en el repositorio de git para obtener una explicación de "recibir denegar la rama actual"


2
  1. Ejecutar ssh-keygen localmente
  2. En su directorio local ~/.ssh/ , ahora debería ver un archivo de clave pública llamado id_rsa.pub: copie el contenido de este archivo en el /etc/ssh/authorized_keysarchivo, que se encuentra en su servidor remoto .

Puede copiar y pegar el contenido, o cargar el archivo en su servidor remoto primero y usar el siguiente comando:

cat id_rsa.pub >> /etc/ssh/authorized_keys


1
¿Los pasos 2 y 3 son iguales?
JoeTidee

No, @JoeTidee: el paso 2 es colocar la clave en el servidor remoto y el paso 3 es agregarla al lugar correcto. :)
Alastair

1

No estoy publicando nada nuevo aquí, creo, pero tuve que buscar en las respuestas anteriores para abordar mi caso particular. Tengo una instancia de Ubuntu en EC2.

Para iniciar sesión en mi instancia, necesitaba hacer:

ssh -i "pemfile.pem" ubuntu@very-long-amazon-address

el archivo de claves "pemfile.pem" tenía que estar entre comillas.

Agregué el control remoto:

remote add origin ubuntu@very-long-amazon-address/home/ubuntu/git/REPO/gitfile.git

Pero cuando intenté empujar:

git push origin master

Tengo:

Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

Para arreglar, hice:

/<path to pemfile>/pemfile.pem

Que me dio una respuesta,

Identity added: /<path to pemfile>/pemfile.pem (/<path to pemfile>/pemfile.pem )

Después de lo cual el empujón salió bien.


5
No entiendo cuando dice "Para arreglar lo hice: / ruta a pemfile /" mi pemfile.pem no ejecuta nada ... ¿qué comando usa para agregar la identidad?
rikkitikkitumbo

por favor especifique y concluya su respuesta que comando ha usado para agregar la clave ???
Enginerd Sunio

0

Me negaban el permiso cuando realizaba la implementación a través del control de fuente y no podía entender por qué. Me di cuenta de que mi usuario para el que estaba creando una clave ssh (llamado ubuntu, también el inicio de sesión recomendado para mi servidor ec2) no era el usuario responsable de cap deploy (root). Ejecutar un ssh-keygen para root y cargar esa clave ssh como clave de implementación en bitbucket resolvió mis problemas.



0

Esta es la forma MÁS FÁCIL que funcionó muy bien para mí ... Tenía problemas para clonar un repositorio ... no reconocía la clave SSH que creé ... En lugar de cambiar su archivo de configuración y todo eso, simplemente copié el REAL ssh con la que estaba tratando de conectarse y agregué esto a bitbucket ... aquí está el comando:

 sudo vi /root/.ssh/id_rsa.pub

Usé VI para abrir la clave REAL RSA y copié el contenido y lo pegué en bitbucket ... ¡Listo!


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.