Como forneço um nome de usuário e senha ao executar o "git clone [email protected]"?

846

Eu sei como fornecer um nome de usuário e senha para uma solicitação HTTPS como esta:

git clone https://username:password@remote

Mas eu gostaria de saber como fornecer um nome de usuário e senha para o controle remoto assim:

git clone [email protected]

Eu tentei assim:

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

Mas eles não funcionaram.

coordenada
fonte
4
Você não pode. O "git" antes do "@" já é um nome de usuário. De onde você obteve o URL do repositório ([email protected])? De onde você teve a idéia de fornecer um nome de usuário e uma senha diferentes?
9788 Kenworthy
3
Meu URL de repositório é de heroku "[email protected]: zxy-helloworld.git". E eu uso o emacs shell para clonar e empurrar. Se o shell solicitar senha, o emacs será interrompido. Este é um problema conhecido com o emacs no Windows: gnu.org/software/emacs/windows/…
coord
E se o nome de usuário for um email? como você digita? myemail @ gmail.com @ example.com ?
Kyon Perez

Respostas:

1319

Com base no comentário de Michael Scharf:

Você pode deixar de fora a senha para que ela não seja registrada no seu arquivo de histórico do Bash:

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

Ele solicitará sua senha.

Como alternativa, você pode usar:

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

Dessa forma, funcionou para mim a partir de um repositório GitHub.

Bassetassen
fonte
5
a propósito, não precisa ser o mesmo. Se o seu colega criou o repositório git e você está fazendo login como outra conta, eles não serão os mesmos.
holgac
49
Não é aconselhável colocar a senha na URL para esse arquivo ser salvo no arquivo .git / config. Não é seguro, é melhor usar a chave ssh
zetanova
55
@ MrDuk não há problema, escape (como% 40 iirc).
Benjamin Gruenbaum 06/04
57
Você pode deixar de fora a senha: git clone https://[email protected]/username/repository.git. git irá pedir-lhe e ele não vai ser salvos em .git / config nem em seu histórico de festa
Michael_Scharf
37
você também pode digitar 'espaço' no início da linha para que o Linux não irá armazenar o comando na história
Nicolas Zozol
213

O user@host:path/to/repoformato diz ao Git para usar ssh para fazer login hostcom o nome de usuário user. De git help clone:

Uma sintaxe alternativa semelhante a scp também pode ser usada com o protocolo ssh:

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

A parte anterior a @é o nome de usuário e o método de autenticação (senha, chave pública, etc.) é determinado pelo ssh, não pelo Git. O Git não tem como passar uma senha para o ssh, porque o ssh pode nem mesmo usar uma senha, dependendo da configuração do servidor remoto.

Use ssh-agentpara evitar digitar senhas o tempo todo

Se você não deseja digitar sua senha ssh o tempo todo, a solução típica é gerar um par de chaves pública / privada , colocar a chave pública em seu ~/.ssh/authorized_keysarquivo no servidor remoto e carregar sua chave privada ssh-agent. Veja também Configurando Git sobre SSH para acessar uma vez , a página de ajuda do GitHub em passphrases chave ssh , documentação ssh do gitolite e documentação chaves SSH do Heroku .

Escolhendo entre várias contas no GitHub (ou Heroku ou ...)

Se você tiver várias contas em um local como o GitHub ou o Heroku, terá várias chaves ssh (pelo menos uma por conta). Para escolher em qual conta você deseja fazer login, você deve informar ao ssh qual chave privada usar .

Por exemplo, suponha que você tivesse duas contas do GitHub: fooe bar. Sua chave ssh para foois ~/.ssh/foo_github_ide sua chave ssh para baris ~/.ssh/bar_github_id. Você deseja acessar [email protected]:foo/foo.gitcom sua fooconta e [email protected]:bar/bar.gitcom sua barconta. Você adicionaria o seguinte ao seu ~/.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

Você então clonaria os dois repositórios da seguinte maneira:

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

Evitando o ssh completamente

Alguns serviços fornecem acesso HTTP como uma alternativa ao ssh:

AVISO : Adicionar sua senha ao URL do clone fará com que o Git armazene sua senha de texto sem formatação .git/config. Para armazenar sua senha com segurança ao usar HTTP, use um auxiliar de credencial. Por exemplo:

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

O procedimento acima fará com que o Git solicite sua senha a cada 15 minutos (por padrão). Veja git help credentialspara detalhes.

Richard Hansen
fonte
Esta é a melhor explicação de como o git funciona com o SSH. Meu entendimento é que, quando você especifica [email protected]: caminho / para / repo.git, ele efetivamente informa ao git que o usuário é o próprio git e que deve buscar suas credenciais (chave pública) no ssh-agent para o Host "githost.com".
Anael
39

Nos comentários da resposta de @ Bassetassen , a @plosco mencionou que você pode usar o clit git clone https://<token>@github.com/username/repository.gitdo GitHub, no mínimo. Eu pensei em expandir como fazer isso, caso alguém se depare com essa resposta, como eu, enquanto tentava automatizar alguma clonagem.

O GitHub tem um guia muito útil sobre como fazer isso, mas não cobre o que fazer se você quiser incluir tudo em uma linha para fins de automação. Ele avisa que a adição do token ao URL do clone o armazenará em texto sem formatação .git/config . Obviamente, isso representa um risco de segurança para quase todos os casos de uso, mas como pretendo excluir o repositório de repositório e revogar o token quando terminar, não me importo.

1. Crie um token

O GitHub tem um guia completo aqui sobre como obter um token, mas aqui está o TL; DR.

  1. Vá para Configurações> Configurações do desenvolvedor> Tokens de acesso pessoal ( aqui está um link direto )
  2. Clique em "Gerar um novo token" e digite sua senha novamente. (aqui está outro link direto )
  3. Defina uma descrição / nome para ele, verifique a permissão "repo" e pressione o botão "Gerar token" na parte inferior da página.
  4. Copie seu novo token antes de sair da página

2. Clone o repositório

Mesmo que o @plosco comando deu, git clone https://<token>@github.com/<username>/<repository>.git, basta substituir <token>, <username>e <repository>com o que a sua informação é.

Se você deseja cloná-lo em uma pasta específica, basta inserir o endereço da pasta no final da seguinte forma: git clone https://<token>@github.com/<username>/<repository.git> <folder>onde <folder>está, você adivinhou, a pasta na qual cloná-lo! Pode, claro, usar ., .., ~, etc. aqui como você pode em outros lugares.

3. Não deixe rastros

Nem tudo isso pode ser necessário, dependendo da sensibilidade do que você está fazendo.

  • Você provavelmente não deseja deixar esse token por aí se não tiver intenção de usá-lo por algum tempo, então volte para a página de tokens e aperte o botão excluir ao lado dele.
  • Se você não precisar do repositório novamente, exclua-o rm -rf <folder>.
  • Se você precisar do repositório novamente, mas não precisará automatizá-lo novamente, poderá remover o controle remoto executando git remote remove originou apenas removendo o token executando git remote set-url origin https://github.com/<username>/<repository.git>.
  • Limpe seu histórico do bash para garantir que o token não fique registrado lá. Há muitas maneiras de fazer isso, veja esta e essa pergunta . No entanto, pode ser mais fácil anexar previamente todos os comandos acima com um espaço para impedir que eles sejam armazenados para começar.

Observe que eu não sou profissional, portanto, o exposto acima pode não estar seguro no sentido de que nenhum vestígio seria deixado para qualquer tipo de trabalho forense.

Rob Rose
fonte
1
https://<token>@github.comnão foi aceito com meu portal, eu tive que usarhttps://oauth2:<token>@github.com
MushyPeas
25

Embora existam muitas respostas, eu mesmo enfrento o problema repetido quando nome de usuário ou senha tem caracteres especiais.

O URL codifica seu nome de usuário e senha para o git e, em seguida, use-o como parte do próprio URL (quando não houver problemas de segurança).

Digamos, o valor codificado por URL do nome de usuário

'usuário + 1' é o usuário% 2B1

e valor codificado por URL da senha

'Bem-vindo @ 1234' é Bem-vindo% 401234

Em seguida, seu URL de clone do GIT ficaria assim:

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

git clone https: // usuário + 1: Welcome @ 1234 @ real-git-url-for-the-repo fornece 403 erros

Espero que isto ajude.

Por precaução, deseja codificar URL online: https://www.urlencoder.org/

Santosh Kumar Arjunan
fonte
13

Resolvi esse problema da seguinte maneira:

insira a descrição da imagem aqui

BehrouzMoslem
fonte
11
Nunca é uma boa idéia digitar sua senha na linha de comando. Você sabia que seu sistema pode armazenar o histórico da linha de comando em um arquivo? (Ex: Linux tem um arquivo oculto chamado .bash_history)
augusto
Corrigir. Sempre que faço isso ou algo assim, que às vezes pode ser muito conveniente, sempre excluo o comando que usei da história (history -d).
Francesco Marchetti-Stasi
4
@ FrancescoMarchetti-Stasi você não precisa excluir o comando, basta usar um espaço no início do comando e ele nunca será armazenado no histórico.
Ishtiyaq Husain 21/04
Sim - eu aprendi isso apenas alguns meses atrás, depois de quase 30 anos em sistemas Unix ... que vergonha para mim :)
Francesco Marchetti-Stasi
9

No Windows , as etapas a seguir devem disparar novamente a janela de login do GitHub ao git cloneing:

  • Procure no menu iniciar o "Credential Manager"
  • Selecione "Credenciais do Windows"
  • Exclua quaisquer credenciais relacionadas ao Git ou GitHub

resultado

Ore4444
fonte
5
git config --global core.askpass

Execute isso primeiro antes de clonar da mesma maneira, deve ser corrigido!

Rohan
fonte
3
Tentei aquele, ainda não pede.
Maarten Kieft
Definir a configuração global nunca é uma boa ideia, pois pode atrapalhar outros clones.
Martin
1

Essa é uma excelente pergunta sobre estouro de pilha e as respostas foram muito instrutivas, de modo que pude resolver um problema irritante que encontrei recentemente.

A organização em que trabalho utiliza o Atlassian's BitBucketproduto (não o Github), essencialmente sua versão do GitHub, para que os repositórios possam ser completamente protegidos no local. Eu estava com um problema semelhante ao @coordinate, pois minha senha era necessária para um novo repositório que fiz check-out. Minhas credenciais foram salvas globalmente para todos os BitBucketprojetos, por isso não sei o que levou à perda de credenciais.

Resumindo, consegui inserir o seguinte comando GIT (fornecendo apenas meu nome de usuário), que solicitou ao Gerenciador de credenciais do Git que me solicitasse a senha, que eu poderia salvar.

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

NOTA: os subcaminhos do diretório entre parênteses simplesmente se referem a referências internas e variam para você!

Michael M
fonte
0

Se você estiver usando http/httpse pretendendo AUTOMATIZAR TOTALMENTE o processo sem exigir nenhuma entrada ou solicitação do usuário (por exemplo: dentro de um pipeline de CI / CD), poderá usar a seguinte abordagemgit 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}

onde você pode optar por definir a ALICE_GITHUB_PASSWORDvariável de ambiente a partir de um comando shell anterior ou de sua configuração de pipeline, etc.

Lembre-se de que o git-credential-helper baseado em "store" armazena senhas e valores em texto sem formatação. Portanto, verifique se o seu token / senha tem permissões muito limitadas.


Agora basta usar https: //[email protected]/my_repo.git sempre que seu sistema automatizado precisar buscar o repositório - ele usará as credenciais para alicein github.comcomo armazenadas pelo git-credential-helper.

Rakib
fonte