Wie kann ich nur eine Datei aus einem Git-Repository auschecken?
Können Sie die Änderungen im Spar-Checkout übertragen?
Wie kann ich nur eine Datei aus einem Git-Repository auschecken?
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.
git config core.sparsecheckout true
).git/info/sparse-checkout
DateiUm 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.
@Tilo: Ich bin mir nicht sicher, aber es sollte möglich sein, wenn man bedenkt, dass der Klon ein vollständiger Klon war.
Inwiefern ist das besser als "git checkout HASH path-to-file", wie in anderen Antworten erwähnt?
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
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).
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.
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.
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
Sie können auch einen Tag oder einen Zweignamen verwenden, nicht nur die Raute. Diese sind oft einfacher.
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?
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.
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.
git checkout -- <filename>
Ref: https://git-scm.com/docs/git-checkout
Dup: Änderungen an der Arbeitskopie einer Datei in Git rückgängig machen?
Für weitere Erklärungen. broc.seib In der Antwort wurde erklärt, was der relevante Teil der Manpage für git-checkout
.
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.
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
Mögliche Duplikate von Wie kann ich eine Datei auf den letzten Commit in Git zurücksetzen?
0 Stimmen
Sie können die Chrome-Erweiterung verwenden GitHub Mate können Sie auf das Dateisymbol klicken, um die Datei herunterzuladen.
0 Stimmen
Mögliches Duplikat von Abrufen einer einzelnen Datei aus einem Repository
0 Stimmen
Siehe stattdessen: stackoverflow.com/a/600189/42223
0 Stimmen
Ich habe 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. Sehen Sie es hier: stackoverflow.com/questions/60190759/0 Stimmen
Damit zusammenhängend: Menschen, die über eine Google-Suche hier landen, suchen möglicherweise stattdessen nach dieser Frage, obwohl es sich um eine völlig andere Frage handelt: Wie man eine Datei aus einem anderen Zweig erhält .
0 Stimmen
Kein Git-Befehl, sondern Checkout/Download einer Datei. Versuchen Sie
svn export --force https://github.com/{USER}/{REPO}/trunk/{PATH}/{TO}/{FILE} {PATH}/{TO}/{CHECKOUT
} [--force
zum Überschreiben der Ziel-/Downloaddatei]