Einleitung: Wenn ein einfaches go get zum Geduldsspiel wird
\n\nHaben Sie jemals versucht, go get github.com/ihr-account/privates-repository auszuführen und als Antwort eine kalte, unfreundliche Nachricht erhalten?
go get github.com/ihr-account/privates-repository: \n module github.com/ihr-account/privates-repository: \n git ls-remote -q origin in /tmp/...: exit status 128:\n remote: Invalid username or password.\n fatal: Authentication failed for 'https://github.com/ihr-account/privates-repository.git'\n\nOder, noch rätselhafter:
\ngo get github.com/ihr-account/privates-repository: \n terminal prompts disabled\n Confirm the import path was entered correctly.\n If this is a private repo, see https://golang.org/doc/faq#git_https\n\nKommt Ihnen das bekannt vor? Wenn ja, sind Sie hier genau richtig. Dieser Fehler ist ein klassischer «Stolperstein» für Go-Entwickler, die mit privaten Repositorys auf GitHub arbeiten. Auf Stack Overflow wurde diese Frage tausende Male aufgerufen, und heute werden wir sie ein für alle Mal klären.
\n\nIn diesem Artikel werden wir das Problem nicht nur lösen – wir werden verstehen, warum es auftritt, und lernen, die Umgebung so einzurichten, dass go get mit privaten Repositorys wie geschmiert funktioniert. Los geht's!
Warum verweigert Go die Arbeit mit privaten Repositorys?
\n\nUm den Grund zu verstehen, müssen wir unter die «Motorhaube» von Go schauen. Wenn Sie go get ausführen, macht das Go-Tool mehrere Dinge:
- \n
- Es versucht, das Repository über HTTPS zu klonen (das ist das Standardprotokoll). \n
- Wenn das Repository privat ist, fordert Git eine Authentifizierung an (Benutzername/Passwort). \n
- Go deaktiviert standardmäßig interaktive Terminalabfragen – das ist das besagte «terminal prompts disabled». \n
Warum macht Go das? Ganz einfach: Bei automatischen Builds oder in CI/CD-Pipelines ist eine interaktive Passworteingabe nicht möglich. Daher stürzt Go lieber mit einem Fehler ab, als auf eine Eingabe zu warten.
\n\nKernidee: Der Fehler «terminal prompts disabled» ist kein Bug, sondern ein Feature. Go sagt Ihnen: «Ich kann dich nicht nach deinem Passwort fragen, gib mir fertige Anmeldedaten». Und unsere Aufgabe ist es, diese bereitzustellen.
\n\nMethode 1: Verwendung von SSH (die zuverlässigste und korrekteste)
\n\nDies ist die empfohlene Methode. SSH-Schlüssel sind sicher, bequem und erfordern keine erneute Passworteingabe.
\n\nSchritt 1. SSH-Schlüssel generieren (falls nicht vorhanden)
\nÖffnen Sie ein Terminal und führen Sie Folgendes aus:
\nssh-keygen -t ed25519 -C "ihre_email@example.com"\nDrücken Sie die Eingabetaste, um den Schlüssel im Standardordner zu speichern (~/.ssh/id_ed25519). Sie können eine Passphrase hinzufügen – das erhöht die Sicherheit.
Schritt 2. Schlüssel zum SSH-Agenten hinzufügen
\neval "$(ssh-agent -s)"\nssh-add ~/.ssh/id_ed25519\n\nSchritt 3. Öffentlichen Schlüssel zu GitHub hinzufügen
\nKopieren Sie den Inhalt von ~/.ssh/id_ed25519.pub:
cat ~/.ssh/id_ed25519.pub\nGehen Sie zu GitHub → Einstellungen → SSH- und GPG-Schlüssel → Neuer SSH-Schlüssel. Fügen Sie den Schlüssel ein und speichern Sie ihn.
\n\nSchritt 4. Git für die Verwendung von SSH konfigurieren
\nJetzt kommt der wichtigste Teil: Sie müssen Go dazu bringen, SSH anstelle von HTTPS zu verwenden. Bearbeiten Sie dazu die Datei ~/.gitconfig:
[url "git@github.com:"]\n insteadOf = https://github.com/\nDiese Direktive sagt Git: «Wenn du https://github.com/ siehst, verwende git@github.com: (SSH)».
Schritt 5. Erneuter Versuch
\ngo get github.com/ihr-account/privates-repository@latest\nWenn alles richtig konfiguriert ist, verschwindet der Fehler. Go verwendet SSH zur Authentifizierung und der SSH-Agent stellt den Schlüssel bereit.
\n\nMethode 2: Verwendung eines Personal Access Token (PAT) – für CI/CD und Skripte
\n\nSSH eignet sich hervorragend für die lokale Entwicklung