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 git@github.com: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?


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

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.


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


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 --remote=git@github.com:foo/bar.git --prefix=path/to/ HEAD:path/to/ |  tar xvf -

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


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.


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.


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'

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 --remote=git@archive-accepting-git-server.com:foo/bar.git \
  HEAD path/to/file.txt | tar -xO path/to/file.txt > file.txt

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

2

Ich habe auf diese Weise gelöst:

git archive --remote=ssh://git@gitlab.com/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.


2

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

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

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.


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.


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

Es erfordert API-Token, nicht wahr?
Yuriy Pozniak


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.


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


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


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
}

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}"

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


-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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.