GitHub Ordner herunterladen – ohne den ganzen Klon
Öffnen Sie fast ein beliebiges Repository auf GitHub, und Sie finden einen grünen Code-Button, der genau zwei Dinge anbietet: das gesamte Projekt klonen oder ein ZIP des gesamten Projekts herunterladen. Klicken Sie in src/components, docs/examples oder einen templates-Ordner – der Button ist weiterhin da, liefert aber trotzdem alles. GitHubs eigene Dokumentation ist hier unmissverständlich: Sie können einen Schnappschuss der Dateien eines Repositorys herunterladen, es klonen oder forken. Eine vierte Option für einen Ordner gibt es nicht.
Diese Lücke ist der Grund, warum „GitHub Ordner herunterladen“ zu den meistgesuchten GitHub-Fragen gehört und warum die Antworten, die Sie finden, so widersprüchlich sind. Manche empfehlen noch immer einen SVN-Befehl, der im Januar 2024 aufgehört hat zu funktionieren. Andere geben Ihnen ein Git-Rezept mit fünf Befehlen, das heimlich trotzdem das gesamte Repository herunterlädt. Dieser Leitfaden deckt jede Methode ab, die heute tatsächlich funktioniert, was jede von ihnen kostet und die konkreten Fehler – Rate Limits, abgeschnittene Dateilisten, LFS-Zeigerdateien –, die entscheiden, welche für Ihren Fall die richtige ist.
Kurze Antwort: Wählen Sie Ihre Methode
| Methode | Installation nötig | Private Repos | Behält Git-Historie | Am besten für |
|---|---|---|---|---|
| Ordner-Download im Browser | Nein | Ja, mit Token | Nein | Einmalige Downloads, gemischte Ordnergrößen |
| Repository-ZIP (offiziell) | Nein | Ja, mit Token | Nein | Kleine Repos, bei denen Sie die meisten Dateien brauchen |
git sparse-checkout |
Git | Ja, mit Zugangsdaten | Ja | Sie werden weiterhin Updates pullen |
REST API + curl |
curl, jq | Ja, mit Token | Nein | Skripte, CI, wiederholbare Jobs |
| Einzelne Dateien kopieren | Nein | Ja, über die API | Nein | Zwei oder drei Dateien aus einem Ordner |
Wenn Sie nur das ZIP wollen, ist der Weg über den Browser der schnellste – fügen Sie die Ordner-URL in das GitDownloader-Startseite ein, und es packt nur dieses Verzeichnis. Der Rest dieses Artikels erklärt, warum die anderen Optionen existieren und wann sie besser passen.
Warum GitHub keinen Button „Diesen Ordner herunterladen“ hat
Diese Einschränkung ist keine Faulheit; sie ergibt sich aus der Art, wie Git Daten speichert.
Ein Git-Repository ist ein gerichteter Graph aus Objekten. Dateien liegen in Blob-Objekten, und Verzeichnisse sind Tree-Objekte, die Namen, Modi und Hashes auflisten, die auf Blobs oder andere Trees zeigen. Ein Branch ist ein Zeiger auf einen Commit, der auf einen Wurzel-Tree zeigt, der transitiv den gesamten Schnappschuss beschreibt. Nichts in dieser Struktur repräsentiert „den Ordner src/assets als eigenständige, herunterladbare Einheit“ – ein Subtree hat nur innerhalb seines übergeordneten Trees Bedeutung.
Subversion hingegen behandelte Verzeichnisse als erstklassige Check-out-Ziele, weshalb die alte SVN-Brücke der klassische Workaround war. Gits Modell gibt Ihnen Historie, Branching und Integrität; der Preis dafür ist, dass partielles Abrufen ein clientseitiges Problem ist, kein Repository-Konzept.
GitHubs Oberfläche bietet daher an, was günstig und eindeutig auszuliefern ist:
- Ein ZIP eines Refs.
https://github.com/{owner}/{repo}/archive/refs/heads/{branch}.zipstreamt einen Schnappschuss des Wurzel-Trees dieses Branches. Nützlich, aber immer der gesamte Branch. - Die Git Trees API, die einen Subtree in einer einzigen Anfrage auflisten kann. Das ist das Primitiv, auf dem jedes Ordner-Download-Tool tatsächlich aufbaut – auch unseres.
Das Herunterladen eines Ordners ist also nichts, was GitHub für Sie erledigt. Es ist etwas, das ein Tool oder ein Skript mit GitHubs API macht, indem es die Dateien unter einem Pfad auflistet, jede einzelne abruft und das Ergebnis lokal zippt.
Methode 1 – Ordner-Download im Browser (ohne Installation)
Dies ist der kürzeste Weg für die Mehrheit der Nutzer und der einzige, der nichts Installiertes und kein Terminal benötigt.
- Öffnen Sie den Ordner auf GitHub und stellen Sie sicher, dass die Branch-Auswahl den gewünschten Branch anzeigt.
- Kopieren Sie die URL aus der Adressleiste. Sie sollte wie
https://github.com/owner/repo/tree/main/path/to/folderaussehen – die Form/tree/<branch>/<path>ist wichtig. - Fügen Sie sie in das URL-Feld des Startseiten-Tools ein und drücken Sie Download ZIP.
- Die Dateien werden in Ihrem Browser aufgelistet, abgerufen und gezippt und dann in Ihren Downloads-Ordner gespeichert.
Was bei diesem Schritt ein gutes Tool von einem kaputten unterscheidet, ist nicht das Eingabefeld – es ist das, was als Nächstes passiert:
- Branches mit Schrägstrichen.
release/2.1ist ein gültiger Branch-Name, daher muss ein Tool schrittweise längere Präfixe testen, um herauszufinden, wo der Branch endet und der Ordnerpfad beginnt, statt beim ersten/zu raten. - Sehr große Verzeichnisse. Die Trees API gibt
"truncated": truezurück, sobald eine rekursive Auflistung 100.000 Einträge oder 7 MB überschreitet. Ein Tool, das dieses Flag ignoriert, liefert Ihnen stillschweigend ein ZIP mit fehlenden Dateien. Korrektes Verhalten ist ein Rückfall darauf, Sub-Trees Ebene für Ebene aufzulisten. - Rate Limits. Ohne Authentifizierung erhalten Sie 60 API-Anfragen pro Stunde pro IP-Adresse; mit Token 5.000. Tools, die Verzeichnisse einzeln auflisten, verbrauchen das unauthentifizierte Budget bei tiefen Ordnern schnell, weshalb Downloads manchmal auf halbem Weg fehlschlagen und eine Stunde später wieder funktionieren.
- Git LFS. Repositories, die Large File Storage verwenden, speichern eine winzige Zeigerdatei anstelle des echten Assets. Wenn nichts diesen Zeiger erkennt, ist Ihr ZIP technisch korrekt und völlig unbrauchbar.
Für Repositories, die Ihnen gehören oder auf die Sie Zugriff haben, fügen Sie ein feingranulares persönliches Zugriffstoken in das optionale Token-Feld ein: GitHub → Settings → Developer settings → Personal access tokens → Fine-grained tokens → erzeugen Sie eines, das auf die spezifischen Repositories beschränkt ist, mit Contents: Read-only. Das Token wird in Ihrem eigenen Browser gespeichert und nur an api.github.com gesendet; es gibt keinen Server dazwischen, der Ihre Dateien liest. Mehr Details finden Sie in den FAQ.
Methode 2 – Der offizielle Weg: das gesamte Repository herunterladen
Erstaunlich oft immer noch die richtige Antwort, und es lohnt sich, die direkten URLs zu kennen, weil sie die Oberfläche komplett umgehen.
Über die Oberfläche: Repository-Seite → Code → Download ZIP. Die Datei kommt mit dem Namen repo-main.zip an (oder master, oder wie auch immer der Standard-Branch heißt).
Direkte Links, die Sie als Lesezeichen speichern oder skripten können:
# Branch-Archiv (öffentliche Repos, keine Auth)
https://github.com/{owner}/{repo}/archive/refs/heads/{branch}.zip
# Dieselbe Datei, ausgeliefert vom Archiv-Host
https://codeload.github.com/{owner}/{repo}/zip/refs/heads/{branch}
# API-Zipball – funktioniert für private Repos, wenn Sie ein Token senden
https://api.github.com/repos/{owner}/{repo}/zipball/{ref}
Wählen Sie dies, wenn das Repository klein ist, wenn Sie tatsächlich die meisten seiner Dateien wollen, wenn kein Git installiert ist oder wenn Sie den exakten Commit hinter einem Release-Tag möchten. Der Preis ist proportional: Ein Monorepo, das 800 MB zum Klonen groß ist, ist ungefähr 800 MB als ZIP, plus die Zeit zum Entpacken und Löschen der 95 %, die Sie nicht gebraucht haben. Und ein ZIP-Schnappschuss ist genau das – ein Schnappschuss. Keine Historie, kein Remote, kein git pull.
Methode 3 – git sparse-checkout, richtig gemacht
Wenn Sie den Ordner plus einen funktionierenden Git-Checkout wollen – damit Sie später Updates pullen können –, ist Sparse Checkout das richtige Werkzeug. Die meisten Tutorials zeigen ein veraltetes Rezept; hier ist das moderne.
git clone --filter=blob:none --sparse https://github.com/owner/repo.git
cd repo
git sparse-checkout set path/to/folder
Worauf es hier ankommt:
--filter=blob:nonemacht es zu einem Partial Clone: Git holt die Commit- und Tree-Objekte, überspringt aber Dateiinhalte, bis sie ausgecheckt werden. Ohne diese Option laden Sie jeden Blob im Repository herunter und werfen die meisten davon weg.--sparseinitialisiert die Sparse-Checkout-Datei für Sie, sodass Sie.git/info/sparse-checkoutnicht von Hand schreiben müssen.git sparse-checkout setverwendet den Cone-Modus, der ganze Verzeichnisse abgleicht und auf großen Repos dramatisch schneller ist. Fügen Sie später weitere Pfade hinzu, indem Sie den Befehl mit mehreren Pfaden wiederholen, und führen Siegit sparse-checkout reapplyerneut aus, wenn der Arbeitsbaum abdriftet.- Sparse Checkout erfordert Git 2.25 oder neuer; Partial Clone (
--filter) erfordert 2.19+.
Das ältere Muster, das Sie noch in Beiträgen und Stack-Overflow-Antworten sehen werden – git init, dann git config core.sparseCheckout true, dann echo "path/" >> .git/info/sparse-checkout, dann git pull origin main – funktioniert zwar, lädt aber die vollständige Historie und jeden Blob herunter, bevor der Arbeitsbaum gefiltert wird. Am Ende haben Sie den gewünschten Ordner plus ein .git-Verzeichnis, das leicht um ein Vielfaches größer sein kann als die Dateien selbst.
Der eigentliche Kompromiss: Sparse Checkout gibt Ihnen ein Repository, kein Archiv. Wenn Sie ein sauberes ZIP wollten, um es in ein anderes Projekt zu legen, haben Sie jetzt einen Checkout mit angehängtem Remote – genau das, was Sie wollten, wenn Sie beitragen möchten, und reiner Overhead, wenn nicht.
Methode 4 – Skripten mit der GitHub REST API
Für wiederholbare Jobs – einen geteilten Ordner in ein anderes Repo vendorn, Vorlagen in der CI pullen, Doku-Assets nächtlich aktualisieren – wollen Sie etwas, das Sie headless ausführen können. Die API gibt Ihnen zwei Bausteine.
Trees API (eine Anfrage für den gesamten Subtree):
GET https://api.github.com/repos/{owner}/{repo}/git/trees/{ref}?recursive=1
Die Antwort enthält ein flaches tree-Array mit einem path und type für jeden Eintrag. Einträge mit type: "blob" sind Dateien. Der Haken ist die dokumentierte Obergrenze: Mit recursive=1 ist das Array auf 100.000 Einträge und 7 MB begrenzt, und sobald Sie diese überschreiten, setzt die Antwort "truncated": true. Wenn das passiert, besteht die dokumentierte Lösung darin, den Tree nicht-rekursiv abzurufen und Sub-Trees selbst zu durchlaufen.
Contents API (eine Anfrage pro Verzeichnis):
GET https://api.github.com/repos/{owner}/{repo}/contents/{path}?ref={ref}
Diese gibt eine Auflistung mit einer download_url für jede Datei zurück, und sie ist das, was die meisten Browser-Tools historisch verwendet haben. Sie schneidet nie ab, kostet aber eine Anfrage pro Verzeichnis, weshalb tiefe Trees die Rate Limits ausschöpfen.
Ein vollständiges, kleines Skript mit der Trees API plus raw.githubusercontent.com:
OWNER=octocat
REPO=Spoon-Knife
REF=main
PREFIX=src/assets
TOKEN="" # für private Repos setzen: export TOKEN=ghp_xxx
AUTH=()
[ -n "$TOKEN" ] && AUTH=(-H "Authorization: Bearer $TOKEN")
# 1. Prüfen, dass die Auflistung nicht abgeschnitten ist, bevor Sie ihr vertrauen
curl -s "${AUTH[@]}" \
"https://api.github.com/repos/$OWNER/$REPO/git/trees/$REF?recursive=1" \
| jq -r '.truncated'
# 2. Jeden Dateipfad unter dem Präfix in eine Liste schreiben
curl -s "${AUTH[@]}" \
"https://api.github.com/repos/$OWNER/$REPO/git/trees/$REF?recursive=1" \
| jq -r --arg p "$PREFIX" \
'.tree[] | select(.type == "blob") | select(.path | startswith($p + "/")) | .path' \
> files.txt
# 3. Jede Datei abrufen und bei Bedarf Verzeichnisse anlegen
while read -r path; do
mkdir -p "$(dirname "$path")"
curl -sL "${AUTH[@]}" -o "$path" \
"https://raw.githubusercontent.com/$OWNER/$REPO/$REF/$path"
done < files.txt
Zwei operative Hinweise. Erstens: Achten Sie auf die Antwort-Header: X-RateLimit-Remaining sagt Ihnen, wie viel Budget übrig ist, und X-RateLimit-Reset, wann es aufgefüllt wird – unauthentifiziert sind das 60 Anfragen pro Stunde pro IP, sodass ein Ordner mit 200 Dateien ohne Token auf halbem Weg fehlschlägt. Zweitens: raw.githubusercontent.com respektiert einen Authorization-Header für private Repositories, aber Sie müssen ihn tatsächlich senden; ohne ihn erhalten Sie einen 404, der genau wie eine gelöschte Datei aussieht.
Methode 5 – Nur eine einzelne Datei aus einem Ordner holen
Manchmal brauchen Sie den Ordner überhaupt nicht. Jede Datei hat eine Raw-URL, die direkt herunterlädt:
https://raw.githubusercontent.com/{owner}/{repo}/{ref}/{path}
Öffnen Sie in der GitHub-Oberfläche die Datei und klicken Sie auf Raw (oder klicken Sie mit der rechten Maustaste darauf und wählen Sie „Link speichern unter…“). Das Hinzufügen von ?raw=true zu einer normalen /blob/-URL bewirkt dasselbe. Bei drei Dateien schlägt dies jedes Tool auf dieser Seite.
Der SVN-Trick ist tot – und Tutorials empfehlen ihn noch immer
Etwa ein Jahrzehnt lang war der Standardrat, sich auf GitHubs Subversion-Brücke zu verlassen: Ersetzen Sie /tree/main/ in der URL durch /trunk/ und führen Sie svn checkout oder svn export darauf aus, was ein einzelnes Verzeichnis auscheckt, ohne Git zu berühren.
Diese Brücke existiert nicht mehr. GitHub kündigte das Ende der Subversion-Unterstützung an im Januar 2023, führte zwei Brownout-Perioden im November und Dezember 2023 durch, um verbleibende Nutzer herauszufiltern, und entfernte das Subversion-Protokoll am 8. Januar 2024 vollständig. GitHub Enterprise Server folgte in Version 3.13. Ebenfalls weg: git archive --remote, das den serverseitigen upload-archive-Dienst benötigt, den GitHub nie aktiviert hat – der Befehl schlägt mit einem Protokollfehler fehl, egal wie Sie den Pfad formatieren.
Wenn ein Leitfaden svn checkout als erste Methode aufführt, stammt dieser Leitfaden aus der Zeit vor der Entfernung, und seine übrigen Ratschläge verdienen ebenfalls Prüfung. Verwenden Sie stattdessen Sparse Checkout, die Trees API oder ein Browser-Tool.
Welche Methode sollten Sie verwenden?
| Methode | Was Sie am Ende haben | Verarbeitet private Repos | Verarbeitet LFS | Hauptkosten |
|---|---|---|---|---|
| Ordner-Download im Browser | Ein ZIP des Ordners | Ja, mit feingranularem Token | Ja, wenn das Tool LFS-Medien abruft | Braucht eine korrekte URL und ein Tool, das Truncation respektiert |
| Repository-ZIP | Ein ZIP des gesamten Branches | Ja, über den API-Zipball | Nur Zeiger | Bandbreite und Zeit skalieren mit dem Repo, nicht mit dem Ordner |
git sparse-checkout |
Einen echten Git-Checkout des Ordners | Ja, mit Zugangsdaten | Ja, mit installiertem Git LFS | Kein sauberes Archiv; zusätzliche Git-Objekte |
REST API + curl |
Genau die Dateien, die Sie geskriptet haben | Ja, mit Token | Zeiger, sofern nicht behandelt | Sie pflegen das Skript und das Rate-Limit-Budget |
| Raw-Datei-URLs | Einzelne Dateien | Ja, mit Auth-Header | Zeiger, sofern nicht behandelt | Manuell und eine Datei nach der anderen |
Fehlerbehebung: die sieben Fehler, die Ihnen tatsächlich begegnen werden
1. Ein 404 bei einem Repository, das eindeutig existiert. Es ist privat und Ihre Anfrage ist anonym. Senden Sie ein Token. Für alles Automatisierte verwenden Sie ein feingranulares Token, das auf die spezifischen Repos mit Contents auf read-only beschränkt ist, statt eines klassischen Tokens mit breitem repo-Scope.
2. 403 auf halbem Weg durch einen langen Download. Sie haben das API-Rate-Limit erreicht: 60 Anfragen pro Stunde unauthentifiziert, 5.000 mit Token. Die Reset-Zeit steht im Header X-RateLimit-Reset. Authentifizieren Sie sich oder verwenden Sie ein Tool, das einen ganzen Subtree in einer Anfrage auflistet statt einer Anfrage pro Verzeichnis.
3. Der Fortschrittsanzeiger wird nie fertig, oder im ZIP fehlen Dateien. Klassisches Symptom einer abgeschnittenen rekursiven Tree-Auflistung. Bestätigen Sie es mit "truncated": true in der API-Antwort und rufen Sie dann Sub-Trees Ebene für Ebene ab, statt von der Wurzel aus zu rekursieren.
4. Dateien, die etwa 130 Bytes groß sind. Das sind Git-LFS-Zeiger, die mit version https://git-lfs.github.com/spec/v1 beginnen. Der echte Inhalt liegt unter https://media.githubusercontent.com/media/{owner}/{repo}/{ref}/{path}. Klonen Sie entweder mit installiertem Git LFS oder verwenden Sie ein Tool, das den Endpunkt automatisch austauscht.
5. Das ZIP enthält nicht den erwarteten Ordner. Sie sind auf einem anderen Branch als angenommen, oder – beim offiziellen ZIP – Sie schauen auf die Branch-Wurzel und müssen erst in den Ordner navigieren. Prüfen Sie die Branch-Auswahl, bevor Sie die URL kopieren.
6. Leere Ordner, wo ein Submodul sein sollte. Submodule sind separate Repositories, auf die ein spezieller Eintrag verweist, keine Dateien innerhalb des übergeordneten Repos. Klonen Sie die eigene URL des Submoduls, um dessen Inhalte zu erhalten.
7. Download blockiert oder eine Datei stillschweigend übersprungen. Inhaltsfilter markieren manchmal Dateinamen, und aggressives Ad-Blocking oder Datenschutz-Erweiterungen können parallele Downloads stören. Versuchen Sie es erneut mit deaktivierten Erweiterungen für die Seite und prüfen Sie das Statusprotokoll des Tools auf die übersprungenen Namen.
FAQ
Kann ich einen Ordner aus einem privaten Repository herunterladen? Ja. Jede Methode hier unterstützt das, aber alle erfordern Authentifizierung: ein persönliches Zugriffstoken mit Leseberechtigung für Contents für API-basierte Tools oder normale Git-Zugangsdaten für einen Clone. Fügen Sie niemals ein Token mit breitem Scope in eine Drittanbieter-Website ein, die Sie nicht geprüft haben.
Bleibt die Git-Historie beim Herunterladen eines Ordners erhalten? Nein. ZIP-Archive und API-Downloads sind Schnappschüsse des aktuellen Zustands. Nur Methoden, die auf git clone aufbauen – einschließlich Sparse Checkout –, behalten die Historie.
Warum ist mein Download viel größer als der gewünschte Ordner? Weil Sie das Repository-ZIP statt des Ordners heruntergeladen haben oder weil der Ordner große binäre Assets enthält. Vergleichen Sie mit der eigenen Größe des Ordners auf GitHub, bevor Sie das Tool beschuldigen.
Kann ich einen Ordner aus einem bestimmten Branch, Tag oder Commit herunterladen? Ja. Das Pfadsegment nach /tree/ ist der Ref, also funktioniert https://github.com/owner/repo/tree/v2.1.0/path/to/folder, ebenso wie das Übergeben eines Tags oder Commit-SHA an die Trees API.
Ist das Herunterladen von Code von GitHub sicher? Der Transport ist es, aber der Inhalt ist vom Nutzer hochgeladen und ungeprüft. Prüfen Sie die Lizenz des Repositorys, bevor Sie etwas wiederverwenden, lesen Sie den Code, bevor Sie ihn ausführen, und sehen Sie die Datenschutzhinweise in unseren FAQ dazu, wie Tokens behandelt werden.
Die wichtigsten Erkenntnisse
- GitHub kann keinen einzelnen Ordner herunterladen, weil Gits Objektmodell Verzeichnisse nur als Trees innerhalb eines Schnappschusses definiert – der Ordner ist eine clientseitige Montagearbeit, kein Server-Feature.
- Für einen einmaligen Download erledigt ein Browser-Tool, das Branch-Namen, Truncation, LFS und Rate Limits respektiert, die Aufgabe in Sekunden, ohne etwas zu installieren.
- Für Arbeit, bei der Sie weiterhin pullen werden, verwenden Sie
git clone --filter=blob:none --sparseplusgit sparse-checkout set– nicht das ältere.git/info/sparse-checkout-Rezept, das zuerst alles herunterlädt. - Für Automatisierung listet die Trees API einen ganzen Subtree in einer Anfrage auf; denken Sie an die Obergrenze von 100.000 Einträgen und das Limit von 60 gegenüber 5.000 Anfragen pro Stunde.
- Ignorieren Sie jeden Leitfaden, der noch immer mit
svn checkoutbeginnt. Dieser Weg wurde am 8. Januar 2024 aus GitHub entfernt.
Bereit, das Setup zu überspringen? Fügen Sie eine Ordner-URL in das GitDownloader-Tool ein, und es packt nur dieses Verzeichnis – öffentlich oder privat, LFS inklusive, vollständig in Ihrem Browser.