Wie kann ich eine einzelne Rohdatei über die Befehlszeile von einem privaten Github-Repo herunterladen?

73

Auf dem CI-Server möchte ich eine Konfigurationsdatei abrufen, die wir auf Github verwalten, damit sie von vielen Jobs gemeinsam genutzt werden kann. Ich versuche, diese Datei über Curl abzurufen, aber beide Ansätze schlagen fehl (ich erhalte eine 404):

# As advised by the oAuth docs
curl -H 'Authorization: token the_token' -L -o setup.sh https://raw.github.com/org/repo/file

# The url of the raw file after clicking to view it
curl -L https://raw.github.com/org/repo/file?login=username&token=the_token 
Matt Gibson
quelle

Antworten:

103

Die vorherigen Antworten funktionieren nicht (oder nicht mehr).

Sie können die V3-API verwenden, um eine Rohdatei wie diese abzurufen (Sie benötigen ein OAuth-Token):

curl -H 'Authorization: token INSERTACCESSTOKENHERE' \
  -H 'Accept: application/vnd.github.v3.raw' \
  -O \
  -L https://api.github.com/repos/owner/repo/contents/path

All dies muss in einer Zeile erfolgen. Die -OOption speichert die Datei im aktuellen Verzeichnis. Sie können -o filenameeinen anderen Dateinamen angeben.

Befolgen Sie die Anweisungen hier, um das OAuth-Token zu erhalten:

Ich habe das auch als Kernstück geschrieben:

BEARBEITEN: API-Referenzen für die Lösung lauten wie folgt:

thomasfuchs
quelle
3
Beachten Sie, dass bei einer öffentlichen Datei das Autorisierungstoken nicht erforderlich ist: curl -H 'Accept: application/vnd.github.v3.raw' https://api.github.com/repos/owner/repo/contents/pathGibt die Rohdatei zurück.
Alf Eaton
Ist das -H 'Accept: application/vnd.github.v3.raw'notwendig? Ohne diesen Teil konnte ich auf eine private Datei zugreifen.
Nick Chammas
2
@NickChammas: Ohne diesen Header erhalte ich eine JSON-Antwort mit Metadaten und dem eigentlichen Dateiinhalt base64-codiert, anstatt der Datei als Klartext.
c24w
Was ist, wenn der obige Befehl einen Fehler als Curl ausgibt: (56) Proxy CONNECT hat abgebrochen, was bedeutet das?
Max
@thomasfuchs Ich habe etwas Offensichtliches mit dem Dateipfad verpasst. Können Sie in Ihrem Befehl explizit eine harmlose README.md-Datei definieren, um dies zu demonstrieren?
anon58192932
26

Alternativ können Sie ein Github-Token für den persönlichen Zugriff verwenden ( https://github.com/settings/tokens ):

TOKEN=...
curl -s https://[email protected]/<user or organization>/<repo name>/<branch>/<path to file>/<file_name>

Beispiel:

$ curl -s https://[email protected]/concourse/concourse/master/README.md
....
das Herz des Zorns
quelle
1
@ EM0 - Ich habe es gerade versucht, es hat funktioniert. Einige Dinge, die es wert sind, überprüft zu werden: 1. Der Host-Teil ist raw.githubusercontent.com, 2. Der Pfad ist <username>/<repo name>/<branch>/<file name>3. Das Token muss über einen repoZugriffsbereich verfügen .
Theartofrain
Ja, das ist der Weg. Ich habe den Pfad vom "Download" -Link für die Datei genommen, aber das "? Token = ..." vom Ende entfernt und das Token hinzugefügt. Es verfügt zwar über einen Repo-Zugriffsbereich, es handelt sich jedoch nur um öffentliche Repositorys. Dies ist ein privates Repository der Organisation. Wir haben auch die 2-Faktor-Authentifizierung aktiviert, aber ich denke, wenn dies das Problem ist, soll es Fehler 401 geben, nicht 404.
EM0
Ja, das klingt alles richtig. Der Pfad klingt gut (dies ist der Pfad, den ich erhalte, wenn ich auf "Raw" ?token=...klicke, ohne den Parameter, wie Sie sagten). Mein Benutzer hat auch eine 2-Faktor-Authentifizierung, und ich gehe davon aus, dass es sich um denselben Token-Bereich handelt (das repoKontrollkästchen unter github.com/settings/tokens/new ). Wenn das Token ungültig ist oder nicht über den repoGültigkeitsbereich verfügt, erhalten Sie 404 (nicht 401). Ich
bin
2
Seltsame Sache: Für mich curlfunktioniert die Verwendung des Befehls wie oben, aber wenn ich den gleichen Link im Browser öffne oder versuche, ihn über anzufordern java.net.URL.openStream, erhalte ich eine 404 ...
Nightscape
1
Nur so konnte ich es für eine interne GitHub-Instanz in CMD zum Laufen bringen. Mit curl -H 'Authorization: token $TOKEN' $file_urlimmer 404'd auf mich. Ich bin mir nicht sicher, warum das eine funktioniert und nicht das andere, aber ich habe die Dokumentation von CURL noch nie vertieft.
KayleeFrye_onDeck
11

Ich weiß, dass dies eine alte Frage ist, aber keine der oben vorgeschlagenen Lösungen hat für mich funktioniert. Vielleicht hat sich die API seitdem geändert.

Das hat funktioniert:

curl -H 'Authorization: token [insert your token here]' -o output.txt https://raw.githubusercontent.com/[organization]/[repo]/[branch]/[path to file]

markiere amos
quelle
Dies ist die einzige, die auch für mich funktioniert hat, aber Ihr Antwortzeichen enthält einen kleinen Tippfehler. es sollte sein[organization]/[repo]/[branch]...
anon58192932
Danke, das einzige, was bei Github Enterprise für mich funktioniert hat. Beachten Sie, dass das erforderliche Token ein persönliches Zugriffstoken ist.
Oliver Pearmain
@OliverPearmain hast du jemals versucht curl -s https://[email protected]/OrgOrUser/RepoName/BranchOrCommitID/file_name.file_extension? Das ist das einzige, was ich jemals zum Laufen bringen könnte, aber andere Mitarbeiter des Unternehmens haben stattdessen diese Lösung verwendet. Daher denke ich, dass es möglicherweise eine Konfiguration für CURL gibt, die die Verwendung curl -s...anstelle dieses CLI-Parametersatzes weniger einschränkend macht .
KayleeFrye_onDeck
6

Oder wenn Sie keinen Token haben:

curl --user [your_user] 'https://raw.github.com/path/to/file.config' > file.config
PeqNP
quelle
1
Ich werde nach einem Passwort gefragt, aber die Antwort ist immer eine 404.
Jean Jordaan
Gleich hier: immer 404
André Luís
5

Ich hatte ein paar Minuten damit zu kämpfen, bis mir klar wurde, dass ich die URL nur in Anführungszeichen setzen muss, um dem kaufmännischen Und zu entkommen.

curl "https://raw.github.com/org/repo/file?login=username&token=the_token"

Das hat bei mir in meinem privaten Repo funktioniert.

Philip Vergiss
quelle
2

Beim Umleiten der URL zu Amazon S3 ist ein Authentifizierungsfehler aufgetreten:

Es ist nur ein Authentifizierungsmechanismus zulässig. nur der X-Amz-AlgorithmAbfrageparameter ...

Der Wechsel vom Authorization: token XHeader zum ?access_token=<token>Abfrageparameter hat bei mir funktioniert.

chrismo
quelle
2

Nur eine Ergänzung zu der akzeptierten Antwort: Wenn Sie die Github Enterprise-URL verwenden, ist die URL etwas anders:

curl -H 'Authorization: token [your token]' \
-H 'Accept: application/vnd.github.v3.raw' \
-L https://[your domain]/api/v3/repos/[owner]/[repo-name]/contents/[path of file]
lonewarrior556
quelle
2
  1. Öffnen Sie im Browser Ihr Github-Repo: Klicken Sie auf Datei
  2. Öffnen Sie die Entwicklertools im Browser: Wählen Sie die Registerkarte Netzwerk
  3. Im Browser Github: Klicken Sie auf die Schaltfläche Herunterladen
  4. Popup schließen
  5. in Browser-Entwicklungstools: Klicken Sie mit der rechten Maustaste auf die Liste, die hat file_name?token=ABAHQCAT6KG...
  6. Wählen Sie Kopieren -> Linkadresse kopieren

    URL ist im Format:

    https://raw.githubusercontent.com/<USERNAME>/<PATH>/<FILENAME>?token=ABAHQCAT6KGHYHMG2SLCDT243PH4I

  7. im Terminal:

    wget -O myFilename https://raw.githubusercontent.com/<USERNAME>/<PATH>/<FILENAME>?token=ABAHQCAT6KGHYHMG2SLCDT243PH4I

Der Link ist nur für eine begrenzte Zeit gültig oder Sie können Ihren Token: GitHub-Artikel erstellen

Milan Rakos
quelle
1

Wir mussten ziemlich oft Dateien von privaten GitHub-Repos herunterladen, und Hacky-Shell-Skripte haben es nicht ganz gekürzt. Deshalb haben wir Fetch erstellt , ein plattformübergreifendes Open-Source-Tool, mit dem Quelldateien einfach heruntergeladen und Assets von einem freigegeben werden können Git-Tag, Commit oder Zweig von öffentlichen und privaten GitHub-Repos.

Um beispielsweise die Datei bazvon der Version 0.1.3eines privaten GitHub-Repos auf herunterzuladen /tmp, gehen Sie wie folgt vor:

GITHUB_OAUTH_TOKEN="your token"
fetch --repo="https://github.com/foo/bar" --tag="0.1.3" --source-path="/baz" /tmp
Jewgenij Brikman
quelle
1

Überraschenderweise hat keine der Antworten für mich funktioniert, bis ich eine Problemumgehung gefunden habe.

Sie können das persönliche Zugriffstoken https://github.com/settings/tokens verwenden , das von @thomasfuchs beantwortet wird

Hinweis: Beim Erstellen eines Tokens müssen Sie die Administratorrechte überprüfen. Siehe das zugehörige Problem

https://github.com/octokit/octokit.net/issues/1812

atul
quelle
1
Der Admin-Hinweis hat es für mich zum Laufen gebracht. Sonst habe ich gerade eine 404 erhalten.
Davie Dave
Die minimale Berechtigung, mit der es für mich auf einem privaten Repo funktioniert hat, war repound admin:org/read:org.
10.
0
curl -H 'Authorization: token YOUR_TOKEN' \
  -H 'Accept: application/vnd.github.v4.raw' \
  -O \
  -L https://api.github.com/repos/INSERT_OWNER_HERE/INSERT_REPO_HERE/contents/PATH/TO/FILE

Also, wenn die URL der Rohdatei (wenn angemeldet) ist

https://raw.githubusercontent.com/mr_coder/my_repo_name/master/my_script


Then 
  -L https://api.github.com/repos/INSERT_OWNER_HERE/INSERT_REPO_HERE/contents/PATH/TO/FILE
becomes
  -L https://api.github.com/repos/mr_coder/my_repo_name/contents/my_script

Hinweis: Wir haben API v4

Reiben
quelle
0

Für GitHub Enterprise und API v3 sah meine Bash-Lösung folgendermaßen aus (einschließlich TOKEN-Bereinigung / Datenschutz):

TOKEN=yourTokenHere; history -d $((HISTCMD-1)) > /dev/null

curl -H "Authorization: token $TOKEN" \
  -H 'Accept: application/vnd.github.v3.raw' \
  -o file.ext \
  -L http://github.company.com/api/v3/repos/[org]/[repo]/contents/path/file.ext?ref=[branch]

unset TOKEN
Geoffrey Hudik
quelle
-3

Unten sollte gut funktionieren. Ein "raw" vor Ihrem Filialnamen (in diesem Fall Master).

curl -L -O https://github.com/your/repo/raw/master/fetch_file.sh

Subhakar KS
quelle
5
Diese Frage ist über private Repos
Benutzer2561747
-5

Sie können dies mit einem unformatierten Link tun.

curl -O https://raw.githubusercontent.com/owner/repo/branchname/path/to/file
Sahak Khots
quelle
6
Die Frage war über private Repos
Adam B