Escreva isso para aqueles que estão começando o Git e o BitBucket no Windows e que não estão tão familiarizados com o Bash (já que esse é um problema comum e um resultado do Google de alto nível ao procurar a mensagem de erro na pergunta).
Para aqueles que não se importam com HTTPS e estão procurando uma solução rápida, role até a parte inferior desta resposta para obter instruções em FOR THE LAZY
Para aqueles que procuram resolver o problema real, siga as instruções abaixo:
Corrigindo o problema SSH o mais rápido possível
Este é um conjunto de instruções derivadas do URL vinculado pelo VonC. Foi modificado para ser o mais resiliente e sucinto possível.
Defina suas informações globais se você ainda não tiver:
$ git config --global user.name "Your Name"
$ git config --global user.email "you@example.com"
Verifique o OpenSSH:
$ ssh -v localhost
OpenSSH_4.6p1, OpenSSL...
Viu algo assim?
- Sim: continue.
- Não: pule para a seção FOR THE LAZY ou siga o artigo vinculado do VonC.
Veja se você já gerou as chaves:
$ ls -a ~/.ssh/id_*
Se houver dois arquivos, você pode pular a próxima etapa.
$ ssh-keygen
Deixe tudo como o padrão, digite uma senha. Agora você deve ver resultados com este comando:
$ ls -a ~/.ssh/id_*
Verifique se há um arquivo de configuração existente:
$ ls -a ~/.ssh/config
Se você obtiver um resultado, verifique este arquivo para obter informações incorretas. Se não houver arquivo, faça o seguinte:
$ echo "Host bitbucket.org" >> ~/.ssh/config
$ echo " IdentityFile ~/.ssh/id_rsa" >> ~/.ssh/config
Confirme o conteúdo:
$ cat ~/.ssh/config
Host bitbucket.org
IdentityFile ~/.ssh/id_rsa
- O espaço único antes de "IdentityFile" é necessário.
Verifique se você está iniciando o agente SSH toda vez que executar o GitBash:
$ cat ~/.bashrc
- Se você vir uma função chamada
start_agent
, esta etapa já foi concluída.
- Se não houver arquivo, continue.
- Se houver um arquivo que não contenha essa função, você estará em uma situação complicada. Provavelmente é seguro anexá-lo (usando as instruções abaixo), mas pode não ser! Se não tiver certeza, faça um backup do seu .bashrc antes de seguir as instruções abaixo ou vá para FOR THE LAZY seção .
Digite o seguinte no GitBash para criar seu arquivo .bashrc:
$ echo "SSH_ENV=$HOME/.ssh/environment" >> ~/.bashrc
$ echo "" >> ~/.bashrc
$ echo "# start the ssh-agent" >> ~/.bashrc
$ echo "function start_agent {" >> ~/.bashrc
$ echo " echo \"Initializing new SSH agent...\"" >> ~/.bashrc
$ echo " # spawn ssh-agent" >> ~/.bashrc
$ echo " /usr/bin/ssh-agent | sed 's/^echo/#echo/' > \"\${SSH_ENV}\"" >> ~/.bashrc
$ echo " echo succeeded" >> ~/.bashrc
$ echo " chmod 600 \"\${SSH_ENV}\"" >> ~/.bashrc
$ echo " . \"\${SSH_ENV}\" > /dev/null" >> ~/.bashrc
$ echo " /usr/bin/ssh-add" >> ~/.bashrc
$ echo "}" >> ~/.bashrc
$ echo "" >> ~/.bashrc
$ echo "if [ -f \"\${SSH_ENV}\" ]; then" >> ~/.bashrc
$ echo " . \"\${SSH_ENV}\" > /dev/null" >> ~/.bashrc
$ echo " ps -ef | grep \${SSH_AGENT_PID} | grep ssh-agent$ > /dev/null || {" >> ~/.bashrc
$ echo " start_agent;" >> ~/.bashrc
$ echo " }" >> ~/.bashrc
$ echo "else" >> ~/.bashrc
$ echo " start_agent;" >> ~/.bashrc
$ echo "fi" >> ~/.bashrc
Verifique se o arquivo foi criado com sucesso (o seu deve diferir apenas onde "seu nome de usuário" aparece):
$ cat ~/.bashrc
SSH_ENV=/c/Users/yourusername/.ssh/environment
# 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
- Feche o GitBash e abra-o novamente.
- Você deve solicitar sua senha (para o arquivo SSH que você gerou anteriormente).
- Se não for solicitado, você não definiu uma senha ou o GitBash não está executando o script .bashrc (o que seria estranho, considere revisar o conteúdo dele!). Se você estiver executando isso em um Mac (OS X),
.bashrc
não é executado por padrão - .bash_profile
é. Para corrigir isso, coloque esse trecho no seu .bash_profile
:[[ -s ~/.bashrc ]] && source ~/.bashrc
Se você não inserisse uma senha, você teria visto algo assim ao iniciar o GitBash:
Initializing new SSH agent...
succeeded
Identity added: /c/Users/yourusername/.ssh/id_rsa (/c/Users/yourusername/.ssh/id_rsa)
E o seguinte deve retornar resultados:
$ ssh-add -l
No entanto, se você obtiver o seguinte em ssh-add -l
:
Could not open a connection to your authentication agent.
Não gerou o agente SSH e é provável que o seu .bashrc seja a causa.
Se, ao iniciar o GitBash, você verá o seguinte:
Initializing new SSH agent...
sh.exe": : No such file or directory
Isso significa que você esqueceu de escapar do $ com a \ ao ecoar no arquivo (ou seja, as variáveis foram expandidas). Recrie seu .bashrc para resolver isso.
Verifique se o agente está em execução e se suas chaves foram adicionadas:
$ ssh-add -l
Deve retornar algo semelhante a este:
2048 0f:37:21:af:1b:31:d5:cd:65:58:b2:68:4a:ba:a2:46 /Users/yourusername/.ssh/id_rsa (RSA)
Execute o seguinte comando para obter sua chave pública:
$ cat ~/.ssh/id_rsa.pub
(deve retornar algo começando com "ssh-rsa ......"
- Clique no ícone da janela GitBash
- Clique em Edit
- Clique em Marcar
- Realce a chave pública usando o mouse (incluindo o
ssh-rsa
bit inicial e o final == youremail@yourdomain.com
)
- Clique com o botão direito do mouse na janela (executa uma cópia)
- Cole sua chave pública no bloco de notas.
- Exclua todas as novas linhas, para que seja apenas uma única linha.
- Pressione
CTRL+A
e CTRL+C
para copiar a chave pública novamente para a área de transferência.
Configure sua chave privada com o BitBucket, executando as seguintes etapas:
- Abra seu navegador e navegue até o site BitBucket.org
- Entre no BitBucket.org
- Clique no seu avatar (canto superior direito)
- Clique em Gerenciar conta
- Clique em Chaves SSH (em Segurança no menu à esquerda)
- Clique em Adicionar chave
- Digite
Global Public Key
para o rótulo
- Cole a chave pública que você copiou do Bloco de notas
Uma Global Public Key
entrada agora deve estar visível na sua lista de chaves.
- Voltar ao GitBash
- cd no diretório que contém seu projeto
- Altere sua origem para a variação SSH (não será se você executou as etapas FOR THE LAZY )
Verifique seus controles remotos:
$ git remote -v
Alterne para o URL SSH:
$ git remote set-url origin git@bitbucket.org:youraccount/yourproject.git
Verifique se as coisas estão funcionando corretamente:
$ git remote show origin
Você deve ver algo assim:
Warning: Permanently added the RSA host key for IP address '...' to the list of known hosts.
* remote origin
Fetch URL: git@bitbucket.org:youruser/yourproject.git
Push URL: git@bitbucket.org:youruser/yourproject.git
HEAD branch: master
Remote branch:
master tracked
Local ref configured for 'git push':
master pushes to master (fast-forwardable)
FEITO!
Você pode optar por usar HTTPS em vez de SSH. Isso exigirá que você digite sua senha durante operações remotas (é armazenada em cache temporariamente após a digitação). Aqui está como você pode configurar o HTTPS:
PARA O PREGUIÇOSO
Você deve corrigir o problema de SSH, conforme descrito por VonC; no entanto, se você estiver com pressa de confirmar e não tiver as ferramentas / tempo / conhecimento para gerar uma nova chave pública agora , defina sua origem para a alternativa HTTPS:
> https://accountname@bitbucket.org/accountname/reponame.git
Usando uma ferramenta GUI, como o TortoiseGit ou ferramentas de linha de comando .
Aqui está a documentação deste URL de origem alternativo.
Linha de comando para adicionar uma origem se não existir:
git remote add origin https://accountname@bitbucket.org/accountname/reponame.git
Linha de comando para alterar uma origem existente:
git remote set-url origin https://accountname@bitbucket.org/accountname/reponame.git
NOTA: o nome da sua conta não é o seu email.
Você também pode definir suas informações globais:
git config --global user.name "Your Name"
git config --global user.email "you@example.com"
Em seguida, tente seu push novamente (não há necessidade de confirmar novamente)
git push origin master