Was Sie sehen
git@github.com: Permission denied (publickey).
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
Die erste Zeile ist der eigentliche Fehler, und er kommt von SSH. Die Zeilen von Git erscheinen auch bei vielen anderen Fehlern, lassen Sie sich also nicht dazu verleiten, beim Repository zu suchen.
SSH ohne Git testen
ssh -T git@github.com
Wird der Schlüssel akzeptiert, begrüßt GitHub Sie und schließt die Verbindung. Der Exit-Status ist auch dann 1, weil GitHub keine Shell anbietet:
Hi username! You've successfully authenticated, but GitHub does not provide shell access.
- Sie erhalten
Permission denied (publickey): Folgen Sie den Ursachen unten. - Sie erhalten die Begrüßung mit einem anderen als dem erwarteten Namen: SSH verwendet einen Schlüssel eines anderen Kontos. Siehe Ursache 3.
- Sie erhalten die Begrüßung mit dem richtigen Namen, aber Git scheitert mit
Repository not found: Ihr Konto hat keinen Zugriff auf dieses Repository, oder die URL ist falsch.
Ursache 1: Es wird kein oder der falsche Schlüssel angeboten
ssh -vT git@github.com 2>&1 | grep -E 'identity file|Offering|Authentications'
Eine Zeile, die auf type -1 endet, heißt, dass SSH keine solche Datei gefunden hat. SSH sucht nach Standardnamen wie ~/.ssh/id_ed25519 und ~/.ssh/id_rsa. Ohne jede Zeile Offering public key wurde nichts versucht. Sehen Sie nach, was vorhanden ist:
ls -l ~/.ssh/
ssh-add -l
Hat Ihr Schlüssel einen anderen Dateinamen, teilen Sie das SSH in ~/.ssh/config mit:
Host github.com
User git
IdentityFile ~/.ssh/id_ed25519_github
IdentitiesOnly yes
Prüfen Sie das Ergebnis, ohne sich zu verbinden:
ssh -G github.com | grep -E '^(user|identityfile|identitiesonly) '
Haben Sie gar keinen Schlüssel, folgen Sie SSH-Schlüssel zu GitHub hinzufügen.
Ursache 2: Der öffentliche Schlüssel ist nicht in Ihrem Konto
Vergleichen Sie Fingerprints, nicht das Aussehen des Schlüssels:
ssh-keygen -lf ~/.ssh/id_ed25519.pub
Öffnen Sie dann GitHub, Settings, SSH and GPG keys, und suchen Sie denselben SHA256:-Wert. Fehlt er, fügen Sie den Inhalt der .pub-Datei hinzu. Fügen Sie niemals den privaten Schlüssel ein. Ein Schlüssel, der in einem Repository als Deploy Key dient, kann nicht zusätzlich einem Konto hinzugefügt werden.
Ursache 3: Das falsche Konto
Haben Sie ein berufliches und ein privates Konto, gewinnt der erste Schlüssel, den GitHub erkennt, auch wenn er zum anderen Konto gehört. IdentitiesOnly yes wie oben beschränkt SSH auf den Schlüssel, den Sie nennen. Um zwei Konten nebeneinander zu nutzen, siehe mehrere GitHub-Konten.
Nur für ein Repository können Sie einen Schlüssel direkt festlegen:
git config core.sshCommand "ssh -i ~/.ssh/id_ed25519_work -o IdentitiesOnly=yes"
Ursache 4: Der falsche Benutzer in der URL
Der Benutzer ist immer git, nicht Ihr GitHub-Name:
git remote -v
Ein korrektes SSH-Remote beginnt mit git@github.com:. Hat Ihres einen anderen Benutzernamen, setzen Sie es neu:
git remote set-url origin git@github.com:owner/repo.git
Ursache 5: sudo
sudo git pull läuft als root, daher sucht SSH in /root/.ssh, und Ihr Agent ist meist außer Reichweite. Korrigieren Sie stattdessen den Besitzer des Ordners und führen Sie Git als Sie selbst aus:
sudo chown -R "$USER" /path/to/repo
Ursache 6: Der Schlüssel ist nicht geladen
Ein Schlüssel mit Passphrase, den eine GUI-App oder ein Skript ohne Möglichkeit zur Nachfrage nutzt, scheitert, als fehlte er. Laden Sie ihn:
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519
Gibt das einen Fehler aus, siehe Could not open a connection to your authentication agent.
Auf dem Mac vergisst der Agent den Schlüssel nach einem Neustart. Speichern Sie die Passphrase einmal im Schlüsselbund:
ssh-add --apple-use-keychain ~/.ssh/id_ed25519
Fügen Sie dann diese zwei Zeilen dem Block Host github.com in ~/.ssh/config hinzu, damit SSH den Schlüssel selbst lädt:
AddKeysToAgent yes
UseKeychain yes
Weitere Dinge zum Ausprobieren
- Schlüsselrechte: Erwähnt die Ausgabe
UNPROTECTED PRIVATE KEY FILE, siehe diese Lösung. - Viele Schlüssel im Agent: siehe Too many authentication failures.
- In CI: Nutzen Sie einen Deploy Key oder ein Token Ihres CI-Systems. Persönliche Schlüssel gehören dort nicht hin.
- Für einen schnellen Ausweg umgeht HTTPS mit einem Token SSH ganz:
git remote set-url origin https://github.com/owner/repo.git. - Git auf einem entfernten Server: Leiten Sie Ihren Schlüssel über den Agent weiter, statt ihn dorthin zu kopieren, nachdem Sie die Risiken von SSH-Agent-Forwarding gelesen haben.
Fragen
Warum meldet Git Could not read from remote repository?
Das ist Gits allgemeine Zeile, nachdem SSH gescheitert ist. Die eigentliche Ursache steht in der Zeile darüber, hier Permission denied (publickey): GitHub hat keinen der von SSH angebotenen Schlüssel akzeptiert.
Wie sehe ich, welchen Schlüssel SSH an GitHub schickt?
Führen Sie ssh -vT git@github.com aus und lesen Sie die Zeilen Offering public key. ssh-add -l zeigt die im Agent geladenen Schlüssel.
Warum scheitert git pull nur mit sudo?
sudo läuft als root, SSH liest also /root/.ssh und erreicht Ihren Agent meist nicht. Führen Sie Git als Ihr eigener Benutzer aus und korrigieren Sie stattdessen den Besitzer des Ordners.
Quellen
- Error: Permission denied (publickey), GitHub Docs
- Testing your SSH connection, GitHub Docs
- SSH-Schlüssel mit GitLab verwenden
- git-config(1), core.sshCommand