Поиск по сайту:

Как исправить Git, используя неправильный ключ и учетную запись SSH


При подключении к удаленному серверу Git, например Github, ваш клиент должен пройти аутентификацию с использованием токенов на основе HTTPS или SSH. Если вы используете последний, у вас могут возникнуть проблемы с обработкой ключей, в том числе Git использует неправильный ключ SSH и подписывает вас в другую учетную запись.

В чем проблема?

Если у вас вообще нет ключа SSH в вашей учетной записи, вы почти наверняка получите следующую ошибку при попытке нажать:

Permission denied (publickey).
fatal: Could not read from remote repository.

Это, вероятно, самая распространенная ошибка Git, и решение ее простое — настройте ключ SSH для своей учетной записи.

Но вы также можете столкнуться с очень похожим сообщением об ошибке, даже после правильной настройки ключа SSH. Если вы используете несколько учетных записей Git, у вас может возникнуть эта ошибка:

Permission to Username/Repository.git denied to otheraccount.
fatal: Could not read from remote repository.

В этом случае Github принял ваш SSH-ключ, но все равно работает некорректно; даже если ваш локальный репозиторий git настроен на использование правильного адреса электронной почты, если вы дадите ему неправильный ключ, он идентифицирует вас как не того пользователя. Это принципиально отличается от первой ошибки. Это не «отказано в доступе», а «отказано в доступе к учетной записи».

Это может быть проблемой, если у вас несколько учетных записей и вам нужно использовать отдельные ключи для каждой из них. Из-за того, как работает аутентификация SSH, он по-прежнему «зарегистрирует вас» на удаленном сервере Git, но как неправильный пользователь. Когда Github проверяет, есть ли у этого пользователя доступ к репозиторию, скорее всего, произойдет сбой, что приведет к ошибке, в которой говорится, что у вашей учетной записи нет разрешения на использование вашего собственного репозитория.

Решение состоит в том, чтобы правильно управлять несколькими ключами SSH, чтобы ваш клиент git не отправлял на сервер неправильный ключ. Вы можете сделать это, отредактировав файлы конфигурации SSH.

Убедитесь, что Git настроен правильно

Во-первых, вы должны убедиться, что ваш репозиторий настроен на использование правильного адреса электронной почты и имени пользователя. Вы можете проверить это из конфигурации Git:

git config --list

И задайте имя и адрес электронной почты для этого репозитория (или используйте --global, чтобы установить его для всех репозиториев):

git config user.name "Name"
git config user.email "email@gmail.com"

Если у вас нет проблем с ключом SSH, это может быть все, что вам нужно.

Редактирование ~/.ssh/config

Если у вас нет существующего ключа, который вы хотели бы использовать, вам нужно будет создать новый файл ключа для своей учетной записи. Если вы это сделаете, вам нужно будет переместить или переименовать правильный в ~/.ssh, чтобы он не конфликтовал с вашим id_rsa по умолчанию. В этом случае мы создадим новый ключ с именем «github»:

ssh-keygen -t rsa -f ~/.ssh/github

Чтобы использовать несколько ключей SSH, вам потребуется отредактировать ~/.ssh/config и настроить новый блок Host для Github, указывающий на только что созданный файл ключа. SSH будет использовать это для выбора ключа SSH, который он будет использовать.

Host main
  Hostname github.com
  IdentityFile ~/.ssh/github
  IdentitiesOnly yes

Host old
  Hostname github.com
  IdentityFile ~/.ssh/id_rsa
  IdentitiesOnly yes

Если у вас есть только один хост-блок для нового ключа, вам не нужно ничего делать, и вы сможете подключиться к Github прямо сейчас. Если у вас есть несколько блоков для разных ключей, вам нужно отредактировать удаленный репозиторий так, чтобы github.com было заменено именем блока хоста в файле конфигурации SSH. Это позволит вручную выбрать ключ, а не полагаться на конфликтующий поиск.

git remote remove origin

git remote add origin git@main:username/repository.git

Поиск неисправностей

После настройки конфигурации хоста SSH и настройки удаленных устройств Git должен использовать правильный ключ SSH при отправке. Если у вас все еще есть проблемы, вы можете отладить проблему, вручную задав команду SSH, которую Git использует для сеанса оболочки, используя переменную среды GIT_SSH_COMMAND .

GIT_SSH_COMMAND='ssh -i ~/.ssh/github -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no'

Вы также захотите проверить и убедиться, что Git использует ключ из того места, которое вы ожидаете. В Windows это расположение может сильно различаться в зависимости от того, через какое программное обеспечение вы используете Git. Например, при использовании клиентского графического интерфейса Fork по умолчанию использовался агент Windows SSH, но я настроил новый ключ SSH, который он использовал вместо этого.