606 Stimmen

Wie kann man nur eine einzelne Datei aus einem Git-Repository sparsam auschecken?

Wie kann ich nur eine Datei aus einem Git-Repository auschecken?

11 Stimmen

Was meinen Sie mit Auschecken? Eine Kopie von nur einer Datei aus einem entfernten Repository beziehen?

2 Stimmen

Wenn das betreffende Projektarchiv gitweb verwendet, können Sie die Datei einfach direkt von dort herunterladen. Wie ich weiter unten zu erklären versuche, ist das, was Sie fragen, nicht wirklich ein Standard-Git-Vorgang.

2 Stimmen

276voto

VonC Punkte 1117238

Ursprünglich erwähnte ich im Jahr 2012 git archive (siehe Jared Forsyth 's responder y Robert Knight 's responder ), da git1.7.9.5 (März 2012) , Paul Brannan 's responder :

git archive --format=tar --remote=origin HEAD:path/to/directory -- filename | tar -O -xf -

Aber: Im Jahr 2013 war das nicht mehr möglich für entfernte https://github.com URLs .
Siehe die alte Seite " Kann ich ein Repository archivieren? "

Die aktuelle (2018) Seite " Über die Archivierung von Inhalten und Daten auf GitHub " empfiehlt die Nutzung von Diensten Dritter wie GHTorrent o GH-Archiv .


Sie können also auch mit lokalen Kopien/Klonen arbeiten:

Sie könnten alternativ wie folgt vorgehen, wenn Sie eine lokale Kopie des Bare Repositorys haben, wie in diese Antwort ,

git --no-pager --git-dir /path/to/bar/repo.git show branch:path/to/file >file

Oder Sie müssen zuerst das Projektarchiv klonen, was bedeutet, dass Sie den gesamten Verlauf erhalten: - im .git Repo - im Arbeitsbaum.

  • Aber dann können Sie eine spärliche Kasse (wenn Sie Git1.7+ verwenden),:
    • die Option "Spar-Checkout" aktivieren ( git config core.sparsecheckout true )
    • Hinzufügen, was Sie in der .git/info/sparse-checkout Datei
    • erneutes Einlesen des Arbeitsbaums, um nur das anzuzeigen, was Sie brauchen

Um den Arbeitsbaum neu zu lesen:

$ git read-tree -m -u HEAD

Auf diese Weise erhalten Sie einen Arbeitsbaum, der genau das enthält, was Sie wollen (auch wenn es nur eine Datei ist)


Richard Gomes Punkte ( in den Kommentaren ) zu " Wie kann ich ein einzelnes Verzeichnis oder eine Liste von Verzeichnissen aus dem Git-Repository klonen, holen oder sparse checkouten? "

Eine Bash-Funktion, die das Herunterladen der Historie vermeidet, die einen einzelnen Zweig abruft und die eine Liste von Dateien oder Verzeichnissen abruft, die Sie benötigen.

0 Stimmen

Können Sie die Änderungen im Spar-Checkout übertragen?

2 Stimmen

@Tilo: Ich bin mir nicht sicher, aber es sollte möglich sein, wenn man bedenkt, dass der Klon ein vollständiger Klon war.

3 Stimmen

Inwiefern ist das besser als "git checkout HASH path-to-file", wie in anderen Antworten erwähnt?

263voto

Nick Moore Punkte 14978

Klonen Sie zunächst das Projektarchiv mit der Option -n, die das standardmäßige Auschecken aller Dateien unterdrückt, und der Option --depth 1, was bedeutet, dass nur die neueste Revision jeder Datei abgerufen wird

git clone -n git://path/to/the_repo.git --depth 1

Dann checken Sie nur die gewünschte Datei aus, etwa so:

cd the_repo
git checkout HEAD name_of_file

12 Stimmen

Damit wird zwar buchstäblich eine einzige Datei ausgecheckt, aber das ist mit Sicherheit nicht das, was der Betreiber tun will, da er alle Dateien hat (und das Auschecken sowieso nicht funktioniert).

5 Stimmen

Ich glaube nicht, dass das überhaupt funktioniert - mit -n der Arbeitsbaum und der Index synchronisiert werden. Das heißt, alle Inhalte werden als gelöscht angezeigt. Sie müssen entweder git reset HEAD ou git checkout HEAD file . Es ist auch wirklich schwierig, mit dem Repository an diesem Punkt zu arbeiten, wenn Sie nicht wirklich verstehen, wie Git funktioniert.

0 Stimmen

Ja, Sie haben völlig Recht. Ich habe die Antwort gegeben, bevor ich es selbst ausprobiert habe. Ich wollte sie eigentlich löschen, aber mit Ihren nützlichen Ergänzungen werde ich sie jetzt lassen.

120voto

techexpert Punkte 2424

Wenn Sie bereits eine Kopie des Git-Repos besitzen, können Sie jederzeit eine Version einer Datei auschecken, indem Sie eine git log um die Hash-ID herauszufinden (z. B. 3cdc61015724f9965575ba954c8cd4232c8b42e4) und geben Sie dann einfach ein:

git checkout hash-id path-to-file

Hier ist ein aktuelles Beispiel:

git checkout 3cdc61015724f9965575ba954c8cd4232c8b42e4 /var/www/css/page.css

14 Stimmen

Sie können auch einen Tag oder einen Zweignamen verwenden, nicht nur die Raute. Diese sind oft einfacher.

4 Stimmen

Eine gute Lösung. Aber wenn path-to-file ist ein Verzeichnis, und die aktuelle HEAD enthält bestimmte Dateien, während target dies nicht tut (oder umgekehrt), wird die Datei nicht korrekt aktualisiert. Gibt es eine Möglichkeit, damit umzugehen?

2 Stimmen

Einfacher und besser. Danke!

99voto

kenorb Punkte 134883

Normalerweise ist es nicht möglich, nur eine Datei von git ohne das gesamte Repository herunterzuladen, wie in der ersten Antwort vorgeschlagen. Das liegt daran, dass Git die Dateien nicht speichert, wie Sie denken (wie CVS/SVN es tun), sondern sie auf der Grundlage der gesamten Projekthistorie generiert.

Es gibt jedoch einige Umgehungsmöglichkeiten für bestimmte Fälle. Beispiele unten mit Platzhaltern für user , project , branch , filename .

GitHub

wget https://raw.githubusercontent.com/user/project/branch/filename

GitLab

wget https://gitlab.com/user/project/raw/branch/filename

GitWeb

Wenn Sie Folgendes verwenden Git auf dem Server - GitWeb , dann können Sie es im Beispiel versuchen (ändern Sie es in den richtigen Pfad):

wget "http://example.com/gitweb/?p=example;a=blob_plain;f=README.txt;hb=HEAD"

GitWeb auf drupalcode.org

Exemple :

wget "http://drupalcode.org/project/ads.git/blob_plain/refs/heads/master:/README.md"

googlesource.com

Es gibt eine undokumentierte Funktion, mit der Sie base64-kodierte Versionen von Rohdateien herunterladen können:

curl "https://chromium.googlesource.com/chromium/src/net/+/master/http/transport_security_state_static.json?format=TEXT" | base64 --decode

In anderen Fällen überprüfen Sie, ob Ihr Git-Repository eine Webschnittstelle verwendet.

Wenn keine Webschnittstelle verwendet wird, können Sie Ihren Code an externe Dienste wie GitHub , Bitbucket , usw. . und sie als Spiegel benutzen.

Wenn Sie nicht über wget installiert, versuchen Sie curl -O (url) alternativ.

6 Stimmen

Und wenn ich github nicht benutze?

87 Stimmen

Dann sollten Sie diese Methode nicht anwenden.

8 Stimmen

Ich würde der Aussage widersprechen, dass Git "Dateien auf der Grundlage des gesamten Projektverlaufs erzeugt". Richtiger ist es zu sagen, dass Git Momentaufnahmen des Zustands von Dateien in Form von Hash-Bäumen speichert. Sicherlich findet keine Generierung statt.

53voto

Geoffrey Hale Punkte 9139

0 Stimmen

Für weitere Erklärungen. broc.seib In der Antwort wurde erklärt, was der relevante Teil der Manpage für git-checkout .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X