Rufen Sie eine einzelne Datei aus einem Repository ab

220

Was ist der effizienteste Mechanismus (in Bezug auf übertragene Daten und verwendeten Speicherplatz), um den Inhalt einer einzelnen Datei aus einem Remote-Git-Repository abzurufen?

Bisher habe ich es geschafft:

git clone --no-checkout --depth 1 [email protected]:foo/bar.git && cd bar && git show HEAD:path/to/file.txt

Das scheint immer noch übertrieben.

Was ist mit mehreren Dateien aus dem Repo?

dreftymac
quelle
3
Aaw. Ich würde es lieben, wenn es eine eingebaute Möglichkeit gäbe, das Äquivalent von "cat-remote" und "tag-remote" zu tun.
Conny
3
Ich habe das gleiche Problem Ich möchte die gleiche Lizenzdatei in 2 Repos haben; Bearbeiten Sie die Datei in 1 Repo und lassen Sie die Kopie im anderen Repo automatisch aktualisieren.
GlassGhost
Mögliches Duplikat von Wie kann man nur eine Datei aus dem Git-Repository auschecken?
Ciro Santilli 法轮功 冠状 病 六四 事件 30

Antworten:

143

In Git Version 1.7.9.5 scheint dies zu funktionieren, um eine einzelne Datei von einer Fernbedienung zu exportieren

git archive --remote=ssh://host/pathto/repo.git HEAD README.md

Dadurch wird der Inhalt der Datei erfasst README.md.

Israel Dov
quelle
27
... außer es funktioniert nicht auf GitHub. Dang. :( twitter.com/GitHubHelp/status/322818593748303873
Rob Howard
13
Dies scheint nicht die Rohdatei zu ergeben, sondern eine TAR-Datei mit nur einer einzigen Datei.
Frerich Raabe
20
@FrerichRaabe füge einfach `| hinzu tar -x` zum Befehl. git archive --remote=ssh://host/pathto/repo.git HEAD README.md | tar -x cat README.md
Renier
12
Sie können verwenden, tar -xOum an STDOUT für Rohrleitungen auszugeben, zBFILE=README.md && git archive --remote=ssh://host/pathto/repo.git HEAD "$FILE" | tar -xO "$FILE"
paulcm
2
Genau die Antwort, nach der ich gesucht habe, aber ich bekomme "fatal: Operation wird vom Protokoll nicht unterstützt". als Antwort von Git. Argh.
mhvelplund
68

Im Anschluss an Jakub ‚s Antwort . git archiveErzeugt ein Tar- oder Zip-Archiv. Sie müssen also die Ausgabe durch Tar leiten, um den Dateiinhalt zu erhalten:

git archive --remote=git://git.foo.com/project.git HEAD:path/to/directory filename | tar -x

Speichert eine Kopie von 'Dateiname' aus dem HEAD des Remote-Repositorys im aktuellen Verzeichnis.

Das :path/to/directoryTeil ist optional. Wenn ausgeschlossen, wird die abgerufene Datei in gespeichert<current working dir>/path/to/directory/filename

Wenn Sie die Verwendung von git archive --remoteGit-Repositorys aktivieren möchten, die von git-daemon gehostet werden, müssen Sie außerdem die Konfigurationsoption daemon.uploadarch aktivieren. Siehe https://kernel.org/pub/software/scm/git/docs/git-daemon.html

Robert Knight
quelle
2
Wenn es sich um eine Textdatei handelt und wir sie in einem anderen Teil speichern möchten, sollten Sie Folgendes verwenden: | tar -xO> ~ / destfile.ext
yucer
44

Wenn eine Weboberfläche bereitgestellt wird (wie gitweb, cgit, Gitorious, ginatra), können Sie damit eine einzelne Datei herunterladen ("rohe" oder "einfache" Ansicht).

Wenn die andere Seite es aktiviert hat , können Sie es verwenden--remote=<URL>Option's''des Git-Archivs verwenden (und es möglicherweise auf ein Verzeichnis beschränken, in dem sich die Datei befindet), zum Beispiel:

$ git archive [email protected]:foo/bar.git --prefix=path/to/ HEAD:path/to/ |  tar xvf -
Jakub Narębski
quelle
Hinweis: Das Beispiel wurde nicht getestet!
Jakub Narębski
7
Für Ihre eigenen Repositorys müssen Sie das Upload-Archiv speziell aktivieren, wenn Sie git-daemon (git: // style urls) mit git config daemon.uploadarch trueim Remote-Repository verwenden. Standardmäßig deaktiviert der Git-Daemon das Remote-Archiv mit "fatal: Remote-Fehler: Zugriff verweigert oder Repository nicht exportiert: ..."
patthoyts
+1 Der git archiveAnsatz war mein erster Versuch - aber dann bemerkte ich, dass das Erfordernis tarauf dem Client-Computer für Windows-Benutzer nicht gerade praktisch war. Am Ende haben wir von unserem lokalen cgitServer abgerufen. Es funktioniert, aber es ist nicht so schnell, wie ich es gerne hätte (und es muss immer noch unix2dosauf Windows-Computern ausgeführt oder ähnlich sein , da wir Dateien mit Unix-Zeilenenden im Git-Repository speichern).
Frerich Raabe
1
@FrerichRaabe Verwenden Sie -o fetched.zip. Siehe auch die Option --format = <fmt>.
Akhan
5
Für das, was es wert ist, sieht es nicht so aus, als würde dies auf von GitHub gehosteten Repositories funktionieren. Siehe help.github.com/articles/can-i-archive-a-repository und groups.google.com/forum/#!topic/github/z8vLHcX0HxY
vmrob
30

Nicht allgemein, aber wenn Sie Github verwenden:

Für mich wgetstellte sich heraus, dass die rohe URL der beste und einfachste Weg ist, eine bestimmte Datei herunterzuladen.

Öffnen Sie die Datei im Browser und klicken Sie auf "Raw". Aktualisieren Sie nun Ihren Browser, kopieren Sie die URL und führen Sie ein wgetoder curlauf.

wget Beispiel:

wget 'https://github.abc.abc.com/raw/abc/folder1/master/folder2/myfile.py?token=DDDDnkl92Kw8829jhXXoxBaVJIYW-h7zks5Vy9I-wA%3D%3D' -O myfile.py

Curl Beispiel:

curl 'https://example.com/raw.txt' > savedFile.txt

Ankur Agarwal
quelle
3
Dies ist die einfachste Lösung und funktioniert für jeden rohen Text, den man finden kann. curl https://example.com/raw.txt > savedFile.txt
JacobPariseau
wget Beispiel funktioniert nicht, Curl Beispiel funktioniert jedoch.
Kyle Baker
Funktioniert gut für mich. Haben Sie Ihre URL in Anführungszeichen gesetzt?
Ankur Agarwal
Dies bewahrt nicht die Git-Geschichte
Crypdick
15

So exportieren Sie eine einzelne Datei von einer Fernbedienung:

git archive --remote=ssh://host/pathto/repo.git HEAD README.md | tar -x

Dadurch wird die Datei README.mdin Ihr aktuelles Verzeichnis heruntergeladen .

Wenn Sie möchten, dass der Inhalt der Datei nach STDOUT exportiert wird:

git archive --remote=ssh://host/pathto/repo.git HEAD README.md | tar -xO

Sie können am Ende des Befehls mehrere Pfade angeben.

Kousha
quelle
9

Für mich sieht es nach einer Lösung aus: http://gitready.com/intermediate/2009/02/27/get-a-file-from-a-specific-revision.html

git show HEAD~4:index.html > local_file

wo 4bedeutet vier Revision von jetzt an und ~ist eine Tilde, wie im Kommentar erwähnt.

Mars Robertson
quelle
Stellen Sie sicher, dass es sich NICHT um das 'Minuszeichen' - 'zwischen' HEAD 'und' 4 'handelt, sondern um die' Tilde '' ~ '. Anscheinend habe ich die Git-Dokumente nicht gut genug gelesen oder meine Brille muss aktualisiert werden ;-)
Dennis
18
Dies scheint die Datei jedoch nicht aus einem Remote-Repository zu beziehen, wie es das OP benötigt.
Mike Weller
Oder: git show HEAD:./my_other_file > local_filewenn die Datei nicht in Ihrem Stammverzeichnis ist :)
Kenorb
1
Freundliche Anfrage für alle Downvoter - bitte erklären und klären Sie, was nicht in Ordnung ist - wir sind hier, um zu lernen und zu teilen :)
Mars Robertson
9
@ MichaelStefanow: Mike Weller hat es; Insbesondere funktioniert dies in einem Remote-Repository nicht. Sie benötigen mindestens einen lokalen Klon, auch wenn darauf Fernbedienungen eingerichtet sind.
Rob Howard
6

ich benutze das

$ cat ~/.wgetrc
check_certificate = off

$ wget https://raw.github.com/jquery/jquery/master/grunt.js
HTTP request sent, awaiting response... 200 OK
Length: 11339 (11K) [text/plain]
Saving to: `grunt.js'
Steven Penny
quelle
Funktioniert für mich auch ohne wgetrc Tweaks:wget https://raw.github.com/bk322/bk_automates/master/bkubuntu/bkubuntu.bash
Adobe
1
Meine Nachricht ist hilfreicher:ERROR: Certificate verification error for raw.github.com: unable to get local issuer certificate. To connect to raw.github.com insecurely, use '--no-check-certificate'.
Kos
3
Dies funktioniert nur für öffentliche Repositorys. Für private Repositorys benötigen Sie eine Authentifizierung.
Ricardo Otero
5

Eine nuancierte Variante einiger Antworten hier, die die Frage des OP beantwortet:

git archive [email protected]:foo/bar.git \
  HEAD path/to/file.txt | tar -xO path/to/file.txt > file.txt
Willem van Ketwich
quelle
Dies funktioniert nicht, Github unterstützt kein Git-Archiv.
Philipp Flenker
2
Err .. git wird für mehr als nur GitHub verwendet
Willem van Ketwich
1
Sie haben --remote explizit auf eine Github-URL in Ihrer Antwort gesetzt ;-)
Philipp Flenker
1
Danke für die Rückmeldung. Habe die Antwort entsprechend geändert.
Willem van Ketwich
2

Wenn Ihr Repository Token unterstützt (z. B. GitLab), generieren Sie ein Token für Ihren Benutzer. Navigieren Sie dann zu der Datei, die Sie herunterladen möchten, und klicken Sie auf RAW-Ausgabe, um die URL abzurufen. Um die Datei herunterzuladen, verwenden Sie:

curl --silent --request GET --header 'PRIVATE-TOKEN: replace_with_your_token' \
'http://git.example.com/foo/bar.sql' --output /tmp/bar.sql
panticz
quelle
2

Ich habe auf diese Weise gelöst:

git archive --remote=ssh://[email protected]/user/mi-repo.git BranchName /path-to-file/file_name | tar -xO /path-to-file/file_name > /path-to-save-the-file/file_name

Wenn Sie möchten, können Sie "BranchName" durch "HEAD" ersetzen.

Matiasmasca
quelle
2

Es scheint mir der einfachste Weg zu sein, Folgendes zu verwenden:

wget https://github.com/name/folder/file.zip?raw=true
ihsinme
quelle
1

Die Antwort von Yisrael Dov ist unkompliziert, erlaubt jedoch keine Komprimierung. Sie können dies verwenden --format=zip, aber Sie können es nicht direkt mit einem Pipe-Befehl entpacken, wie Sie es mit tar tun können. Daher müssen Sie es als temporäre Datei speichern. Hier ist ein Skript:

#!/bin/bash

BASENAME=$0

function usage {
    echo "usage: $BASENAME <remote-repo> <file> ..."
    exit 1
}

[ 2 -gt "$#" ] && { usage; }

REPO=$1
shift
FILES=$@

TMPFILE=`mktemp`.zip
git archive -9 --remote=$REPO HEAD $FILES -o $TMPFILE
unzip $TMPFILE
rm $TMPFILE

Dies funktioniert auch mit Verzeichnissen.

naught101
quelle
1

Verwenden Sie für einzelne Dateien einfach den Befehl wget.

Folgen Sie zunächst dem Bild unten, um auf "raw" zu klicken und die URL abzurufen. Andernfalls laden Sie den in HTML eingebetteten Code herunter. Geben Sie hier die Bildbeschreibung ein

Dann öffnet der Browser eine neue Seite mit URL-Start mit https://raw.githubusercontent.com/ ...

Geben Sie einfach den Befehl in das Terminal ein:

#wget https://raw.githubusercontent.com/...

Eine Weile wird die Datei in Ihrem Ordner abgelegt.

Malajisi
quelle
Ja, dies funktioniert auch gut in Python oder anderen Programmiersprachen mit einer REST-Funktion. Zum Beispiel zum Herunterladen von Modulen aus verschiedenen Repositories.
Lars GJ
1

Wenn Ihr Git-Repository auf Azure-DevOps (VSTS) gehostet wird, können Sie eine einzelne Datei mit der Rest-API abrufen .

Das Format dieser API sieht folgendermaßen aus:

 https://dev.azure.com/{organization}/_apis/git/repositories/{repositoryId}/items?path={pathToFile}&api-version=4.1?download=true

Beispielsweise:

 https://dev.azure.com/{organization}/_apis/git/repositories/278d5cd2-584d-4b63-824a-2ba458937249/items?scopePath=/MyWebSite/MyWebSite/Views/Home/_Home.cshtml&download=true&api-version=4.1
Shayki Abramczyk
quelle
Es erfordert API-Token, nicht wahr?
Yuriy Pozniak
Hängt
0

Ich verwende Curl, es funktioniert mit öffentlichen Repos oder solchen, die die https-Basisauthentifizierung über eine Webschnittstelle verwenden.

curl -L --retry 20 --retry-delay 2 -O https://github.com/ACCOUNT/REPO/raw/master/PATH/TO/FILE/FILE.TXT -u USER:PASSWORD

Ich habe es auf Github und Bitbucket getestet, funktioniert auf beiden.

JasonS
quelle
0

Wenn Sie eine Datei von einem bestimmten Hash + einem Remote-Repository erhalten möchten, habe ich git-archive ausprobiert und es hat nicht funktioniert.

Sie müssten den Git-Klon verwenden und sobald das Repository geklont ist, müssten Sie das Git-Archiv verwenden, damit es funktioniert.

Ich poste eine Frage, wie man es im Git-Archiv von einem bestimmten Hash von Remote einfacher macht

Fernanda Martins
quelle
0

Für Bitbucket direkt aus dem Browser (ich habe Safari verwendet ...) klicken Sie mit der rechten Maustaste auf "View Raw" und wählen Sie "Linked File herunterladen":

Geben Sie hier die Bildbeschreibung ein

ingconti
quelle
0

Wenn es Ihnen nichts ausmacht, das gesamte Verzeichnis zu klonen, führt diese kleine bash / zsh-Funktion zum Klonen einer einzelnen Datei in Ihr aktuelles Verzeichnis (indem Sie das Repo in ein temporäres Verzeichnis klonen und anschließend entfernen).

Pro: Sie erhalten nur die gewünschte Datei

Con: Sie müssen immer noch warten, bis das gesamte Repo geklont ist

git-single-file () {
        if [ $# -lt 2 ]
        then
                echo "Usage: $0 <repo url> <file path>"
                return
        fi
        TEMP_DIR=$(mktemp -d)
        git clone $1 $TEMP_DIR
        cp $TEMP_DIR/$2 .
        rm -rf $TEMP_DIR
}
Christopher Shroba
quelle
Diese Antwort kann dazu beitragen, einen spärlichen Klon zu erstellen, dh ohne Overhead.
Yuriy Pozniak
0

Github Enterprise-Lösung

HTTPS_DOMAIN=https://git.your-company.com
ORGANISATION=org
REPO_NAME=my-amazing-library
FILE_PATH=path/to/some/file
BRANCH=develop
GITHUB_PERSONAL_ACCESS_TOKEN=<your-access-token>

URL="${HTTPS_DOMAIN}/raw/${ORGANISATION}/${REPO_NAME}/${BRANCH}/${FILE_PATH}"

curl -H "Authorization: token ${GITHUB_PERSONAL_ACCESS_TOKEN}" ${URL} > "${FILE_PATH}"
Oliver Pearmain
quelle
Wo finden wir das GITHUB_PERSONAL_ACCESS_TOKEN?
ShadSterling
1
Sie können ein persönliches Zugriffstoken erstellen, indem Sie unter https: // <Ihr-Githubserver> / settings / tokens auf die Schaltfläche "Neues Token generieren" klicken.
Oliver Pearmain
Hmm, wir haben Automatisierungen, denen ein Benutzername und ein Kennwort zugewiesen werden, die zur Authentifizierung bei mehreren Systemen verwendet werden, die dasselbe SSO verwenden. Daher hatte ich gehofft, die Generierung eines Tokens mit einem Benutzernamen und einem Kennwort zu automatisieren.
ShadSterling
0

Wenn Sie nur die Datei herunterladen möchten, wird eine problemlose Anwendung namens aufgerufengget :

gget github.com/gohugoio/hugo 'hugo_extended_*_Linux-ARM.deb'

Das obige Beispiel würde eine einzelne Datei aus dem hugoRepository herunterladen .

https://github.com/dpb587/gget

Granitosaurus
quelle
-1

Im Zusammenhang mit der Antwort von @Steven Penny verwende ich auch wget. Um zu entscheiden, an welche Datei die Ausgabe gesendet werden soll, verwende ich -O.

Wenn Sie gitlabs verwenden, ist eine andere Möglichkeit für die URL:

wget "https://git.labs.your-server/your-repo/raw/master/<path-to-file>" -O <output-file>

Sofern Sie nicht über das Zertifikat verfügen oder von einem vertrauenswürdigen Server aus auf die Installation von gitlabs zugreifen, benötigen Sie --no-check-certificate, wie @Kos sagte. Ich bevorzuge das, anstatt .wgetrc zu ändern, aber es hängt von Ihren Bedürfnissen ab.

Wenn es sich um eine große Datei handelt, können Sie die Option -c mit wget verwenden. Um die Datei weiterhin von der Stelle herunterladen zu können, an der Sie sie hinterlassen haben, wenn die vorherige Absicht in der Mitte fehlgeschlagen ist.

Hector Llorens
quelle