Ответ 1
Это написано для тех, кто только начинает работать с Git и BitBucket в Windows и кто не так хорошо знаком с Bash (поскольку это и общая проблема, и высокий результат Google при поиске сообщения об ошибке в вопросе).
Для тех, кто не возражает против HTTPS и кто ищет быстрое решение, прокрутите до конца этого ответа для инструкций под FOR LAZY
Для тех, кто хочет решить актуальную проблему, следуйте инструкциям ниже:
Как можно быстрее исправить проблему с SSH
Это набор инструкций, полученных из URL, на который ссылается VonC. Он был изменен, чтобы быть как можно более эластичным и лаконичным.
-
Не вводите
$
или любые строки, которые не начинаются с$
($
означает, что это то, что вы вводите в GitBash). -
Откройте GitBash
Установите глобальную информацию, если вы еще этого не сделали:
$ git config --global user.name "Your Name"
$ git config --global user.email "[email protected]"
Проверьте на OpenSSH:
$ ssh -v localhost
OpenSSH_4.6p1, OpenSSL...
Видите что-то подобное?
- Да, продолжить
- Нет: перейдите в раздел FOR LAZY или перейдите по ссылке на статью от 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
- Нажмите Редактировать
- Нажмите Марк
- Выделите открытый ключ с помощью мыши (включая ведущий бит
ssh-rsa
и завершающий бит== [email protected]
) - Щелкните правой кнопкой мыши окно (выполняет копирование)
- Вставьте свой открытый ключ в Блокнот.
- Удалите все новые строки так, чтобы это была только одна строка.
- Нажмите
CTRL+A
затемCTRL+C
чтобы снова скопировать открытый ключ в буфер обмена.
Настройте свой закрытый ключ с помощью BitBucket, выполнив следующие шаги:
- Откройте браузер и перейдите на сайт BitBucket.org
- Войдите в BitBucket.org
- Нажмите на свой аватар (вверху справа)
- Нажмите Управление учетной записью
- Нажмите SSH Keys (под Security в левом меню)
- Нажмите Добавить ключ
- Введите
Global Public Key
для метки - Вставьте открытый ключ, который вы скопировали из Блокнота
Теперь запись Global Public Key
должна быть видна в вашем списке ключей.
- Вернуться в GitBash
- Перейдите в каталог, содержащий ваш проект
- Измените свое происхождение на вариант SSH (этого не будет, если вы выполнили шаги FOR THE LAZY)
Проверьте свои пульты:
$ git remote -v
Переключитесь на URL SSH:
$ git remote set-url origin [email protected]: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: [email protected]:youruser/yourproject.git
Push URL: [email protected]: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://[email protected]/accountname/reponame.git
Использование инструмента с графическим интерфейсом, такого как TortoiseGit или инструментов командной строки.
Вот документация этого альтернативного источника URL.
Командная строка для добавления источника, если он не существует:
git remote add origin https://[email protected]/accountname/reponame.git
Командная строка для изменения существующего источника:
git remote set-url origin https://[email protected]/accountname/reponame.git
ПРИМЕЧАНИЕ: имя вашей учетной записи не ваш адрес электронной почты.
Вы также можете установить глобальную информацию:
git config --global user.name "Your Name"
git config --global user.email "[email protected]"
Затем попробуйте еще раз (нет необходимости совершать еще раз)
git push origin master