Написание этого для тех, кто только начинает работать с Git и BitBucket в Windows и не так хорошо знаком с Bash (поскольку это и общая проблема, и высокий рейтинг Google при поиске сообщения об ошибке в вопросе).
Для тех, кто не возражает против HTTPS и кто ищет быстрое решение, прокрутите до конца этого ответа, чтобы получить инструкции в разделе ДЛЯ ЛЕНИВЫХ
Для тех, кто хочет решить настоящую проблему, следуйте приведенным ниже инструкциям:
Как можно быстрее устранить проблему с SSH
Это набор инструкций, полученных из URL-адреса, на который ссылается VonC. Он был изменен, чтобы сделать его максимально гибким и лаконичным.
Установите глобальную информацию, если вы еще этого не сделали:
$ git config --global user.name "Your Name"
$ git config --global user.email "you@example.com"
Проверьте OpenSSH:
$ ssh -v localhost
OpenSSH_4.6p1, OpenSSL...
Видите что-то подобное?
- Да: продолжить.
- Нет: перейдите в раздел ДЛЯ ЛЕНИВШИХ или следуйте связанной статье от VonC.
Посмотрите, сгенерировали ли вы уже ключи:
$ ls -a ~/.ssh/id_*
Если файлов два, следующий шаг можно пропустить.
$ ssh-keygen
Оставьте все по умолчанию, введите кодовую фразу. Теперь вы должны увидеть результаты с помощью этой команды:
$ ls -a ~/.ssh/id_*
Проверьте существующий файл конфигурации:
$ ls -a ~/.ssh/config
Если вы получили результат, проверьте этот файл на наличие ошибочной информации. Если файла нет, сделайте следующее:
$ echo "Host bitbucket.org" >> ~/.ssh/config
$ echo " IdentityFile ~/.ssh/id_rsa" >> ~/.ssh/config
Подтвердите содержание:
$ cat ~/.ssh/config
Host bitbucket.org
IdentityFile ~/.ssh/id_rsa
- Один пробел перед "IdentityFile" обязателен.
Убедитесь, что вы запускаете агент SSH каждый раз при запуске GitBash:
$ cat ~/.bashrc
- Если вы видите вызываемую функцию
start_agent
, этот шаг уже выполнен.
- Если файла нет, продолжайте.
- Если есть файл, который не содержит этой функции, у вас неприятная ситуация. Возможно, добавить к нему безопасно (используя приведенные ниже инструкции), но может и не быть! Если вы не уверены, сделайте резервную копию вашего .bashrc перед тем, как следовать приведенным ниже инструкциям, или перейдите к разделу ДЛЯ ЛЕНИВШИХ .
Введите в GitBash следующее, чтобы создать файл .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
Убедитесь, что файл был успешно создан (ваш файл должен отличаться только там, где появляется «yourusername»):
$ 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
- Закройте GitBash и снова откройте его.
- Вас должны попросить ввести кодовую фразу (для файла SSH, который вы создали ранее).
- Если нет запроса, значит, вы либо не установили кодовую фразу, либо GitBash не запускает скрипт .bashrc (что было бы странно, поэтому подумайте о том, чтобы просмотреть его содержимое!). Если вы запускаете это на Mac (OS X),
.bashrc
по умолчанию не выполняется - .bash_profile
есть. Чтобы исправить это, поместите этот фрагмент в свой .bash_profile
:[[ -s ~/.bashrc ]] && source ~/.bashrc
Если бы вы не ввели кодовую фразу, вы бы увидели что-то подобное при запуске GitBash:
Initializing new SSH agent...
succeeded
Identity added: /c/Users/yourusername/.ssh/id_rsa (/c/Users/yourusername/.ssh/id_rsa)
И следующее должно вернуть результаты:
$ ssh-add -l
Однако, если вы получите следующее из ssh-add -l
:
Could not open a connection to your authentication agent.
Это не породило агент SSH, и, вероятно, причиной является ваш .bashrc.
Если при запуске GitBash вы увидите следующее:
Initializing new SSH agent...
sh.exe": : No such file or directory
Это означает, что вы забыли экранировать $ с помощью \ при выводе на файл (т.е. переменные были расширены). Чтобы решить эту проблему, заново создайте свой .bashrc.
Убедитесь, что агент запущен и ваши ключи добавлены:
$ ssh-add -l
Должен вернуть что-то подобное:
2048 0f:37:21:af:1b:31:d5:cd:65:58:b2:68:4a:ba:a2:46 /Users/yourusername/.ssh/id_rsa (RSA)
Выполните следующую команду, чтобы получить свой открытый ключ:
$ cat ~/.ssh/id_rsa.pub
(он должен вернуть что-то, начинающееся с "ssh-rsa ......"
- Щелкните значок окна GitBash
- Нажмите Edit
- Нажмите Отметить
- Выделите открытый ключ с помощью мыши (включая
ssh-rsa
начальный и конечный == youremail@yourdomain.com
бит)
- Щелкните правой кнопкой мыши окно (выполняет копию)
- Вставьте свой открытый ключ в Блокнот.
- Удалите все символы новой строки так, чтобы это была только одна строка.
- Нажмите
CTRL+A
затем, CTRL+C
чтобы снова скопировать открытый ключ в буфер обмена.
Настройте свой закрытый ключ с помощью BitBucket, выполнив следующие действия:
- Откройте браузер и перейдите на сайт BitBucket.org.
- Войти на BitBucket.org
- Щелкните свой аватар (вверху справа)
- Нажмите Управление учетной записью
- Щелкните Ключи SSH (в разделе Безопасность в левом меню)
- Нажмите Добавить ключ
- Введите
Global Public Key
ярлык
- Вставьте открытый ключ, который вы скопировали из Блокнота
Global Public Key
Теперь вход должен быть виден в списке ключей.
- Вернуться в GitBash
- cd в каталог, содержащий ваш проект
- Измените источник на вариант SSH (этого не будет, если вы выполнили шаги FOR THE LAZY )
Проверьте свои пульты:
$ git remote -v
Переключитесь на URL-адрес SSH:
$ git remote set-url origin git@bitbucket.org:youraccount/yourproject.git
Проверить, что все в рабочем состоянии:
$ git remote show origin
Вы должны увидеть что-то вроде этого:
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)
СДЕЛАННЫЙ!
Вы можете выбрать использование HTTPS вместо SSH. Вам потребуется ввести свой пароль во время удаленных операций (он временно кешируется после того, как вы введете его один раз). Вот как вы можете настроить HTTPS:
ДЛЯ ЛЕНИННЫХ
Вы должны исправить проблему SSH, как описано VonC; однако, если вы спешите совершить фиксацию и у вас нет инструментов / времени / знаний для создания нового открытого ключа прямо сейчас , установите в качестве источника альтернативу HTTPS:
> https://accountname@bitbucket.org/accountname/reponame.git
Использование инструмента с графическим интерфейсом, такого как TortoiseGit или инструментов командной строки .
Вот документация этого альтернативного URL-адреса происхождения.
Командная строка для добавления источника, если он не существует:
git remote add origin https://accountname@bitbucket.org/accountname/reponame.git
Командная строка для изменения существующего источника:
git remote set-url origin https://accountname@bitbucket.org/accountname/reponame.git
ПРИМЕЧАНИЕ: имя вашей учетной записи не является вашим адресом электронной почты.
Вы также можете указать свою глобальную информацию:
git config --global user.name "Your Name"
git config --global user.email "you@example.com"
Затем повторите попытку (повторная фиксация не требуется)
git push origin master