O Git continua me solicitando uma senha


665

Estou usando o Git há algum tempo, mas as solicitações constantes de senha estão começando a me deixar maluco.

Estou usando o Mac OS X e o GitHub e configurei o Git e minhas chaves SSH conforme as instruções da página Configurar o Git do GitHub .

Também adicionei a chave SSH do github ao meu chaveiro do Mac OS X, conforme mencionado na página de senhas de chave SSH do GitHub . Minha chave pública está registrada no Git.

No entanto, toda vez que tento puxar o Git, tenho que inserir meu nome de usuário e senha. Existe algo além de uma chave SSH que eu preciso configurar para isso?


1
Pergunta boba, mas você verificou que a chave SSH funciona ao simplesmente usar ssh na máquina com git?
Kurt Stutsman

4
Você quer dizer algo como ssh -T git@github.com? Sim, isso funciona muito bem (embora um pouco lento).
Catherine


Para https url, você pode usar (com git1.8.3 +) um auxiliar de credencial git ' netrc'. Veja um exemplo completo aqui .
VonC

Eu sou um usuário do Windows e também estava enfrentando um problema de solicitação de senha, mesmo depois de adicionar minha chave pública ao arquivo do servidor protected_keys. O que realmente era o problema era que eu não mantinha minhas chaves públicas / privadas na pasta .ssh da pasta c: \ program files \ git. Se alguém estiver enfrentando esse problema, copie suas chaves nesta pasta e tente empurrar / puxar.
Raja Amer Khan

Respostas:


797

Eu acho que você pode ter o URL do repositório Git errado.

Abra .git/confige localize a seção [remote "origin"]. Verifique se você está usando o SSH:

ssh://git@github.com/username/repo.git

Você pode ver a URL SSH na página principal do seu repositório se clicar em Clonar ou baixar e escolher ssh .

E NÃO o httpsou gitum:

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

Agora você pode validar apenas com a chave SSH em vez do nome de usuário e senha.

Se o Git reclamar disso 'origin' has already been added, abra o .configarquivo e edite a url = "..."peça depois [remote origin]comourl = ssh://github/username/repo.git


O mesmo vale para outros serviços. Verifique se o endereço se parece com:protocol://something@url

Por exemplo, .git/configpara DevOps do Azure:

[remote "origin"]
    url = https://mystore@dev.azure.com/mystore/myproject/
    fetch = +refs/heads/*:refs/remotes/origin/*

4
Pode ser isso. Quando chamo git remote -v, recebo: origin github.com/Foo/Bar.git (busca) origin github.com/Foo/Bar.git (push) enquanto que para trabalhar com SSH, parece que deveria ser: origin git @ github.com: origem Foo / Bar.git (busca) git@github.com: Foo / Bar.git (push) Isso pode ser porque eu originalmente fiz o check-out do meu projeto usando o aplicativo Mac do GitHub ( mac.github.com ). Alguma idéia de como eu posso consertar isso?
Catherine

8
Corrija o URL no arquivo .git / config, use git-remote para corrigi-lo ou exclua seu repositório local e clone-o novamente com o URL correto.
static_rtti

91
Apenas para esclarecer isso (como eu precisava): abra .git / config e no [remote "origin"]conjunto de seções url = ssh://git@github.com/username/Repo.git. Isso funcionou para mim.
Greg K

13
Estranho, a solução do @ GregK não funcionou para mim, mas url = git@github.com:organization/Repo.gitfuncionou. 1 por me levar pelo caminho certo! Sucesso!
jmort253

3
Não posso enfatizar o suficiente a importância de CLONE usando ssh: // git @ github / [nome de usuário] / [reponame]. Git é que você deseja usar uma chave para acessar o GIT para não precisar digitar seu nome de usuário e senha toda vez . Eu encontrei a única maneira de corrigi-lo foi remover o repositório local e clonar novamente $ git clone ssh: // git @ github / [nome de usuário] / [nome do usuário] .git #
Gene Myers

555

Configurando credential.helper

No OS X (agora macOS), execute isso no Terminal :

git config --global credential.helper osxkeychain

Ele permite que o Git use o arquivo Keychain.app para armazenar o nome de usuário e a senha e recuperar a frase secreta para sua chave SSH privada do chaveiro.

Para uso do Windows:

git config --global credential.helper wincred

Solução de problemas

Se o assistente de credencial do Git estiver configurado corretamente, o macOS salvará a frase secreta no chaveiro. Às vezes, a conexão entre o SSH e as senhas armazenadas no chaveiro pode ser interrompida. Execute ssh-add -Kou ssh-add ~/.ssh/id_rsaadicione a chave ao chaveiro novamente.

o macOS v10.12 (Sierra) muda para ssh

Para o macOS v10.12 (Sierra), é ssh-add -Knecessário executar após cada reinicialização. Para evitar isso, crie ~/.ssh/configcom este conteúdo.

Host *
   AddKeysToAgent yes
   UseKeychain yes
   IdentityFile ~/.ssh/id_rsa

Na ssh_config manpágina 10.12.2:

UseKeychain

No macOS, especifica se o sistema deve procurar senhas nas chaves do usuário ao tentar usar uma chave específica. Quando a frase secreta é fornecida pelo usuário, essa opção também especifica se a frase secreta deve ser armazenada no chaveiro depois que se verificar que está correta. O argumento deve ser 'yes' ou 'no'. O padrão é 'não'.

A Apple adicionou a nota técnica 2449, que explica o que aconteceu.

Antes do macOS Sierra, sshapresentava uma caixa de diálogo solicitando sua senha e oferecia a opção de armazená-la no chaveiro. Esta interface do usuário foi descontinuada há algum tempo e foi removida.


30
Essa é de longe a melhor maneira de fazer isso, pois o aplicativo Github para OSX (talvez também para Windows) usa o caminho https para repositórios git por padrão. Também há um bom motivo para usar https em vez de ssh / git, pois muitas redes corporativas só permitem tráfego nas portas 80 e 443 por razões de segurança.
codehugger

2
Você precisa do git 1.7.10 ou mais recente para usar o auxiliar de credencial.
jbandi

3
+1 para a solução keychain.app. Isso é ótimo para mim, porque o servidor git do meu empregador suporta apenas http servido via apache e eles desencorajam fortemente o uso do .netrcmétodo file, que coloca sua senha em texto sem formatação.
Josh

3
Observe, recebi o erro 'credential-osxkeychain' is not a git command.porque não tinha o auxiliar de credencial instalado. Segui as instruções aqui para instalá-lo: help.github.com/articles/set-up-git#password-caching
Hugh

2
Obrigado pela atualização do Sierra, acabei de atualizar e não consegui descobrir por que o github continuava pedindo pw quando adicionei o git config --global credential.helper osxkeychainarquivo The config no meu .sshdiretório que me corrigia.
pixel de 67

139

Isso aconteceu comigo quando atualizei para o macOS v10.12 (Sierra). Parece que o agente SSH foi liberado após a atualização.

$ ssh-add -L
The agent has no identities.

Simplesmente executando ssh-addlocalizado minha identidade existente. Digitei a senha e foi bom voltar novamente.


9
+1 quebrado pela atualização do Sierra. Observe que a senha é a senha da sua chave SSH e não a senha do usuário do Mac.
Mbonness

1
Fazer o ssh-add funciona, mas parece ser redefinido fechando a janela do Terminal. Talvez este seja um novo "recurso".
joshd

Atenção - isso aconteceu novamente com outra atualização do Sierra (10.12.2), mas a mesma correção se aplica.
Brian

Alguém sabe como fazer com que isso não seja redefinido depois que o Terminal for fechado?
nickjwallin

1
Acabei de atualizar o meu macbook pro para 10.12.2 e ele quebrou o meu git. Usar o ssh-add funcionou totalmente para mim. Obrigado @amcc!
Jimmyplaysdrums 4/17

68

Use isto: Substitua github.com pelo nome do host apropriado

git remote set-url origin git@github.com:user/repo.git

Eu já tenho esse conjunto ao visualizar git remote -v. No entanto, ainda estou sendo solicitada uma senha.
IgorGanapolsky

Mesmo, defini como o que ele sugeriu, mas ainda recebo a solicitação de senha, como evito isso?
cyber8200

@IgorGanapolsky: Você já encontrou uma solução para você?
cyber8200

1
Isso funciona corretamente. É estranho que a URL remota com git@**não solicite credenciais e a URL com https@**:). Assim, eu encontrei este documento .
precisa

54

Como já foi dito, você pode instalar um auxiliar de cache de senha. Eu só queria postar o link para outras plataformas, e não apenas para o Mac. Estou executando um servidor Linux e isso foi útil: Armazenando em cache sua senha do GitHub no Git

Para Mac:

git credential-osxkeychain

Janelas:

git config --global credential.helper wincred

Linux:

git config --global credential.helper cache
git config --global credential.helper 'cache --timeout=3600'
# Set the cache to timeout after 1 hour (setting is in seconds)

5
Eu tive que rolar até a terceira resposta para ver as instruções do Linux, estas devem estar na resposta principal, pois é um problema comumente referido.
KoldBane

22

Procure também quem está pedindo a senha. É o Git ou o seu agente SSH?

No meu caso, toda vez que eu fazia git pullisso me perguntava:

Enter passphrase for key '/work/username/.ssh/id_rsa':

Então eu assumi que era o Git pedindo uma senha. Por isso, continuei procurando soluções, apenas depois percebi que meu agente SSH havia desligado. Que pode ser corrigido usando eval $(ssh-agent)e ssh-addcomo indicado aqui.

Também colo abaixo um pequeno trecho que você pode adicionar ao seu ~/.bashrcarquivo (ou equivalente) para garantir que o seu agente SSH seja iniciado no seu login.

De qualquer forma, esse foi um erro muito bobo que cometi, mas publicá-lo aqui, apenas no caso de ajudar alguém a economizar algum tempo latindo na árvore errada, como eu fiz.

# Start the ssh-agent
function start_agent {
    echo "Initializing new SSH agent..."

    # Spawn ssh-agent
    /usr/bin/ssh-agent | sed 's/^echo/#echo/' > ${SSH_ENV}
    echo succeeded
    chmod 600 ${SSH_ENV}
    . ${SSH_ENV} > /dev/null
    /usr/bin/ssh-add
}

if [ -f "${SSH_ENV}" ]; then
     . ${SSH_ENV} > /dev/null
     ps -ef | grep ${SSH_AGENT_PID} | grep ssh-agent$ > /dev/null || {
        start_agent;
    }
else
    start_agent;
fi


Tenho certeza de que está faltando uma linha no código acima - conforme stackoverflow.com/a/18915067/277023 você precisa terSSH_ENV="$HOME/.ssh/environment"
kellyfj

20
git config credential.helper store

Nota: Embora isso seja conveniente, o Git armazenará suas credenciais em texto não criptografado em um arquivo local (.git-credentials) no diretório do seu projeto (veja o diretório "home" abaixo). Se você não gostar disso, exclua esse arquivo e mude para a opção de cache.

Se você deseja que o Git continue solicitando credenciais sempre que precisar se conectar ao repositório remoto, você pode executar este comando:

git config --unset credential.helper

Para armazenar as senhas em .git-credentials no diretório% HOME%, em oposição ao diretório do projeto: use o sinalizador --global

git config --global credential.helper store

9

Guia do Git no Windows e do GitHub usando SSH para empurrar / puxar: Um guia ilustrado do Git no Windows

  1. Baixe e instale o PuTTY
  2. Defina a variável de ambiente 'GIT_SSH' = 'caminho \ para \ plink.exe' (na pasta de instalação instalada) - muito importante !!!
  3. Reinicie o Windows Explorer para que as variáveis ​​de ambiente entrem em vigor (não é possível reiniciar apenas o prompt de comando)
  4. Execute puttygen.exe para gerar nova chave, copie a chave pública para o site GitHub
  5. Salve esta nova chave privada em algum lugar seguro no disco (preferencialmente não no Dropbox )
  6. Execute putty.exe e conecte o SSH ao github.co
  7. Acesse rapidamente a pasta de inicialização executando "shell: startup".
  8. Faça a sua chave privada inicializar com o Windows via concurso. Crie um atalho na pasta Inicialização com a sintaxe "caminho \ para \ pageant.exe" "caminho \ para \ chave privada"
  9. Não precisamos definir a configuração 'puttykeyfile' dentro de .git / config de nossos repositórios
  10. Muito importante é que o "URL do clone SSH" do GitHub seja usado e não HTTPS.

Ninguém deveria mais usar massa de vidraceiro. Agora você pode fazer tudo com os utilitários integrados do Windows 10. Vamos massa, apenas ser massa.
Ian Smith

9

No Windows for Git 1.7.9+, execute o seguinte comando no prompt de comando para abrir o arquivo de configuração em um editor de texto:

    git config --global --edit

Em seguida, no arquivo, adicione o seguinte bloco, se não estiver presente, ou edite-o de acordo:

    [credential "https://giturl.com"]
        username = <user id>
         helper = wincred

Salve e feche o arquivo. Você precisará fornecer as credenciais apenas uma vez após a alteração acima.


isso funciona perfeito, você salvou minhas horas, agora eu posso me concentrar no meu trabalho, muito obrigado irmão.
Mohammed Sufian

9

Use o comando a seguir para aumentar o período de tempo limite para poder digitar novamente a senha por um tempo

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

Eu o usei no Bitbucket e no GitHub, funciona para ambos. A única coisa que você precisa fazer 3600é em segundos. Aumente-o na extensão que desejar. Eu mudei para 259200cerca de 30 dias. Dessa forma, redigito minha senha a cada 30 dias ou mais.


1
Ok, eu descobri que isso não persistem após um reinício, assim você ainda precisará digitar a senha após um reinício, independentemente do tempo de espera ...
Ben enrolamento

Esta é uma boa maneira de fazer no cache :) Pelo menos, economizei meu tempo. Obrigado
ChikuMiku

@ BenWinding porque armazena credenciais na memória.
Z3dd 04/10/19

5

Acho que você resolveu o seu problema, mas não vejo a solução aqui que me ajudou, então aqui está.

Digite o terminal:

echo "" > ~/.ssh/known_hosts

Isso esvaziará seu known_hostsarquivo e você precisará adicionar todos os hosts que você usou e se conectou, mas resolveu o problema.


1
cat /dev/null > ~/.ssh/known_hostsfará o mesmo.
o homem de lata

5
> ~/.ssh/known_hostsé ainda mais curto :)
Collin Allen

rm ~ / .ssh / known_hosts também deve fazer o trabalho. Eu recomendaria contra isso embora.
orkoden

3
Se você precisar remover um host de ~ / .ssh / known_hosts, há uma maneira menos impactante do que eliminar o arquivo. ~ / .ssh / known_hosts é apenas um arquivo de texto e, se você puder encontrar os hosts ofensivos no arquivo, poderá simplesmente excluir suas linhas. Você pode fazer backup do arquivo antes de editá-lo. Se você tiver apenas algumas entradas no arquivo, apagá-lo pode não ser uma má ideia. Eu trabalho em muitos servidores para que o meu ~ / .ssh / known_hosts tenha centenas de entradas e não estou pronto para excluir todos eles para remover algumas entradas.
Tim Stewart

3
@papan Isso não impede que o git me peça minha senha!
IgorGanapolsky

5

Eu sinto que a resposta fornecida por static_rtti é hacky em algum sentido. Não sei se isso estava disponível anteriormente, mas as ferramentas Git agora fornecem armazenamento de credenciais.

Modo de cache

$ git config --global credential.helper cache

Use o modo "cache" para manter as credenciais na memória por um determinado período de tempo. Nenhuma das senhas é armazenada no disco e é removida do cache após 15 minutos.

Modo Loja

$ git config --global credential.helper 'store --file ~/.my-credentials'

Use o modo "armazenar" para salvar as credenciais em um arquivo de texto sem formatação no disco e elas nunca expiram.

Eu pessoalmente usei o modo de armazenamento . Excluí meu repositório, clonei-o e tive que inserir minhas credenciais uma vez.

Referência: 7.14 Git Tools - Armazenamento de credenciais


Para Windows credential.helper cachenão funciona. Deveria ser git config --global credential.helper wincred.
Paulo Merson

Armazená-lo funcionou e agora me permite confirmar minhas alterações sem solicitar uma senha o tempo todo, você é um salva-vidas!
g4ost 6/09/19

No Linux, isso fez o trabalho para mim git config --local credential.helper store. No meu caso, estou com HTTPS, dessa maneira, digito apenas nome de usuário / senha uma vez e depois disso, minhas credenciais são reutilizadas em ~ / .git-credentials
CCarlos

3

A resposta da orkoden sobre o uso do chaveiro com o Git no seu terminal foi incompleta e gera erros. É isso que você precisa fazer para salvar o nome de usuário e a senha inseridos no terminal do seu chaveiro:

curl http://github-media-downloads.s3.amazonaws.com/osx/git-credential-osxkeychain -o git-credential-osxkeychain
sudo mv git-credential-osxkeychain /usr/local/bin
sudo chmod u+x /usr/local/bin/git-credential-osxkeychain

Então entre

git config --global credential.helper osxkeychain

Se você já fez a parte com a configuração do Git antes do curl, não há problema; vai dar certo


1
E se eu estiver no Linux.
IgorGanapolsky

3

Como static_rtti disse acima, altere

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

para

ssh://git@github.com/username/repo.git

Eu mesmo mudei o httpsarquivo .git / config para ssh, mas ele ainda não estava funcionando. Então eu vi que você deve mudar github.compara git@github.com. Uma boa maneira de obter o URL correto real é ir para a página do seu projeto e clicar aqui:

Altere HTTPS para SSH para obter o URL certo

Em seguida, adicione esse URL ao arquivo de configuração.


Eu tenho isso no meu arquivo de configuração já o que mais devo verificar?
cyber8200

Você também mudou no github.com?
CheesusCrust

3

No Windows Subsystem para Linux (WSL), essa foi a única solução que eu encontrei para trabalhar:

eval `ssh-agent` ; ssh-add ~/.ssh/id_rsa

Ocorreu um problema com o agente ssh não sendo registrado corretamente na WSL.


Foi um whlie, mas foi isso que resolveu o meu problema.
Nam Kim

3

Se você deseja impedir que o Git sempre solicite as credenciais de login do seu repositório GitHub, isso pode ser feito facilmente.

Usando SSH em vez de HTTPS

Você pode atualizar o controle remoto de origem usando SSH em vez de HTTPS "

git remote set-url origin git@github.com:username/your-repo.git

Configure o Git para armazenar sua senha e nome de usuário

Veja como você pode fazer o Git armazenar o nome de usuário e a senha:

git config --global credential.helper store

Em seguida, salve o nome de usuário e a senha para uma sessão:

git config --global credential.helper cache

2

Concordo com o "codehugger" e, usando a instrução "orkoden", funcionou para mim - no NetBeans 7.3 - quando você clica com o botão direito do mouse no arquivo e seleciona o menu de contexto - push - uma janela 'push to remote' é aberta - existem duas opções aqui:

  1. origin:https://github.com/myaccount/myproject.git/

  2. https://github.com/myaccount/myproject.git/

Como você pode ver, a diferença é o parâmetro de origem no URL - você não deseja escolher esta opção (1), mas sim a opção (2), e isso funciona muito bem para mim.


2

Etapa 1: verifique sua configuração atual

cat .git/config

Você vai ter:

[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
    ignorecase = true
    precomposeunicode = true
[remote "origin"]
    url = https://github.com/path_to_your_git.git
    fetch = +refs/heads/*:refs/remotes/origin/*
[user]
    name = your_username
    email = your_email
[branch "master-staging"]
    remote = origin
    merge = refs/heads/master-staging

Etapa 2: remover sua origem remota

git remote rm origin

Etapa 3: adicione a origem remota novamente com seu nome de usuário e senha

git remote add origin https://your_git_username:your_git_password@github.com/path_to_your_git.git

Depois de adicionar a origem remota novamente, você também precisa alinhar seus ramos remoto e local - algo como isto: git branch --set-upstream master origin/master
Richard Bown

2

Se o Git solicitar um nome de usuário e senha sempre que você tentar interagir com o GitHub, provavelmente você está usando a URL do clone HTTPS para seu repositório.

O uso de uma URL remota HTTPS tem algumas vantagens: é mais fácil de configurar que o SSH e geralmente funciona através de firewalls e proxies rigorosos. No entanto, também solicita que você insira suas credenciais do GitHub toda vez que você extrai ou envia um repositório.

Você pode configurar o Git para armazenar sua senha para você. Para Windows :

git config --global credential.helper wincred

2

Ao executar o macOS Cataline 10.15, o método de armazenamento em cache das chaves não estava funcionando para mim. E eu queria usar https://nãossh

Aqui está o que funcionou para mim:

git remote rm origin

git remote add origin https://your_git_username:your_git_password@github.com/path_to_your_git.git

Isso também deve funcionar no GitLab

Verifique se o nome de usuário contém um endereço de e-mail para remover a @emailpeça ou você receberá um erro informando URL using bad/illegal format or missing URL.

Espero que isto ajude!


1
Esta é a única solução que funcionou para mim. your_git_username foi crítico. Na verdade, não era necessário colocar: your_git_password. Nesse ponto, mesmo que ainda solicitasse uma "senha", agora aceitaria a senha da conta.
kbulgrien

1

Existem diferentes tipos de autenticações, dependendo da sua configuração. Aqui estão alguns:

  1. git credential-osxkeychain.

    Se sua credencial for inválida, remova-a:

      git credential-osxkeychain erase
    

    ou:

      printf "protocol=https\nhost=github.com\n" | git credential-osxkeychain erase
    

    Portanto, o Git não solicitará a permissão do chaveiro novamente. Em seguida, configure-o novamente.

    Consulte: Atualizando credenciais do OS X Keychain no GitHub

  2. Sua chave SSH RSA.

    Para isso, você precisa comparar sua chave SSH com o que adicionou, verifique por ssh-add -L/ ssh-add -lse você está usando a identidade certa.

  3. Sua autenticação HTTPS (se você estiver usando em httpsvez de sshprotocolo).

    Use ~/.netrc( %HOME%/_netrcno Windows), para fornecer suas credenciais, por exemplo

      machine stash1.mycompany.com
      login myusername
      password mypassword
    

Saiba mais: Sincronizando com o GitHub no Stack Overflow.





0

Solução Microsoft Stack (Windows e Azure DevOps)

Primeiro abra o .git/configarquivo para verificar se o endereço se parece com:

protocol://something@url

Por exemplo, .git / config para Azure DevOps:

[remote "origin"]
    url = https://mystore@dev.azure.com/mystore/myproject/
    fetch = +refs/heads/*:refs/remotes/origin/*

Se o problema persistir, abra o Windows Credential Manager , clique na caixa segura chamada Windows Credentials e remova todas as credenciais relacionadas ao git.

Agora, da próxima vez que você fizer login no git, ele não desaparecerá mais.


0

Se você tiver um agente SSH configurado, também poderá adicioná-lo ao seu ~/.gitconfigpara forçar o git a usar o SSH para todos os repositórios GitHub em vez de HTTPS:

[url "ssh://git@github.com/"]
    insteadOf = git://github.com/
    insteadOf = https://github.com/

(Se você está trabalhando principalmente com repos públicas, você também pode usar pushInsteadOfem vez de insteadOf, como a leitura de um repo público pode ser feito sem autenticação).

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.