O push do Git requer nome de usuário e senha

1436

Clonei um repositório Git da minha conta GitHub para o meu PC.

Quero trabalhar com meu PC e laptop, mas com uma conta GitHub.

Quando tento acessar ou extrair do GitHub usando meu PC, ele exige um nome de usuário e uma senha, mas não quando estou usando o laptop!

Não quero digitar meu nome de usuário e senha sempre que interagir  origin. O que estou perdendo aqui?

Muito legal
fonte
1
Sim, mas o que devo fazer? Eu gerei o keygen o que mais?
TooCooL
1
Você precisa registrar o pubkey na sua conta do Github ( github.com/account/ssh ) e configurar seu cliente SSH para usar o nome de usuário correto.
jwodder
1
Eu fiz tudo isso, mas ainda requer nome de usuário e senha! é possível usar uma conta com dois PCs?
precisa saber é o seguinte
1
Esta questão cobre todas as suas opções para isso muito bem: stackoverflow.com/questions/5343068/…
ford
2
Não é mais necessário mudar para o ssh. Também é possível com HTTPS. Veja minha resposta.
Varun Acar

Respostas:

1961

Uma causa comum é a clonagem usando o padrão (HTTPS) em vez do SSH. Você pode corrigir isso indo ao seu repositório, clicando em "Clonar ou fazer download" e, em seguida, clique no botão "Usar SSH" acima do campo URL e atualizando o URL do seu controle remoto de origem da seguinte maneira:

git remote set-url origin [email protected]:username/repo.git

Isso está documentado no GitHub: Alternando URLs remotas de HTTPS para SSH .

Tekkub
fonte
61
E para descobrir como alterar a URL, clique aqui: stackoverflow.com/a/2432799/60488 (Spoiler: git remote set-url origin git://new.url.here)
Johan Kool
136
Se você não pode ssh usuário para restrições de segurança (como eu) você pode fazer: git remote set-url origin https://name:[email protected]/repo.git (extraído de um comentário aqui)
de Bruno Berisso
134
Por que a clonagem com HTTPS é um erro comum? Agora o GitHub recomenda o uso de HTTPS.
Dennis
8
@smftre por padrão, esse é o caso, mas você pode usar um auxiliar para armazenar em cache suas credenciais .
Dennis
28
Corrigido meu Permission denied (publickey)uso deste guia: help.github.com/articles/generating-ssh-keys .
voltrevo
386

Autenticando permanentemente com repositórios Git

Execute o seguinte comando para ativar o cache de credenciais :

$ git config credential.helper store
$ git push https://github.com/owner/repo.git

Username for 'https://github.com': <USERNAME>
Password for 'https://[email protected]': <PASSWORD>

Você também deve especificar vencimento do cache ,

git config --global credential.helper 'cache --timeout 7200'

Depois de ativar o cache de credenciais, ele será armazenado em cache por 7200 segundos (2 horas) .

Jay Patel
fonte
você também pode ter que mudar seu URL remoto com git remote set-url origin https://[email protected]/<owner>/<repo>.git Isto também funciona com 2FA
Bron Davies
14
Essa deve ser a resposta aceita. Responde exatamente à pergunta.
Abraham TS
será excluído automaticamente dos arquivos do ubuntu para depois do 7200 por motivos de segurança?
usama 27/02
ou 43.200 por 12 horas. Você entra uma vez por dia. Isso pode ser mais razoável para alguns.
Urasquirrel 12/03
Só tentei isso - conseguiu:fatal: protocol 'https' is not supported
Joel
134

Acabei de encontrar o mesmo problema, e a solução mais simples que encontrei foi usar o URL SSH em vez do HTTPS:

ssh://[email protected]/username/repo.git

E não é isso:

https://github.com/username/repo.git

Agora você pode validar apenas com a chave SSH em vez de usernamee password.

Anton Salikhmetov
fonte
1
A maneira mais fácil de corrigir o problema, basta editar o URL de origem remota. Isso é tudo. Feito. Thanx!
JOM
1
Isso funcionou para mim, mas primeiro eu precisava para resolver este: stackoverflow.com/questions/2643502/...
Sridhar Sarnobat
para configurar a chave SSH você pode consultar help.github.com/articles/connecting-to-github-with-ssh
ksridhar
120

Além de mudar para SSH, você também pode continuar usando HTTPS, se não quiser colocar sua senha em texto não criptografado. Coloque isso no seu ~/.netrce ele não solicitará seu nome de usuário / senha (pelo menos no Linux e Mac):

machine github.com
       login <user>
       password <password>

Adição (veja o segundo comentário de VonC): no Windows, o nome do arquivo é%HOME%\_netrc .

Leia também o primeiro comentário do VonC, caso você queira criptografar.

Outra adição (consulte o comentário de user137717) que você pode usar se tiver o Git 1.7.10 ou mais recente .

Coloque em cache sua senha do GitHub no Git usando um auxiliar de credencial :

Se você estiver clonando repositórios do GitHub usando HTTPS, poderá usar um auxiliar de credencial para dizer ao Git para lembrar seu nome de usuário e senha do GitHub toda vez que conversar com o GitHub.

Isso também funciona no Linux, Mac e Windows.

rintcius
fonte
3
Sim, funciona no Linux, mas não funciona com o gitbash no Windows.
precisa saber é o seguinte
3
@dolmen Entendo o que você quer dizer, mas se você colocar sua senha em um texto não criptografado, poderá ... criptografá-la;) Consulte stackoverflow.com/a/18362082/6309 . e isso é compatível com a autenticação de dois fatores (2FA) do Github: stackoverflow.com/a/18607931/6309
VonC
3
O @Sales funciona perfeitamente em uma sessão do DOS ou em um git bash no Windows, desde que você chame seu arquivo %HOME%\_netrc(em vez de ~/.netrc). Consulte também stackoverflow.com/a/18362082/6309 para criptografar esse arquivo.
VonC
1
Isso funciona muito bem no Linux, especialmente usando o git sobre VPN.
Evan Hu
3
você não precisa colocá-lo em texto não criptografado ou criptografá-lo. o utilitário auxiliar o armazenará em cache para você e leva 30 segundos para configurar. help.github.com/articles/caching-your-github-password-in-git/…
user137717
86

Para os não iniciados que estão confusos com as respostas anteriores, você pode:

git remote -v

O que responderá com algo como

origin    https://[email protected]/yourname/yourrepo.git (fetch)
origin    https://[email protected]/yourname/yourrepo.git (push)

Em seguida, você pode executar o comando que muitos outros sugeriram, mas agora você conhece seu nome e seu repositório de cima, para poder recortar e colar yourname/yourrepo.gitdo acima em:

git remote set-url origin [email protected]:yourname/yourrepo.git
Davide
fonte
1
Eu tentei isso. Isso me pede paraphrasesempre. Eu não montei um
samayo 6/06/2014
O que acontece no lugar de yourrepo?
Raphi
2
@Raphi correr git remote -ve ver o que sai
Davide
1
Outras respostas devem preceder este conselho.
Bennett Brown
57

Se você estiver usando SSH e sua chave privada estiver criptografada com uma senha, você ainda será solicitado a digitar a senha / senha da chave privada ao realizar operações de rede com o Gitpush , como pull, e fetch.

Use ssh-agent para salvar as credenciais de senha / senha da chave privada

Se você quiser evitar ter que digitar sua senha sempre, use ssh-agentas suas credenciais de senha de chave privada uma vez por sessão do terminal, como explico em minha resposta para Não foi possível abrir uma conexão com o seu agente de autenticação :

$ eval `ssh-agent -s`
$ ssh-add

Em um msysgit Bash do Windows, você precisa avaliar a saída de ssh-agent, mas não tenho certeza se você precisa fazer o mesmo em outros ambientes de desenvolvimento e sistemas operacionais.

ssh-addprocura uma chave privada na sua .sshpasta pessoal chamadaid_rsa , que é o nome padrão, mas você pode passar um caminho de arquivo para uma chave com um nome diferente.

Matando o agente

Quando você terminar sua sessão de terminal, poderá encerrar ssh-agentcom a bandeira de interrupção -k:

$ ssh-agent -k

Conforme explicado no ssh-agentmanual :

-k

Mate o agente atual (fornecido pela variável de ambiente SSH_AGENT_PID).

Tempo limite opcional

Além disso, pode levar um parâmetro de tempo limite opcional, da seguinte maneira:

$ ssh-add -t <timeout>

onde <timeout>está no formato <n>hpor <n>horas, <n>mpor<n> minutos, e assim por diante.

De acordo com o ssh-agentmanual :

-t life

Defina um valor padrão para a vida útil máxima de identidades adicionadas ao agente. A vida útil pode ser especificada em segundos ou em um formato de hora especificado em sshd_config (5) . Uma vida útil especificada para uma identidade com ssh-add (1) substitui esse valor. Sem essa opção, a vida útil máxima padrão é para sempre.

Veja esta página para mais formatos de hora .

Aviso de segurança para usuários do Cygwin

Os usuários do Cygwin devem estar cientes de um risco potencial à segurança ao usar o ssh-agent no Cygwin :

as pessoas devem estar cientes dos perigos potenciais do ssh-agent no Cygwin 1 , embora sob um netstat local e portscan remoto, não parece que a porta especificada em / tmp / ssh-foo esteja acessível a qualquer pessoa ...?

[1]: http://www.cygwin.com/ml/cygwin/2001-01/msg00063.html

E no link citado :

no entanto, observe que os soquetes de domínio Unix da Cygwin são FUNDAMENTALMENTE INSEGUROS e, portanto, DESCOUÇO fortemente o uso do ssh-agent no Cygwin.

quando você executa o ssh-agent no Cygwin, ele cria o soquete AF_UNIX no /tmp/ssh-$USERNAME/diretório No Cygwin, os soquetes AF_UNIX são emulados pelos soquetes AF_INET. Você pode ver facilmente isso se procurar no /tmp/ssh-$USERNAME/agent-socket-*arquivo via Bloco de Notas. Você verá algo como

!<socket >2080

então corra netstat -ae surpreenda! Você tem algum programa ouvindo a porta 2080. É ssh-agent. Quando o ssh recebe um desafio de RSA do servidor, ele se refere à correspondência /tmp/ssh-$USERNAME/agent-socket-*(no Cygwin, no nosso caso, isso significa que ele abrirá a conexão comlocalhost:2080 ) e solicita ao ssh-agent que processe o desafio de RSA com a chave privada que possui e, em seguida, simplesmente passa a resposta recebida do agente ssh para o servidor.

No Unix, esse cenário funciona sem problemas, porque o kernel do Unix verifica as permissões quando o programa tenta acessar um soquete AF_UNIX. Para soquetes AF_INET, no entanto, as conexões são anônimas (leia-se "inseguro"). Imagine que você tem o agente ssh Cygwin em execução. Um hacker mal-intencionado pode portar a sua caixa, localizar a porta aberta usada pelo ssh-agent, abrir uma conexão com o servidor SSH, receber o desafio RSA dele, enviá-lo ao seu ssh-agent por uma porta aberta que ele encontrou, receber o Resposta RSA, envie-a para o servidor SSH e pronto, ele / ela logou com sucesso no seu servidor como você.

Peter Mortensen
fonte
Parece bom e detalhado. Eu cuidei do auxiliar de credencial https e você cuidou das conexões ssh! +1
VonC
49

Fonte: Configurar o Git

O comando a seguir salvará sua senha na memória por algum tempo (para Git 1.7.10 ou posterior).

$ git config --global credential.helper cache
# Set git to use the credential memory cache

$ git config --global credential.helper 'cache --timeout=3600'
# Set the cache to timeout after one hour (setting is in seconds)
Sagar Rakshe
fonte
2
Prefiro a ajuda de credenciais 'netrc' ( stackoverflow.com/a/18362082/6309 ) para armazenar em cache várias credenciais (sem precisar lembrar todas as senhas). Mas se você estiver em Windows e quiser usar o cache de memória, você precisa winstore ( stackoverflow.com/a/15310274/6309 )
VonC
9
Esta é a melhor resposta até agora IMHO.
Chiel ten Brinke
35

Quando você usa https para pull & push do Git, basta configurar remote.origin.urlpara o seu projeto, para evitar a entrada de nome de usuário (ou senha) sempre que for pressionado.

Como configurar remote.origin.url:

Formato de URL:
    https: // {nome de usuário: senha @} github.com/ {owner} / {repo}

Parâmetros no URL:

* nome de usuário 
Opcional, o nome de usuário a ser usado quando necessário.
autenticação, se especificado, não é necessário inserir o nome de usuário novamente quando precisar de autenticação. Não use email; use seu nome de usuário que não tenha "@"; caso contrário, o URL não poderá ser analisado corretamente, * senha opcional, a senha a ser usada quando precisar de autenticação. Se especificado, não há necessidade de digitar a senha novamente quando precisar de autenticação. Gorjeta: esse valor é armazenado como texto sem formatação. Portanto, por questões de segurança, não especifique esse parâmetro, * por exemplo git config remote.origin.url https: //[email protected]/eric/myproject

@Update - usando ssh

Eu acho que usar sshprotocolo é uma solução melhor do que https, embora a etapa de instalação seja um pouco mais complexa.

Etapas difíceis:

  • Crie chaves ssh usando o comando, por exemplo, ssh-keygenno Linux, no Windows msysgitforneça comandos semelhantes.
  • Mantenha a chave privada na máquina local em um local adequado, por exemplo ~/.ssh,. E adicione-o ao agente ssh através do ssh-addcomando
  • Carregue a chave pública no servidor Git.
  • Mudança remote.origin.urldo repositório Git para o sshestilo, por exemplo,[email protected]:myaccount/myrepo.git
  • Então, quando puxa ou empurra, não há necessidade de inserir o nome de usuário ou a senha.

Dicas:

  • Se a sua chave ssh tiver uma senha, será necessário inseri-la no primeiro uso da chave após cada reinicialização da máquina, por padrão.

@Update - Alterna entre httpse sshprotocolo.

Simplesmente mudar remote.origin.urlserá suficiente, ou você pode editar repo_home/.git/configdiretamente para alterar o valor (por exemplo, usando vino Linux).

Normalmente, adiciono uma linha para cada protocolo e comento um deles usando #.

Por exemplo

[origem remota]
        url = [email protected]: myaccount / myrepo.git
        # url = https: //[email protected]/myaccount/myrepo.git
        busca = + refs / heads / *: refs / remotes / origin / *
Eric Wang
fonte
Você tem certeza de que o URL baseado em http [s] suporta expansão de nome de usuário? O manual git-fetch(1)menciona isso apenas para URLs baseados em git/ ssh.
dia
@ plmday sim, estou usando, minha versão do git é 1.8.2.3 e 1.8.4, não tenho certeza se a versão mais alta muda sobre isso.
Eric Wang
1
NB ao fornecer sua senha na URL (mesmo ao usar HTTPS) significa que ela é visível para tudo entre você e seu repositório.
William
3
Não, fornecer a senha https://username:[email protected]/é seguro. Veja stackoverflow.com/questions/4980912/…
slowhand
1
E isso era o que eu estava procurando (para automação completa)
Joshua
16

Você pode armazenar em cache sua senha do GitHub no Git:

Basta seguir as instruções da documentação oficial do GitHub .

Após seguir as instruções do link acima, você poderá pressionar / puxar para / do seu repositório sem digitar seu nome de usuário / senha todas as vezes.

KM Rakibul Islam
fonte
5
esta é a melhor resposta aqui e deve ser o único aceito IMO
TheZuck
1
Concordado, uma resposta citando a documentação oficial deve prevalecer. De bom grado segui suas instruções e prefiro usar convenções padrão.
johnnieb
10

Aqui está outra opção:

Em vez de escrever

git push origin HEAD

Você pode escrever:

git push https://user:[email protected]/path HEAD

Obviamente, com a maioria dos shells, isso resultará na cache da senha no histórico, portanto, lembre-se disso.

Lacho Tomov
fonte
1
No Bash, adicionar um ou mais espaços à esquerda geralmente o mantém fora da história. Mas não no Git Bash , no entanto.
Peter Mortensen
Isso simplesmente funcionou para mim :)
Naveen Kumar V
9

O que funcionou para mim foi editar .git/confige usar

[remote "origin"]
        url = https://<login>:<password>@gitlab.com(...).git

Escusado será dizer que esta é uma maneira insegura de armazenar sua senha, mas existem ambientes / casos em que isso pode não ser um problema.

WoJ
fonte
6

Se a chave ou o .netrcarquivo SSH não funcionou para você, outra solução simples, mas menos segura, que poderia funcionar para você é o git-credential-store - Helper para armazenar credenciais no disco:

git config --global credential.helper store

Por padrão, as credenciais serão salvas no arquivo ~/.git-credentials. Será criado e gravado para.

Observe que o uso desse ajudante armazenará suas senhas não criptografadas no disco, protegidas apenas pelas permissões do sistema de arquivos. Se isso não for uma troca aceitável de segurança.

rumman0786
fonte
5

Eu tive o mesmo problema.

Então mudei o .git/configarquivo do meu projeto,

url = https://github.com/<your-user-here>/<your-repo-here>

para

url = [email protected]:<your-user-here>/<your-repo-here>

e adicionou a chave pública SSH ao perfil Git, que está na configuração.

Para a chave pública SSH:

cat ~/.ssh/id_rsa.pub
estridente
fonte
1
com cat ~/.ssh/id_rsa.pubobtenha a chave rsa e cole na configuração do portal da web git.
Anupam Maurya
4

Atualização para HTTPS:

O GitHub lançou um novo programa para Windows que armazena suas credenciais quando você está usando HTTPS:

Usar:

  • Faça o download do programa aqui

  • Depois de executar o programa, ele editará seu .gitconfigarquivo. Verifique novamente se ele editou o correto .gitconfig, caso você tenha vários deles. Se não editou o correto, adicione o seguinte ao seu.gitconfig

    [credential]
        helper = !'C:\\Path\\To\\Your\\Downloaded\\File\\git-credential-winstore.exe'
    

    NOTA a quebra de linha depois [credential]. É necessário.

  • Abra seu cliente de linha de comando e tente git push origin masteruma vez. Se ele solicitar uma senha, insira-a e pronto. Senha salva!

Varun Achar
fonte
Obrigado Varun, trabalhou charme!
Joyy
4

Para usuários do Windows Git, após a execução git config --global credential.helper store, se ainda solicitar uma senha, é melhor verificar para onde o arquivo de configuração está gravado, usando este comando

git config --list --show-origin

No meu caso, depois de editar manualmente o arquivo de configuração 'C: \ Arquivos de Programas \ Git \ mingw64 \ etc \ gitconfig' e adicionar o texto a seguir, funcionou.

[credential]
    helper = store
Liang
fonte
3

Você basicamente tem duas opções.

Se você usar o mesmo usuário em ambas as máquinas, precisará copiar a chave .pub no seu PC, para que o GitHub saiba que você é o mesmo usuário.

Se você criou um novo arquivo .pub para o seu PC e deseja tratar as máquinas como usuários diferentes, é necessário registrar o novo arquivo .pub no site do GitHub.

Se isso ainda não funcionar, pode ser porque o ssh não está configurado corretamente e esse ssh falha ao encontrar o local das suas chaves. Tentar

ssh -vv [email protected]

Para obter mais informações sobre por que o SSH falha.

ralphtheninja
fonte
3

Atualizando seu arquivo de configuração do Git diretamente ( se você não deseja memorizar comandos sofisticados ):

Abra seu .git/configarquivo no seu editor de texto favorito. Ele estará na pasta em que você clonou ou no repositório em que você executou git init. Entre nesse repositório. .gité uma pasta oculta e pressionar Ctrl+ Hdeve mostrar a pasta oculta ( ls -ano terminal).

Abaixo está uma amostra do .git/configarquivo. Copie e cole essas linhas e atualize essas linhas com suas informações do Git.

[user]
        name = Tux
        email = [email protected]
        username = happy_feet

[remote "origin"]
        url = https://github.com/happy_feet/my_code.git
        fetch = +refs/heads/*:refs/remotes/origin/*

Altere a parte da URL com o seguinte formato para SSH:

url = [email protected]:happy_feet/my_code.git

( Os formatos acima não mudam com vários servidores remotos do Git, como o GitHub ou o Bitbucket. É o mesmo se você estiver usando o Git para controle de versão ):

Nota: A maneira SSH de se conectar a um repositório Git remoto exigirá que você adicione sua chave SSH pública ao servidor remoto Git ( como GitHub ou Bitbucket. Pesquise na página de configurações por chaves SSH ).

Para saber como gerar suas chaves SSH, consulte: Criando chaves SSH

Survesh Jones
fonte
2

Isto é o que funcionou para mim:

git remote set-url origin https://[email protected]/username/reponame.git

Exemplo:

git remote set-url origin https://[email protected]/jsmith/master.git
user5854766
fonte
Obrigado Voto a favor de sua resposta
Mandeep Singh
2

Você precisa executar duas etapas -

  1. git remote remove origin
  2. git remote add origin [email protected]:NuggetAI/nugget.git

Observe que o URL do Git é um URL SSH e não um URL HTTPS ... Que você pode selecionar aqui:

Digite a descrição da imagem aqui

sapy
fonte
2

Se você clonou o HTTPS em vez do SSH e enfrentou um problema com o prompt de nome de usuário e senha ao puxar, pressione e busque. Você pode resolver este problema simplesmente para UBUNTU

Etapa 1: mover para o diretório raiz

cd ~/

crie um arquivo .git-credentials

Adicione esse conteúdo a esse arquivo com você usename passwordegithosting URL

https://user:[email protected]

Em seguida, execute o comando

git config --global credential.helper store

Agora você poderá pressionar e buscar todos os detalhes do seu repositório sem qualquer aborrecimento.

Akhilraj NS
fonte
0

Se você estiver usando o Git (por exemplo, Git Bash) no Windows (e se não quiser mudar de HTTPS para SSH), também poderá usar o Git Credential Manager para Windows

Esta aplicação irá manter o nome de usuário e senha para você ...

boly38
fonte
0

Como muitos usuários disseram, basta alterar o URL do repositório Git de HTTPS para SSH.

Se você não gerou uma chave SSH em sua máquina, precisará fazê-lo.

Apenas como informação adicional, depois de fazer essa alteração, ainda estava recebendo o mesmo erro:

Permissão negada.

No meu caso, o problema era que eu estava usando o Shell do Windows para executar o comando ngh; como esse comando deve abrir um prompt para solicitar a frase SSH e o Windows Shell não abrir esse tipo de prompt, a autenticação falhou.

Então, eu apenas tive que abrir o shell do Git e executar o comando ngh lá, colocar a frase SSH no prompt toda vez que ele pedisse e "voilà" ... Funcionou bem!

Thisisalexis
fonte
0
    # create the company identity file
    ssh-keygen -t rsa -b 4096 -C "[email protected]"
    # save private key to ~/.ssh/id_rsa.corp, 
    cat ~/.ssh/id_rsa.corp.pub # copy paste this string into your corp web ui security ssh keys

    # create your private identify file
    ssh-keygen -t rsa -b 4096 -C "[email protected]"
    # save private key to ~/.ssh/id_rsa.me, note the public key ~/.ssh/id_rsa.me.pub
    cat ~/.ssh/id_rsa.me.pub # copy paste this one into your githubs, private keys

    # clone company internal repo as follows
    GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa.corp -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no" \
    git clone [email protected]:corp/project.git

    export git_msg="my commit msg with my corporate identity"
    git add --all ; git commit -m "$git_msg" --author "MeFirst MeLast <[email protected]>"
    GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa.corp -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no" \
    git push 

    # clone public repo as follows
    GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa.corp -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no" \
    git clone [email protected]:acoolprojectowner/coolproject.git

    export git_msg="my commit msg with my personal identity"
    git add --all ; git commit -m "$git_msg" --author "MeFirst MeLast <[email protected]>"
    GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa.me -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no" \
    git push 

    # stop :: how-to use different ssh identity files
Yordan Georgiev
fonte