In diesem Teil optimieren wir die Kommunikation mit Codeberg, so dass keine Passwörter mehr eingegeben werden müssen. Git- und Codeberg-Troubleshooting inklusive.
Entgegen der ursprünglichen Planung, hier und heute keine durchgreifenden großen Änderungen am System. Das Multi-User-Setup kommt dann nächste Woche.
Ich habe die Reihenfolge geändert, weil ich mich an meinen eigenen Setup-Prozess erinnerte: Mit NixOS selbst hatte ich selten mal größere Probleme, eigentlich nur hier und da mal eine Klammer zu viel oder ein Semikolon zu wenig. Wenn ich in etwas eine Eleganz in der Logik entdecke, und auf NixOS trifft das für mich zu, dann flutscht es meistens. Aber ich gebe zu, dass mich Git oder Codeberg, oder beides zusammen, manchmal an den Rand des Wahnsinns getrieben haben. Da können die zwei genannten Protagonisten natürlich selbst nichts dafür, ich hatte mich bei der ganzen Lernkurverei wohl öfter mal verfahren.
Zum Glück habe ich mir angewöhnt Problem und Lösungsschritte immer gleich in meinem Second-Brain (Obsidian) zu dokumentieren, daher heute daraus ein ordentlicher Rollout; wie gesagt mit dem Hintergedanken, dass es jetzt nach dem Setup für viele hilfreich sein kann.
Passwortlose Kommunikation mit Codeberg via SSH
Bisher fragt git push und git pull nach Benutzername und Passwort bzw. Access Token.
Mit einem SSH-Schlüssel entfällt das vollständig – für immer. Das ist doch mal echte Entlastung.
Schritt 1: SSH-Schlüssel generieren
ssh-keygen -t ed25519 -C "DEIN-USERNAME@codeberg"
Alle Rückfragen einfach mit Enter bestätigen. Es entstehen zwei Dateien:
~/.ssh/id_ed25519– der private Schlüssel (niemals weitergeben!)~/.ssh/id_ed25519.pub– der öffentliche Schlüssel (wird bei Codeberg hinterlegt)
Schritt 2: Öffentlichen Schlüssel bei Codeberg hinterlegen
cat ~/.ssh/id_ed25519.pub
Die Ausgabe vollständig kopieren, dann bei Codeberg:
Einstellungen → SSH-Schlüssel → Neuen Schlüssel hinzufügen
Titel frei wählen (Tipp Hostname), Schlüssel einfügen, speichern.
Schritt 3: Schlüssel auch für root verfügbar machen
Da update-push und pull-update sudo git verwenden, braucht auch
root Zugriff auf den Schlüssel:
sudo mkdir -p /root/.ssh
sudo cp ~/.ssh/id_ed25519 /root/.ssh/id_ed25519
sudo cp ~/.ssh/id_ed25519.pub /root/.ssh/id_ed25519.pub
sudo chmod 600 /root/.ssh/id_ed25519
Schritt 4: Verbindung testen
# Normaler Benutzer – einmalige Bestätigung mit "yes"
ssh -T git@codeberg.org
# Root – einmalige Bestätigung mit "yes"
sudo ssh -T git@codeberg.org
Beide Male sollte etwas grob in folgender Art erscheinen:
Hi there, DEIN-USERNAME! You've successfully authenticated...
Schritt 5: Remote-URL auf SSH umstellen
cd /etc/nixos
sudo git remote set-url origin git@codeberg.org:DEIN-USERNAME/NixOS.git
Ab jetzt laufen update-push und pull-update komplett ohne Passwortabfrage durch.
Hinweis zur
home.nix: Die Skripteupdate-pushundpull-update
müssen nicht angepasst werden. Sie verwendensudo git pushundsudo git fetchohne explizite SSH-Angabe. Sobald die Remote-URL in
Schritt 5 auf SSH umgestellt ist und root den Schlüssel kennt, nutzen
diese Befehle automatisch SSH – ohne eine einzige Zeile im Skript zu ändern.
Hinweis zu anderen Hosts: Diesen Schritt muss man einmal auf jedem Rechner machen. Tipp: Schlüsseldatei auf Codeberg mit dem Hostnamen versehen, z. B. username@hostname.
Git- und Codeberg-Troubleshooting
Ich habe nachfolgend mal alles gesammelt, was bei mir so schief lief (ganz schön viel) und wie man den Knoten lösen kann.
Grundregel
Codeberg ist immer die Quelle der Wahrheit. Was dort steht, ist das was zählt. Der lokale Stand ist temporär – er kann jederzeit von Codeberg wiederhergestellt werden.
Diagnose-Befehle
Diese Ausgaben können manchmal hilfreich sein um diese in einem Forum oder an eine KI weiterzugeben, wenn unten genannte Fehlerprofile nicht zutreffen.
# Wo bin ich? Nur zur Sicherheit ;)
pwd
# Lokaler Status – was hat sich geändert?
sudo git status
# Commit-Historie anzeigen
sudo git log --oneline -10
# Welche Remote-URL ist eingetragen?
sudo git remote -v
# Unterschied zwischen lokalem Stand und Codeberg
sudo git diff origin/master
Problem 1: "Kein Git-Repository"
Schwerwiegend: Kein Git-Repository (oder irgendeines der Elternverzeichnisse): .git
Ursache: Du bist im falschen Verzeichnis – wahrscheinlich in ~ statt in /etc/nixos.
Lösung:
cd /etc/nixos
Problem 2: Authentifizierung fehlgeschlagen (HTTPS)
remote: Die Zugangsdaten sind inkorrekt oder abgelaufen.
Ursache: HTTPS statt SSH, falsches Passwort oder abgelaufener Token.
Lösung – einmalig auf SSH umstellen:
# SSH-Key generieren (falls noch nicht vorhanden)
ssh-keygen -t ed25519 -C "DEIN-USERNAME@codeberg"
# Öffentlichen Key bei Codeberg hinterlegen
cat ~/.ssh/id_ed25519.pub
# → Codeberg → Einstellungen → SSH-Schlüssel
# Key auch für root verfügbar machen
sudo mkdir -p /root/.ssh
sudo cp ~/.ssh/id_ed25519 /root/.ssh/id_ed25519
sudo cp ~/.ssh/id_ed25519.pub /root/.ssh/id_ed25519.pub
sudo chmod 600 /root/.ssh/id_ed25519
# Verbindung testen (einmalige Bestätigung mit "yes")
ssh -T git@codeberg.org
sudo ssh -T git@codeberg.org
# Remote-URL umstellen
cd /etc/nixos
sudo git remote set-url origin git@codeberg.org:DEIN-USERNAME/NixOS.git
Problem 3: SSH schlägt fehl – "Connection closed"
The authenticity of host 'codeberg.org' can't be established.
Connection closed by ... port 22
Ursache: Root kennt Codeberg noch nicht (known_hosts fehlt) oder Root-SSH-Key fehlt.
Lösung:
# Einmalige Bestätigung für root
sudo ssh -T git@codeberg.org
# → "yes" eingeben
# Falls danach immer noch fehlgeschlagen: Root-Key prüfen
ls /root/.ssh/id_ed25519
# Falls fehlend: siehe Problem 2 ab "Key auch für root verfügbar machen"
Problem 4: Push abgelehnt – "fetch first"
! [rejected] master -> master (fetch first)
Aktualisierungen wurden zurückgewiesen, weil das Remote-Repository
Commits enthält, die lokal nicht vorhanden sind.
Ursache: Auf einem anderen Rechner wurde etwas gepusht das dieser Rechner noch nicht kennt.
Lösung – Codeberg-Stand holen und zusammenführen:
cd /etc/nixos
sudo git fetch origin
sudo git reset --hard origin/master
Danach pull-update ausführen um das System neu zu bauen.
Problem 5: Branches auseinandergelaufen – "Vorspulen nicht möglich"
Hinweis: Abweichende Branches können nicht vorgespult werden.
Schwerwiegend: Vorspulen nicht möglich, breche ab.
Ursache: Lokaler und Codeberg-Branch haben unterschiedliche Commits – keiner ist ein direkter Nachfolger des anderen.
Lösung – Codeberg gewinnt immer:
cd /etc/nixos
sudo git fetch origin
sudo git reset --hard origin/master
Das überschreibt den lokalen Stand vollständig mit Codeberg. Eigene lokale Commits gehen dabei verloren – das ist in diesem Workflow gewollt, weil Codeberg die Quelle der Wahrheit ist.
Problem 6: Zu einem bestimmten alten Stand zurückkehren
Du möchtest einen früheren Zustand wiederherstellen – z. B. vor einer fehlerhaften Änderung.
Schritt 1: Gewünschten Commit finden
sudo git log --oneline -10
Beispielausgabe:
7e1bc10 Revert "System aktualisiert 2026-05-08"
da7898a Revert "System aktualisiert 2026-05-12"
dfba16b System aktualisiert 2026-05-12
aa6e666 System aktualisiert 2026-05-12 ← gewünschter Stand
8750d80 System aktualisiert 2026-05-08
Schritt 2: Auf diesen Stand zurücksetzen
sudo git reset --hard aa6e666
Schritt 3: System neu bauen
sudo nixos-rebuild switch --flake /etc/nixos#(hostname)
Schritt 4: Codeberg ebenfalls zurücksetzen
sudo git push --force-with-lease origin master
--force-with-leaseist sicherer als--force: Es schlägt fehl wenn jemand anderes zwischenzeitlich gepusht hat – und schützt so vor versehentlichem Überschreiben fremder Änderungen.
Problem 7: hardware-configuration.nix fehlt nach git reset
error: path '...hardware-configuration.nix' does not exist
Ursache: Die hardware-configuration.nix war nie in Git getrackt oder wurde beim Reset überschrieben.
Lösung:
# Neu generieren
sudo nixos-generate-config
# In Git aufnehmen
cd /etc/nixos
sudo git add hardware-configuration.nix
sudo git commit -m "hardware-configuration wiederhergestellt"
sudo nixos-rebuild switch --flake /etc/nixos#(hostname)
sudo git push origin master
Kurzreferenz: Die wichtigsten Rettungsbefehle
| Situation | Befehl |
|---|---|
| Aktuellen Codeberg-Stand holen | sudo git fetch origin && sudo git reset --hard origin/master |
| Zu altem Commit zurückkehren | sudo git reset --hard COMMIT-HASH |
| Codeberg auf lokalen Stand zwingen | sudo git push --force-with-lease origin master |
| Commit-Historie anzeigen | sudo git log --oneline -10 |
| Lokale Änderungen verwerfen | sudo git checkout -- . |
| Remote-URL prüfen | sudo git remote -v |
Artikel der NixOS-Reihe
- NixOS - Setup-Guide, Teil 1
- NixOS - Setup-Guide, Teil 2
- NixOS - Setup-Guide, Teil 3
- NixOS - Codeberg-Kommunikation optimieren und Troubleshooting
- NixOS - Multi-User-Setup einrichten
- NixOS - Pakete aus 'unstable' einbinden und "Wegwerf-Pakete"
- NixOS - Das Multi-Host-Setup optimieren und individueller gestalten
GNU/Linux.ch ist ein Community-Projekt. Bei uns kannst du nicht nur mitlesen, sondern auch selbst aktiv werden. Wir freuen uns, wenn du mit uns über die Artikel in unseren Chat-Gruppen oder im Fediverse diskutierst. Auch du selbst kannst Autor werden. Reiche uns deinen Artikelvorschlag über das Formular auf unserer Webseite ein.























