Wie checke ich nur eine Datei aus einem Git-Repo aus?
git
file
git-checkout
sparse-checkout
Arthur Ulfeldt
quelle
quelle
Antworten:
Ursprünglich habe ich erwähnt , im Jahr 2012
git archive
(siehe Jared Forsyth 's Antwort und Robert Knight ' s Antwort ), da git1.7.9.5 (März 2012) , Paul Brannan ‚s Antwort :Aber: 2013 war dies für Remote-URLs von https://github.com nicht mehr möglich .
Siehe die alte Seite " Kann ich ein Repository archivieren? "
Auf der aktuellen Seite (2018) " Informationen zum Archivieren von Inhalten und Daten auf GitHub " wird die Verwendung von Diensten von Drittanbietern wie GHTorrent oder GH Archive empfohlen .
Sie können also auch mit lokalen Kopien / Klonen umgehen:
Sie können alternativ Folgendes tun, wenn Sie eine lokale Kopie des nackten Repositorys haben, wie in dieser Antwort erwähnt :
Oder Sie müssen zuerst das Repo klonen, was bedeutet, dass Sie den vollständigen Verlauf erhalten: - im .git-Repo - im Arbeitsbaum.
git config core.sparsecheckout true
).git/info/sparse-checkout
Datei sehen möchtenSo lesen Sie den Arbeitsbaum erneut:
Auf diese Weise erhalten Sie einen Arbeitsbaum, der genau das enthält, was Sie möchten (auch wenn es sich nur um eine Datei handelt).
Richard Gomes verweist ( in den Kommentaren ) auf " Wie kann ich ein einzelnes Verzeichnis oder eine Liste von Verzeichnissen aus dem Git-Repository klonen, abrufen oder spärlich auschecken? "
quelle
git archive
jetzt verwenden.Klonen Sie zuerst das Repo mit der Option -n, die das standardmäßige Auschecken aller Dateien unterdrückt, und der Option --depth 1, dh, es wird nur die neueste Version jeder Datei abgerufen
Dann schauen Sie sich einfach die gewünschte Datei an:
quelle
-n
der Arbeitsbaum und der Index synchron sind. Das heißt, alle Inhalte werden als gelöscht angezeigt. Du musst entwedergit reset HEAD
odergit checkout HEAD file
. Es ist zu diesem Zeitpunkt auch sehr schwierig, mit dem Repository zu arbeiten, es sei denn, Sie verstehen wirklich, wie Git funktioniert.rm -rf .git
zu NickMoores Skript hinzufügt , würde dies alle Spuren des geklonten Repos bereinigen und vielleicht Jefromis Besorgnis über ein schwer zu verwendendes Repo zerstreuen. Das macht es für mich für verschiedene Anwendungen sehr nützlich, wie meine heutige Herausforderung, einen Post-Receive-Hook zu erstellen, um die Version eines anderen Post-Receive-Hooks automatisch zu aktualisieren.git
nicht die beste für diese Art von Arbeit). Diese Antwort gilt auch für diese oder diese andere beliebte Frage und viele andere: Ändern Siename_of_file
zuname_of_folder
. Git bietet heutzutage (2014er Jahre) Submodule für Repo-Besitzer an, die für Repo-Benutzer einige por-freundliche bieten.Wenn Sie bereits eine Kopie des Git-Repos haben, können Sie jederzeit eine Version einer Datei mit a
git log
auschecken, um die Hash-ID herauszufinden (z. B. 3cdc61015724f9965575ba954c8cd4232c8b42e4), und dann einfach Folgendes eingeben:Hier ist ein aktuelles Beispiel:
quelle
path-to-file
es sich jedoch um ein Verzeichnis handelt und currentHEAD
eine bestimmte Datei enthält, währendtarget
dies nicht der Fall ist (oder umgekehrt), wird die Datei dadurch nicht korrekt aktualisiert. Gibt es eine Möglichkeit, damit umzugehen?Normalerweise ist es nicht möglich, nur eine Datei
git
herunterzuladen, ohne das gesamte Repository herunterzuladen, wie in der ersten Antwort vorgeschlagen. Dies liegt daran, dass Git Dateien nicht so speichert, wie Sie denken (wie CVS / SVN), sondern sie basierend auf dem gesamten Verlauf des Projekts generiert.Es gibt jedoch einige Problemumgehungen für bestimmte Fälle. Beispiele unten mit Platzhalter für
user
,project
,branch
,filename
.GitHub
GitLab
GitWeb
Wenn Sie Git auf dem Server - GitWeb verwenden , können Sie es in einem Beispiel versuchen (ändern Sie es in den richtigen Pfad):
GitWeb bei drupalcode.org
Beispiel:
googlesource.com
Es gibt eine undokumentierte Funktion, mit der Sie base64-codierte Versionen von Rohdateien herunterladen können:
In anderen Fällen überprüfen Sie, ob Ihr Git-Repository Webschnittstellen verwendet.
Wenn es keine Web - Oberfläche verwenden, können Sie prüfen , um Ihren Code zu externen Diensten schieben wie GitHub , Bitbucket , etc . und benutze es als Spiegel.
Wenn Sie nicht
wget
installiert haben, versuchen Sie escurl -O (url)
alternativ.quelle
wget
Antwort. Die Einfachheit kehrt zusammen mit dem Glück zurück. Danke, Mann.git checkout branch_or_version - Pfad / Datei
Beispiel:
git checkout HEAD -- main.c
quelle
Minimale Anleitung
git checkout -- <filename>
Ref: https://git-scm.com/docs/git-checkout
Dup: Arbeitskopienänderungen einer Datei in Git rückgängig machen?
quelle
git-checkout
.Jetzt können wir! Da dies das erste Ergebnis bei Google ist, dachte ich, ich würde es auf den neuesten Stand bringen. Mit dem Aufkommen von git 1.7.9.5 haben wir den
git archive
Befehl, mit dem Sie eine einzelne Datei von einem Remote-Host abrufen können.Die vollständige Antwort finden Sie hier https://stackoverflow.com/a/5324532/290784
quelle
github.com
HEAD
odermaster
nichtHEAD:directory
.git archive [email protected]:user/repo branch:path/to file | tar -x
Arbeiten in GIT 1.7.2.2
Zum Beispiel haben Sie eine entfernte some_remote mit Zweigen branch1 , branch32
Um eine bestimmte Datei auszuchecken, rufen Sie die folgenden Befehle auf:
als Beispiel wird es so etwas sein
Dieser Checkout-Befehl kopiert die gesamte Dateistruktur conf / en und conf / fr in das aktuelle Verzeichnis, in dem Sie diese Befehle aufrufen (natürlich gehe ich davon aus, dass Sie git init irgendwann zuvor ausgeführt haben).
quelle
git fetch some_remote
vorher rennen , nicht wahr?Sehr einfach:
Dadurch wird der
from-branch-name
Zweig nicht ausgecheckt . Sie bleiben in jedem Zweig, in dem Sie sich befinden, und nur diese einzelne Datei wird aus dem angegebenen Zweig ausgecheckt.Hier ist der relevante Teil der Manpage für
git-checkout
Hutspitze an Ariejan de Vroom, der mir dies aus diesem Blog-Beitrag beigebracht hat .
quelle
git clone --filter
ab Git 2.19Diese Option überspringt das Abrufen der meisten nicht benötigten Objekte vom Server:
Der Server sollte konfiguriert sein mit:
Ab Version 2.19.0 gibt es keine Serverunterstützung, diese kann jedoch bereits lokal getestet werden.
TODO:
--filter=blob:none
Überspringt alle Blobs, ruft aber trotzdem alle Baumobjekte ab. Bei einem normalen Repo sollte dies jedoch im Vergleich zu den Dateien selbst winzig sein, sodass dies bereits gut genug ist. Gefragt unter: https://www.spinics.net/lists/git/msg342006.html Entwickler antworteten--filter=tree:0
, dass dies in Arbeit ist.Denken Sie daran, dass dies
--depth 1
bereits impliziert--single-branch
, siehe auch: Wie klone ich einen einzelnen Zweig in Git?file://$(path)
ist erforderlich, umgit clone
Protokoll-Spielereien zu überwinden : Wie kann ein lokales Git-Repository mit einem relativen Pfad flach geklont werden ?Das Format von
--filter
ist am dokumentiertman git-rev-list
.Das Git-Remote-Protokoll wurde erweitert, um diese Funktion zu unterstützen.
Dokumente auf Git-Baum:
Probieren Sie es aus
GitHub stromaufwärts .
Ausgabe in Git v2.19.0:
Schlussfolgerungen: Alle Blobs außer
d1/a
fehlen. ZBf70a17f51b7b30fec48a32e4f19ac15e261fd1a4
das heißtd1/b
, ist nach dem Auschecken nicht dad1/
.Beachten Sie, dass
root/root
undmybranch/mybranch
auch fehlen,--depth 1
verbirgt dies jedoch in der Liste der fehlenden Dateien. Wenn Sie entfernen--depth 1
, werden sie in der Liste der fehlenden Dateien angezeigt.quelle
Sie können es tun, indem Sie
quelle
Zwei Varianten dessen, was bereits gegeben wurde:
und:
Diese schreiben die Datei in die Standardausgabe.
quelle
Angenommen, der Dateiname lautet 123.txt. Dies funktioniert für mich:
Wenn sich die Datei in einem Verzeichnis A befindet, stellen Sie sicher, dass Sie sie korrekt angeben:
quelle
In git "checken" Sie Dateien nicht aus, bevor Sie sie aktualisieren - es scheint, als ob Sie danach suchen.
Bei vielen Systemen wie Clearcase, CSV usw. müssen Sie eine Datei auschecken, bevor Sie Änderungen daran vornehmen können. Git benötigt dies nicht. Sie klonen ein Repository und nehmen dann Änderungen an Ihrer lokalen Kopie des Repositorys vor.
Sobald Sie die Dateien aktualisiert haben, können Sie Folgendes tun:
Um zu sehen, welche Dateien geändert wurden. Sie fügen diejenigen hinzu, für die Sie sich
index
zuerst festlegen möchten (entsprichtindex
einer einzucheckenden Liste):oder
Dann
git status
zeigt Ihnen do , welche Dateien geändert wurden und welcheindex
zum Festschreiben oder Einchecken bereit sind .Um Dateien in Ihre Kopie des Repositorys zu übertragen, gehen Sie wie folgt vor:
Auf der
git
Website finden Sie Links zu Handbüchern und Anleitungen.quelle
git format-patch
, um einen Patch für die Übermittlung zu erstellen (git format-patch -1
erstellt einen Patch) nur für Ihr letztes Commit).Hier ist die vollständige Lösung zum Abrufen und Verschieben nur einer bestimmten Datei im Git-Repository:
Siehe auch einen Link für einige zusätzliche Informationen.
quelle
Es hört sich so an, als würden Sie versuchen, eine Idee aus der zentralen Versionskontrolle zu übernehmen, was Git von Natur aus nicht ist - es ist verteilt. Wenn Sie mit einem Git-Repository arbeiten möchten, klonen Sie es. Sie haben dann den gesamten Inhalt des Arbeitsbaums und den gesamten Verlauf (zumindest alles, was bis zur Spitze des aktuellen Zweigs führt), nicht nur eine einzelne Datei oder einen Snapshot aus einem einzelnen Commit.
quelle
Wenn Sie eine bestimmte Datei aus einem bestimmten Zweig eines Remote-Git-Repositorys benötigen, lautet der Befehl:
Der Rest kann aus der Antwort von @ VonC abgeleitet werden:
Wenn Sie eine bestimmte Datei aus dem Hauptzweig benötigen, ist dies:
Wenn Sie eine bestimmte Datei von einem Tag benötigen, ist dies:
quelle
Ich sehe nicht, was für mich funktioniert hat, also werde ich es aufnehmen, falls sich jemand in meiner Situation befindet.
In meiner Situation habe ich ein Remote-Repository mit möglicherweise 10.000 Dateien und muss eine RPM-Datei für mein Linux-System erstellen. Der Build des RPM enthält einen Git-Klon von allem. Ich brauche nur eine Datei, um den RPM-Build zu starten. Ich kann den gesamten Quellbaum klonen, der das tut, was ich brauche, aber es dauert zusätzliche zwei Minuten, um alle diese Dateien herunterzuladen, wenn ich nur eine brauche. Ich habe versucht, die besprochene Git-Archivierungsoption zu verwenden, und wurde "fatal: Operation wird vom Protokoll nicht unterstützt". Es scheint, dass ich eine Art Archivierungsoption auf dem Server aktivieren muss, und mein Server wird von bürokratischen Schlägern gewartet, die es anscheinend genießen, es schwierig zu machen, Dinge zu erledigen.
Was ich schließlich tat, war, dass ich in das Webinterface für Bitbucket ging und die eine Datei ansah, die ich brauchte. Ich habe mit der rechten Maustaste auf den Link geklickt, um eine Rohkopie der Datei herunterzuladen, und im resultierenden Popup die Option "Verknüpfung zum Kopieren" ausgewählt. Ich konnte die Rohdatei nicht einfach herunterladen, da ich die Dinge automatisieren musste und auf meinem Linux-Server keine Browser-Oberfläche habe.
Aus Gründen der Diskussion ergab sich daraus die URL:
Ich konnte diese Datei nicht direkt aus dem Bitbucket-Repository herunterladen, da ich mich zuerst anmelden musste. Nach einigem Graben fand ich, dass dies funktionierte: Unter Linux:
Mit dieser Kombination konnte ich die eine Datei herunterladen, die ich zum Erstellen aller anderen Dateien benötigte.
quelle
Ich füge diese Antwort als Alternative zu einer formellen Kaufabwicklung oder einer ähnlichen lokalen Operation hinzu. Angenommen, Sie haben Zugriff auf die Weboberfläche Ihres Git-Anbieters, können Sie möglicherweise jede Datei bei einem bestimmten gewünschten Commit direkt anzeigen. Auf GitHub können Sie beispielsweise Folgendes verwenden:
Hier
ed25584f
sind die ersten 8 Zeichen aus dem SHA-1-Hash des Commits von Interesse, gefolgt vom Pfad zur Quelldatei.Ähnlich können wir auf Bitbucket versuchen:
In diesem Fall platzieren wir den Commit-Hash am Ende der Quell-URL.
quelle
Wenn Sie nur die Datei herunterladen müssen, müssen Sie nicht mit Git auschecken.
GitHub Mate ist viel einfacher, es ist eine Chrome-Erweiterung, mit der Sie auf das Dateisymbol klicken können, um es herunterzuladen. auch Open Source
quelle
git
! =github
Wenn Sie eine lokale Version einer Datei bearbeitet haben und zur ursprünglichen Version zurückkehren möchten, die auf dem zentralen Server verwaltet wird, können Sie dies problemlos mit Git Extensions erreichen .
Einfach!
quelle