HOWTO · Git
Git-Push mit SSH-Schlüssel
In diesem Tutorial wird beschrieben, wie Sie Git-Dateien mit bestimmten SSH-Schlüsseln mithilfe der Befehlszeile auf Remoteserver übertragen. Erfahren Sie, wie Sie SSH-Schlüssel einrichten, Ihr Git-Repository konfigurieren und Änderungen sicher pushen. Ideal für Entwickler, die ihren Arbeitsablauf optimieren und die Sicherheit erhöhen möchten.
Auf dieser Seite
Um einen Git-Branch mit einem SSH-Schlüssel zu pushen, erstellen Sie ein Schlüsselpaar, hinterlegen Sie den öffentlichen Schlüssel in Ihrem Git-Hosting-Konto, richten Sie das Repository-Remote auf dessen SSH-URL aus und pushen Sie anschließend den gewünschten Branch. Der private Schlüssel bleibt auf Ihrem Rechner. SSH authentifiziert Sie beim Host; dieser prüft separat, ob Ihr Konto Schreibzugriff auf das Repository hat.
SSH-Schlüsselpaar erstellen
Wenn Sie noch keinen Schlüssel für dieses Konto haben, erstellen Sie mit ssh-keygen ein Ed25519-Schlüsselpaar. Das folgende Beispiel erzeugt ein temporäres Schlüsselpaar, um den Befehl zu demonstrieren, ohne Ihre üblichen Dateien unter ~/.ssh zu ändern. Führen Sie es in einer POSIX-Shell aus; Ihre SSH-Konfiguration wird dadurch nicht geändert.
set -e
key_dir=$(mktemp -d)
trap 'rm -rf "$key_dir"' EXIT
ssh-keygen -q -t ed25519 -C "git@example.com" -f "$key_dir/id_ed25519" -N ""
test -s "$key_dir/id_ed25519.pub"
printf 'Created the Ed25519 public key file.\n'
Created the Ed25519 public key file.
Für diese Demonstration setzt -N "" eine leere Passphrase, sodass ssh-keygen keine interaktiven Fragen stellt. Für einen dauerhaft verwendeten Schlüssel lassen Sie -f weg, um den Standardspeicherort zu übernehmen, oder geben Sie einen Pfad wie ~/.ssh/id_ed25519_work an; ssh-keygen fragt dann zuerst nach dem Speicherort und anschließend nach einer Passphrase. Geben Sie eine Passphrase ein, um den gespeicherten Schlüssel zu schützen, oder drücken Sie zweimal die Eingabetaste, um sie leer zu lassen. Die private Schlüsseldatei ist die Datei ohne .pub; halten Sie sie geheim und laden Sie sie nicht hoch. Die Datei mit der Endung .pub enthält den öffentlichen Schlüssel. Wenn Sie bereits ein geeignetes Schlüsselpaar haben, können Sie dieses verwenden, statt ein weiteres zu erstellen.
Öffentlichen Schlüssel zu Ihrem Git-Hosting-Konto hinzufügen
Geben Sie die gewählte Datei mit dem öffentlichen Schlüssel aus (zum Beispiel mit cat ~/.ssh/id_ed25519.pub) und kopieren Sie die vollständige Zeile. Öffnen Sie in den Kontoeinstellungen Ihres Git-Hosts den Bereich für SSH-Schlüssel und fügen Sie dort den öffentlichen Schlüssel hinzu. GitHub, GitLab und andere Anbieter verwenden unterschiedliche Bezeichnungen für ihre Seiten und haben unterschiedliche Kontorichtlinien. Folgen Sie daher den Anweisungen Ihres Anbieters. Fügen Sie niemals den privaten Schlüssel ein und laden Sie ihn nicht hoch.
SSH für einen oder mehrere Schlüssel konfigurieren
SSH kann die Standardschlüsselauswahl verwenden. Wenn Sie mehrere Konten oder Schlüssel nutzen, können Sie mit einem Host-Alias eine bestimmte Identität auswählen. Fügen Sie diesen vollständigen Eintrag zu ~/.ssh/config hinzu:
Führen Sie diesen Befehl aus, um einen vollständigen Beispieleintrag auszugeben, und kopieren Sie ihn anschließend nach ~/.ssh/config:
cat <<'SSH_CONFIG'
Host github-work
HostName github.com
User git
IdentityFile ~/.ssh/id_ed25519_work
IdentitiesOnly yes
SSH_CONFIG
Der Pfad ~/.ssh/id_ed25519_work ist ein Platzhalter. Ersetzen Sie ihn durch den Pfad zu Ihrem privaten Schlüssel. Das Git-Remote muss denselben Alias github-work verwenden wie der Host-Eintrag. Geben Sie für IdentityFile den Pfad zu Ihrem privaten Schlüssel an. Mit IdentitiesOnly yes weist SSH den konfigurierten Schlüssel an, statt nacheinander weitere Identitäten aus einem Agenten anzubieten. Verwenden Sie für ein anderes Konto einen eigenen Alias und Schlüsselpfad. Der Alias im Git-Remote muss genau mit dem Wert von Host übereinstimmen. Dateiberechtigungen und der Start des SSH-Agenten hängen vom Betriebssystem und der Shell ab. Wenn Sie einen Agenten verwenden, laden Sie den privaten Schlüssel mit ssh-add, nachdem Sie den Agenten auf die in Ihrer Umgebung unterstützte Weise gestartet haben. Dieser Schritt ist optional, wenn SSH direkt auf den Schlüssel zugreifen kann.
SSH-Remote des Repositorys festlegen
Prüfen Sie im lokalen Repository das konfigurierte Remote mit git remote -v. Eine GitHub-SSH-URL hat die Form git@github.com:OWNER/REPOSITORY.git; ersetzen Sie beide Platzhalter durch das Konto oder die Organisation und den Repository-Namen. Ändern Sie das vorhandene origin mit git remote set-url origin git@github.com:OWNER/REPOSITORY.git und führen Sie danach erneut git remote -v aus, um zu prüfen, ob die SSH-URL angezeigt wird. Falls Ihr Remote nicht origin heißt, behalten Sie den vorhandenen Namen bei.
Wenn Sie einen Alias wie github-work eingerichtet haben, verwenden Sie ihn in der URL, zum Beispiel git@github-work:OWNER/REPOSITORY.git. Für einen anderen Host verwenden Sie die von diesem Anbieter angegebene SSH-URL. Eine URL, die weiterhin mit https:// beginnt, verwendet die HTTPS-Authentifizierung. Änderungen an Ihren Schlüsseln wirken sich daher erst aus, wenn Sie das Remote auf SSH umstellen.
Änderungen committen und pushen
Wählen Sie die Dateien aus, die in den Commit aufgenommen werden sollen, und nehmen Sie sie gezielt in die Staging-Area auf, zum Beispiel mit git add path/to/file. Verwenden Sie git add . nur, wenn alle Änderungen im aktuellen Verzeichnis zu diesem Commit gehören. Erstellen Sie den Commit mit git commit -m "Describe the change". Pushen Sie anschließend den gewünschten Branch mit git push origin BRANCH und ersetzen Sie origin und BRANCH durch die in Ihrem Repository verwendeten Remote- und Branchnamen. Beim ersten Push eines Branches speichert git push -u origin BRANCH zusätzlich dessen Upstream-Remote.
SSH-Authentifizierung überprüfen und häufige Probleme beheben
Testen Sie die Verbindung zum Host mit ssh -T git@github.com oder ersetzen Sie den Host durch Ihren SSH-Alias, zum Beispiel ssh -T git@github-work. Die Antwort hängt vom Anbieter ab; manche Hosts bestätigen Ihr Konto, stellen aber keine interaktive Shell bereit. Eine erfolgreiche Authentifizierung zeigt lediglich, welchem Konto der Schlüssel zugeordnet ist. Sie belegt nicht, dass dieses Konto Push-Rechte für das Repository hat. Außerdem kann ein Anbieter für eine erfolgreiche Authentifizierungsbestätigung einen Exit-Status ungleich null zurückgeben.
Wenn der Test das falsche Konto erkennt oder die Authentifizierung fehlschlägt, prüfen Sie, ob der öffentliche Schlüssel zu diesem Konto hinzugefügt wurde, ob IdentityFile auf den passenden privaten Schlüssel verweist und ob das Remote den zugehörigen Host-Alias verwendet. Mit ssh -vT git@github-work können Sie sehen, welche Identität SSH anbietet. Prüfen Sie die Diagnoseausgabe lokal und geben Sie keine Inhalte privater Schlüssel weiter. Kontrollieren Sie außerdem die Remote-URL mit git remote -v. Wenn die Authentifizierung funktioniert, ein Push aber abgelehnt wird, prüfen Sie den Schreibzugriff auf das Repository, den Branchnamen und mögliche Branch-Regeln des Hosts.
Wenn ein privater Schlüssel verloren geht oder offengelegt wurde, erstellen Sie ein Ersatzschlüsselpaar, fügen Sie dessen öffentlichen Schlüssel beim Host hinzu, aktualisieren Sie bei Bedarf die SSH-Konfiguration oder das Remote und entfernen Sie den alten öffentlichen Schlüssel aus dem Konto. Ein öffentlicher Schlüssel ist dafür vorgesehen, mit dem Git-Host geteilt zu werden; der private Schlüssel muss geheim bleiben.