¿Cómo proporciono un nombre de usuario y una contraseña cuando ejecuto "git clone [email protected]"?

846

Sé cómo proporcionar un nombre de usuario y contraseña a una solicitud HTTPS como esta:

git clone https://username:password@remote

Pero me gustaría saber cómo proporcionar un nombre de usuario y contraseña para el control remoto como este:

git clone [email protected]

He intentado así:

git clone username:password@[email protected]
git clone git@username:[email protected]
git clone [email protected]@username:password

Pero no han funcionado.

coordinar
fuente
44
No puedes El "git" antes de la "@" ya es un nombre de usuario. ¿De dónde sacaste la URL del repositorio ([email protected])? ¿De dónde sacaste la idea de que tienes que proporcionar un nombre de usuario y una contraseña diferentes?
Ken Thomases
3
Mi URL de repositorio es de heroku "[email protected]: zxy-helloworld.git". Y uso emacs shell para clonar y empujar. Si el shell solicita contraseña, emacs se bloqueará. Este es un problema conocido con emacs en Windows: gnu.org/software/emacs/windows/…
coordine el
¿Qué pasa si el nombre de usuario es un correo electrónico? como lo escribes myemail @ gmail.com @ example.com ?
Kyon Perez

Respuestas:

1318

Basado en el comentario de Michael Scharf:

Puede omitir la contraseña para que no se registre en su archivo de historial de Bash:

git clone https://[email protected]/username/repository.git

Le pedirá su contraseña.

Alternativamente, puede usar:

git clone https://username:[email protected]/username/repository.git

De esta manera funcionó para mí desde un repositorio de GitHub.

Bassetassen
fuente
55
no tiene que ser lo mismo por cierto. Si su colega creó el repositorio de git y está iniciando sesión como otra cuenta, no serán lo mismo.
holgac
49
No es recomendable poner la contraseña en la URL para que este archivo se guarde en .git / config. No es seguro, es mejor usar la clave ssh
zetanova
55
@MrDuk no hay problema, escapa (como% 40 iirc).
Benjamin Gruenbaum
57
Usted puede dejar de lado la contraseña: git clone https://[email protected]/username/repository.git. git te preguntará y no se guardará en .git / config ni en tu historial de bash
Michael_Scharf
37
También puede escribir 'espacio' al comienzo de la línea para que Linux no almacene el comando en la historia
Nicolas Zozol
213

El user@host:path/to/repoformato le dice a Git que use ssh para iniciar sesión hostcon nombre de usuario user. De git help clone:

También se puede usar una sintaxis alternativa tipo scp con el protocolo ssh:

[user@]host.xz:path/to/repo.git/

La parte anterior al @es el nombre de usuario, y el método de autenticación (contraseña, clave pública, etc.) se determina mediante ssh, no Git. Git no tiene forma de pasar una contraseña a ssh, porque es posible que ssh ni siquiera use una contraseña dependiendo de la configuración del servidor remoto.

Úselo ssh-agentpara evitar escribir contraseñas todo el tiempo

Si no desea escribir su contraseña ssh todo el tiempo, la solución típica es generar un par de claves pública / privada , colocar la clave pública en su ~/.ssh/authorized_keysarchivo en el servidor remoto y cargar su clave privada ssh-agent. También vea Configuración de Git a través de SSH para iniciar sesión una vez , la página de ayuda de GitHub en frases de paso clave ssh , la documentación de ssh gitolite , y la documentación de las claves ssh Heroku .

Elegir entre varias cuentas en GitHub (o Heroku o ...)

Si tiene varias cuentas en un lugar como GitHub o Heroku, tendrá varias claves ssh (al menos una por cuenta). Para elegir en qué cuenta desea iniciar sesión, debe decirle a ssh qué clave privada usar .

Por ejemplo, suponga que tiene dos cuentas de GitHub: fooy bar. Su clave ssh para fooes ~/.ssh/foo_github_idy su clave ssh para bares ~/.ssh/bar_github_id. Desea acceder [email protected]:foo/foo.gitcon su foocuenta y [email protected]:bar/bar.gitcon su barcuenta. Agregaría lo siguiente a su ~/.ssh/config:

Host gh-foo
    Hostname github.com
    User git
    IdentityFile ~/.ssh/foo_github_id
Host gh-bar
    Hostname github.com
    User git
    IdentityFile ~/.ssh/bar_github_id

Luego clonarías los dos repositorios de la siguiente manera:

git clone gh-foo:foo/foo.git  # logs in with account foo
git clone gh-bar:bar/bar.git  # logs in with account bar

Evitar ssh por completo

Algunos servicios proporcionan acceso HTTP como alternativa a ssh:

ADVERTENCIA : Agregar su contraseña a la URL de clonación hará que Git almacene su contraseña de texto sin formato .git/config. Para almacenar de forma segura su contraseña cuando usa HTTP, use un asistente de credenciales. Por ejemplo:

git config --global credential.helper cache
git config --global credential.https://github.com.username foo
git clone https://github.com/foo/repository.git

Lo anterior hará que Git solicite su contraseña una vez cada 15 minutos (de forma predeterminada). Ver git help credentialspara más detalles.

Richard Hansen
fuente
Esta es la mejor explicación de cómo funciona git con SSH. Según tengo entendido, cuando especifica [email protected]: path / to / repo.git, efectivamente le dice a git que el usuario es git y que debe obtener sus credenciales (clave pública) del agente ssh para Anfitrión "githost.com".
Anael
39

En los comentarios de la respuesta de @ Bassetassen , @plosco mencionó que, como mínimo, puede usar git clone https://<token>@github.com/username/repository.gitpara clonar desde GitHub. Pensé en ampliarme sobre cómo hacerlo, en caso de que alguien encuentre esta respuesta como lo hice mientras intentaba automatizar alguna clonación.

GitHub tiene una guía muy útil sobre cómo hacer esto, pero no cubre qué hacer si desea incluirlo todo en una línea para fines de automatización. Advierte que agregar el token a la URL del clon lo almacenará en texto sin formato en .git/config . Obviamente, este es un riesgo de seguridad para casi todos los casos de uso, pero dado que planeo eliminar el repositorio y revocar el token cuando termine, no me importa.

1. Crear una ficha

GitHub tiene una guía completa aquí sobre cómo obtener un token, pero aquí está el TL; DR.

  1. Vaya a Configuración> Configuración de desarrollador> Tokens de acceso personal ( aquí hay un enlace directo )
  2. Haga clic en "Generar un nuevo token" e ingrese su contraseña nuevamente. ( Hay otro enlace directo )
  3. Establezca una descripción / nombre para ello, verifique el permiso "repo" y presione el botón "Generar token" en la parte inferior de la página.
  4. Copia tu nuevo token antes de salir de la página

2. Clonar el repositorio

Igual que el comando @plosco dio, git clone https://<token>@github.com/<username>/<repository>.git, basta con sustituir <token>, <username>y <repository>con lo que su información es.

Si desea clonarlo en una carpeta específica, simplemente inserte la dirección de la carpeta al final de esta manera: ¡ git clone https://<token>@github.com/<username>/<repository.git> <folder>dónde <folder>está, lo adivinó, la carpeta para clonarlo! Se puede utilizar, por supuesto ., .., ~, etc. aquí como se hace en otros lugares.

3. No dejar rastro

No todo esto puede ser necesario, dependiendo de cuán sensible sea lo que esté haciendo.

  • Probablemente no quieras dejar ese token dando vueltas si no tienes intenciones de usarlo durante algún tiempo, así que vuelve a la página de tokens y presiona el botón Eliminar al lado.
  • Si no necesita el repositorio nuevamente, elimínelo rm -rf <folder>.
  • Si necesita el repositorio nuevamente, pero no necesita automatizarlo nuevamente, puede eliminar el control remoto haciendo git remote remove origino simplemente eliminar el token ejecutando git remote set-url origin https://github.com/<username>/<repository.git>.
  • Borre su historial de bash para asegurarse de que el token no permanezca registrado allí. Hay muchas maneras de hacer esto, vea esta pregunta y esta pregunta . Sin embargo, puede ser más fácil simplemente anteponer todos los comandos anteriores con un espacio para evitar que se almacenen para empezar.

Tenga en cuenta que no soy profesional, por lo que lo anterior puede no ser seguro en el sentido de que no quedaría rastro para ningún tipo de trabajo forense.

Rob Rose
fuente
1
https://<token>@github.comno fue aceptado con mi portal, tuve que usarlohttps://oauth2:<token>@github.com
MushyPeas
25

Aunque hay muchas respuestas, me enfrento al problema repetido cuando el nombre de usuario o la contraseña tienen caracteres especiales.

La URL codifica su nombre de usuario y contraseña para git, luego úsela como parte de la propia URL (cuando no haya problemas de seguridad).

Digamos, valor codificado URL del nombre de usuario

'usuario + 1' es usuario% 2B1

y el valor codificado de URL de la contraseña

'Bienvenido @ 1234' es Bienvenido% 401234

Entonces su URL de clonación GIT se vería así,

git clone https://user%2B1:Welcome%401234@actual-git-url-for-the-repo funciona perfectamente, mientras que

git clone https: // usuario + 1: Bienvenido @ 1234 @ actual-git-url-for-the-repo le da 403 errores

Espero que esto ayude.

Por si acaso, desea codificar URL en línea: https://www.urlencoder.org/

Santosh Kumar Arjunan
fuente
13

Resolví este problema de la siguiente manera:

ingrese la descripción de la imagen aquí

BehrouzMoslem
fuente
11
Nunca es una buena idea escribir su contraseña en la línea de comandos. ¿Sabía que su sistema puede almacenar el historial de la línea de comandos en un archivo? (Ej: Linux tiene un archivo oculto llamado .bash_history)
Augusto
Correcto. Cada vez que hago esto, o algo así, que a veces puede ser muy conveniente, siempre borro el comando que utilicé del historial (history -d).
Francesco Marchetti-Stasi
44
@ FrancescoMarchetti-Stasi no necesita eliminar el comando, solo use un espacio al comienzo del comando y nunca se almacenará en el historial.
Ishtiyaq Husain
Sí, lo aprendí hace solo un par de meses, después de casi 30 años en sistemas Unix ... lástima :)
Francesco Marchetti-Stasi
9

En Windows , los siguientes pasos deberían volver a activar la ventana de inicio de sesión de GitHub cuando se git cloneing:

  • Busque el menú de inicio para "Credential Manager"
  • Seleccione "Credenciales de Windows"
  • Eliminar las credenciales relacionadas con Git o GitHub

resultado

Ore4444
fuente
5
git config --global core.askpass

Ejecute esto primero antes de la clonación de la misma manera, ¡debería arreglarse!

Rohan
fuente
3
Intenté eso, todavía no lo pide.
Maarten Kieft
Establecer la configuración global nunca es una buena idea, ya que podría estropear otros clones.
Martin
1

Esta es una excelente pregunta de Stack Overflow, y las respuestas han sido muy instructivas, de modo que pude resolver un problema molesto con el que me topé recientemente.

La organización para la que trabajo utiliza Atlassian's BitBucketproductos (no Github), esencialmente su versión de GitHub para que los repositorios se puedan asegurar completamente en las instalaciones. Me encontraba con un problema similar a @coordinate, ya que se requería mi contraseña para un nuevo repositorio que revisé. Mis credenciales se habían guardado globalmente para todos los BitBucketproyectos, por lo que no estoy seguro de qué provocó la pérdida de credenciales.

En resumen, pude ingresar el siguiente comando de GIT (que proporcionaba solo mi nombre de usuario), que luego solicitó al Administrador de credenciales de Git que me solicitara la contraseña, que luego pude guardar.

git clone https://[email protected]/git/[organization]/[team]/[repository.git]

NOTA: las subrutas de directorio entre paréntesis simplemente hacen referencia a referencias internas, ¡y variarán para usted!

Michael M
fuente
0

Si está usando http/httpsy está buscando AUTOMATIZAR COMPLETAMENTE el proceso sin requerir ninguna entrada del usuario o ninguna solicitud del usuario (por ejemplo: dentro de una tubería de CI / CD), puede usar el siguiente enfoque de apalancamientogit credential.helper

GIT_CREDS_PATH="/my/random/path/to/a/git/creds/file"
# Or you may choose to not specify GIT_CREDS_PATH at all.
# See https://git-scm.com/docs/git-credential-store#FILES for the defaults used

git config --global credential.helper "store --file ${GIT_CREDS_PATH}"
echo "https://alice:${ALICE_GITHUB_PASSWORD}@github.com" > ${GIT_CREDS_PATH}

donde puede elegir establecer la ALICE_GITHUB_PASSWORDvariable de entorno desde un comando de shell anterior o desde su configuración de canalización, etc.

Recuerde que git-credential-helper basado en "almacenar" almacena contraseñas y valores en texto plano. Así que asegúrese de que su token / contraseña tenga permisos muy limitados.


Ahora simplemente use https: //[email protected]/my_repo.git donde su sistema automatizado necesite obtener el repositorio: usará las credenciales aliceen github.comgit-credential-helper como almacenadas.

Rakib
fuente