Wie ziehe ich eine einzelne Datei aus einem Server-Repository in Git?

113

Ich arbeite an einer Site mit einem Server, auf dem Git ausgeführt wird. Ich verwende Git für die Bereitstellung (nicht GitHub). Dies wurde vor meiner Beteiligung mit einer Hook-Methode eingerichtet , und ich bezog mich auf diese Frage und gab die folgenden Befehle ein, aber es funktionierte nicht.

Wie ziehe ich eine einzelne Datei vom Server? Zum Beispiel, wenn ich meine lokale Datei index.php aktualisieren wollte? git pull index.php?

vsvs
quelle
1
Mögliches Duplikat von Ist es möglich, nur eine Datei in Git zu ziehen?
Mateusz Piotrowski
Mögliches Duplikat von Wie kann man nur eine Datei aus dem Git-Repository auschecken?
Ciro Santilli 法轮功 冠状 病 六四 事件 30

Antworten:

192

Es ist möglich (im bereitgestellten Repository):

git fetch
// git fetch will download all the recent changes, but it will not put it in your current checked out code (working area).

Gefolgt von:

git checkout origin/master -- path/to/file
// git checkout <local repo name (default is origin)>/<branch name> -- path/to/file will checkout the particular file from the downloaded changes (origin/master).
chrismillah
quelle
1
Danke dir. Also, was meinst du damit <revision>? der Dateiname? Und wenn sich meine Datei im Stammverzeichnis befindet, muss ich dann Folgendes eingeben : git checkout -m index.php index.php?
vsvs
Vielen Dank für die Erklärung.
vsvs
Muss es sein *origin*/masteroder kann es von einer Fernbedienung sein? Wird der gesamte Verlauf in mein Repo gezogen oder scheint die Datei magisch zu erscheinen?
Bernhard Döbler
Wenn Sie die Fehlermeldung erhalten, dass "keine mit git bekannten Dateien übereinstimmen": "path / to / file" sollte nicht die Kopie des Pfads sein, den Sie vom Dateispeicherort auf GitHub erhalten, was "repoName / fileName" bedeutet. sollten Sie "repoName /" loswerden und dann wird es funktionieren.
Eduard
1
@ BernhardDöbler es kann jeder Zweig von fern sein :)
chrismillah
27
git fetch --all
git checkout origin/master -- <your_file_path>
git add <your_file_path>
git commit -m "<your_file_name> updated"

Dies setzt voraus, dass Sie die Datei vom Ursprung / Master abrufen.

OYORF
quelle
13

Dies kann die Lösung sein:

git fetch

git checkout origin/master -- FolderPathName/fileName

Vielen Dank.

Y. Joy Ch. Singha
quelle
5

Dieses Szenario tritt auf, wenn Sie - oder größere Kräfte als Sie - eine Datei in Ihrem lokalen Repo entstellt haben und nur eine neue Kopie der neuesten Version aus dem Repo wiederherstellen möchten. Das einfache Löschen der Datei mit / bin / rm (nicht git rm) oder das Umbenennen / Ausblenden und anschließende Ausgabe von a git pullfunktioniert nicht: git bemerkt das Fehlen der Datei und geht davon aus, dass Sie sie wahrscheinlich aus dem Repo entfernen möchten ( git diffzeigt alle aus dem .o gelöschten Zeilen an Fehlende Datei).

git pullnicht lokal Wiederherstellung hat fehlende Dateien frustriert mich immer über git, vielleicht weil ich von anderen Versionskontrollsystemen (zB beeinflusst worden svn update die ich glaube , werden Dateien wiederherstellen , die lokal ausgeblendet wurden).

git reset --hard HEADist eine alternative Möglichkeit, die interessierende Datei wiederherzustellen, da alle nicht festgeschriebenen Änderungen, die Sie vorgenommen haben, weggeworfen werden. Wie hier erwähnt , ist das Zurücksetzen von Git ein potenziell gefährlicher Befehl, wenn Sie andere nicht festgeschriebene Änderungen haben, die Sie interessieren.

Die git fetch ... git checkoutoben von @chrismillah erwähnte Strategie ist eine gute chirurgische Methode, um die betreffende Datei wiederherzustellen.

Trutane
quelle
1
viel aussagekräftiger als andere Kommentare. Vielen Dank
Thecave3
3

Ich habe nach einer etwas anderen Aufgabe gesucht, aber diese sieht so aus, wie Sie es möchten:

git archive --remote=$REPO_URL HEAD:$DIR_NAME -- $FILE_NAME |
tar xO > /where/you/want/to/have.it

Ich meine, wenn Sie holen wollen path/to/file.xz, wird Sie DIR_NAMEauf path/tound FILE_NAMEzu file.xz. Sie werden also mit so etwas enden

git archive --remote=$REPO_URL HEAD:path/to -- file.xz |
tar xO > /where/you/want/to/have.it

Und niemand hält dich von irgendeiner anderen Form des Auspackens ab, anstatt tar xOnatürlich (Ich war es, der hier eine Pfeife braucht, ja).

jno
quelle
1

Versuchen Sie es mit:

git checkout branchName -- fileName

Ex:

git checkout master -- index.php
Dodda Venkata
quelle
2
Achtung: "git checkout master - index.php" Dieses Auschecken erfolgt nicht vom Server, sondern von der lokalen Git-Datenbank vom letzten Pull.
Roberto Novakosky
0

Dieser Windows-Stapel funktioniert unabhängig davon, ob er auf GitHub ausgeführt wird oder nicht. Ich benutze es, weil es einige starke Einschränkungen zeigt. Sie werden feststellen, dass der Vorgang langsam ist und Hunderte von Megabyte Daten durchläuft. Verwenden Sie diese Methode daher nicht, wenn Ihre Anforderungen auf der verfügbaren Bandbreite / dem RW-Speicher basieren.

sparse_checkout.bat

pushd "%~dp0"
if not exist .\ms-server-essentials-docs mkdir .\ms-server-essentials-docs
pushd .\ms-server-essentials-docs
git init
git remote add origin -f https://github.com/MicrosoftDocs/windowsserverdocs.git
git config core.sparseCheckout true
(echo EssentialsDocs)>>.git\info\sparse-checkout
git pull origin master

=>

C: \ Benutzer \ Benutzername \ Desktop> sparse_checkout.bat

C: \ Benutzer \ Benutzername \ Desktop> Pushd "C: \ Benutzer \ Benutzername \ Desktop \"

C: \ Benutzer \ Benutzername \ Desktop> falls nicht vorhanden. \ Ms-server-essentials-docs mkdir. \ Ms-server-essentials-docs

C: \ Benutzer \ Benutzername \ Desktop> pushd. \ Ms-server-essentials-docs

C: \ Benutzer \ Benutzername \ Desktop \ ms-server-essentials-docs> git init Initialisiert leeres Git-Repository in C: / Benutzer / Benutzername / Desktop / ms-server-essentials-docs / .git /

C: \ Benutzer \ Benutzername \ Desktop \ ms-server-essentials-docs> git remote add origin -f https://github.com/MicrosoftDocs/windowsserverdocs.git Aktualisieren des Ursprungs remote: Auflisten von Objekten: 97, erledigt. remote: Objekte zählen: 100% (97/97), fertig. remote: Objekte komprimieren: 100% (44/44), fertig. Remote: Insgesamt 145517 (Delta 63), wiederverwendet 76 (Delta 53), wiederverwendet 145420 Empfangsobjekte: 100% (145517/145517), 751,33 MiB | 32.06 MiB / s, fertig. Deltas lösen: 100% (102110/102110), fertig. Von https://github.com/MicrosoftDocs/windowsserverdocs * [neuer Zweig]
1106-Konflikt -> Ursprung / 1106-Konflikt * [neuer Zweig]
FromPrivateRepo -> Ursprung / FromPrivateRepo * [neuer Zweig]
PR183 -> Ursprung / PR183 * [Neue Abteilung]
Konfliktfix -> Ursprung / Konfliktfix * [neuer Zweig]
eross-msft-patch-1 -> Ursprung / eross-msft-patch-1 * [neuer Zweig]
master -> Ursprung / Master * [neuer Zweig] patch-1
-> origin / patch-1 * [neuer Zweig] repo_sync_working_branch -> origin / repo_sync_working_branch * [neuer Zweig]
shortpatti-patch-1 -> origin / shortpatti-patch-1 * [neuer Zweig]
shortpatti-patch-2 -> origin / shortpatti -patch-2 * [neuer Zweig]
Shortpatti-Patch-3 -> Ursprung / Shortpatti-Patch-3 * [neuer Zweig]
Shortpatti-Patch-4 -> Ursprung / Shortpatti-Patch-4 * [neuer Zweig]
Shortpatti-Patch -5 -> origin / shortpatti-patch-5 * [neuer Zweig]
shortpatti-patch-6 -> origin / shortpatti-patch-6 * [neuer Zweig]
shortpatti-patch-7 -> origin / shortpatti-patch-7 * [neuer Zweig]
shortpatti-patch-8 -> origin / shortpatti-patch-8

C: \ Benutzer \ Benutzername \ Desktop \ ms-server-essentials-docs> git config core.sparseCheckout true

C: \ Benutzer \ Benutzername \ Desktop \ ms-server-essentials-docs> (echo EssentialsDocs) 1 >>. Git \ info \ sparse-checkout

C: \ Benutzer \ Benutzername \ Desktop \ ms-server-essentials-docs> git pull origin master
Von https://github.com/MicrosoftDocs/windowsserverdocs
* branch master -> FETCH_HEAD

kayleeFrye_onDeck
quelle