Come estrarre un singolo file da un repository del server in Git?


114

Sto lavorando su un sito con un server che esegue Git. Sto usando Git per la distribuzione (non GitHub). Questo è stato impostato prima del mio coinvolgimento utilizzando un metodo hook e ho fatto riferimento a questa domanda e ho inserito i comandi seguenti, ma non ha funzionato.

Come si estrae un singolo file dal server? Ad esempio, se volessi aggiornare il mio file locale index.php? git pull index.php?



Risposte:


194

È possibile fare (nel repository distribuito):

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

Seguito da:

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

1
Grazie. Allora cosa intendi con <revision>? il nome del file? E se il mio file si trova nella directory principale, significa che devo digitare git checkout -m index.php index.php:?
vsvs

Grazie per la spiegazione.
vsvs

Deve essere *origin*/mastero può provenire da qualsiasi telecomando? L'intera cronologia è inserita nel mio repository o il file sembra apparire magicamente?
Bernhard Döbler

Se viene visualizzato questo errore "non corrisponde a nessun file noto a git": "path / to / file" non dovrebbe essere la copia del percorso ottenuto dalla posizione del file su GitHub, che significa "repoName / fileName" , dovresti sbarazzarti di "repoName /" e poi funzionerà.
Eduard

1
@ BernhardDöbler può essere qualsiasi filiale da remoto :)
chrismillah

27
git fetch --all
git checkout origin/master -- <your_file_path>
git add <your_file_path>
git commit -m "<your_file_name> updated"

Questo presuppone che tu stia estraendo il file da origin / master.


13

Questa può essere la soluzione:

git fetch

git checkout origin/master -- FolderPathName/fileName

Grazie.


5

Questo scenario si verifica quando tu - o forze maggiori di te - hai alterato un file nel tuo repository locale e vuoi solo ripristinare una nuova copia dell'ultima versione dal repository. Eliminare semplicemente il file con / bin / rm (non git rm) o rinominarlo / nasconderlo e quindi emettere un git pullnon funzionerà: git nota l'assenza del file e presume che probabilmente lo desideri dal repository ( git diffmostrerà tutte le righe cancellate dal File mancante).

git pullNon ripristinare i file mancanti a livello locale mi ha sempre frustrato su git, forse da quando sono stato influenzato da altri sistemi di controllo versione (ad esempio svn update che credo sarà ripristinare i file che sono stati nascosti in loco).

git reset --hard HEADè un modo alternativo per ripristinare il file di interesse in quanto elimina tutte le modifiche non salvate che hai. Tuttavia, come notato qui , git reset è un comando potenzialmente pericoloso se hai altre modifiche non salvate che ti interessano.

La git fetch ... git checkoutstrategia annotata sopra da @chrismillah è un bel modo chirurgico per ripristinare il file in questione.


1
molto esplicativo rispetto ad altri commenti. Grazie
Thecave3

3

Stavo cercando un'attività leggermente diversa, ma questo sembra quello che vuoi:

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

Voglio dire, se vuoi recuperare path/to/file.xz, imposterai DIR_NAMEsu path/toe FILE_NAMEsu file.xz. Quindi, finirai con qualcosa di simile

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

E nessuno ti tiene lontano da qualsiasi altra forma di disimballaggio invece, tar xOovviamente (ero io che ho bisogno di una pipa qui, sì).


1

Prova a usare:

git checkout branchName -- fileName

Ex:

git checkout master -- index.php

2
Attenzione: "git checkout master - index.php" non esegue il checkout dal server, ma dal database git locale dall'ultimo pull.
Roberto Novakosky


0

Questo batch di Windows funziona indipendentemente dal fatto che sia o meno su GitHub. Lo sto usando perché mostra alcuni severi avvertimenti. Noterai che l'operazione è lenta e attraversa centinaia di megabyte di dati , quindi non utilizzare questo metodo se i tuoi requisiti sono basati sulla larghezza di banda disponibile / memoria RW.

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: \ Users \ nome utente \ Desktop> sparse_checkout.bat

C: \ Users \ nome utente \ Desktop> pushd "C: \ Users \ nome utente \ Desktop \"

C: \ Users \ nome utente \ Desktop> se non esiste. \ Ms-server-essentials-docs mkdir. \ Ms-server-essentials-docs

C: \ Users \ nome utente \ Desktop> pushd. \ Ms-server-essentials-docs

C: \ Users \ nome utente \ Desktop \ ms-server-essentials-docs> git init Repository Git vuoto inizializzato in C: / Users / nome utente / Desktop / ms-server-essentials-docs / .git /

C: \ Users \ nome utente \ Desktop \ ms-server-essentials-docs> git remote add origin -f https://github.com/MicrosoftDocs/windowsserverdocs.git Aggiornamento origine remoto: Enumerazione di oggetti: 97, fatto. remoto: Conteggio oggetti: 100% (97/97), fatto. remoto: compressione di oggetti: 100% (44/44), fatto. remoto: Totale 145517 (delta 63), 76 riutilizzati (delta 53), riutilizzati in confezione 145420 Oggetti riceventi: 100% (145517/145517), 751,33 MiB | 32,06 MiB / s, fatto. Risoluzione dei delta: 100% (102110/102110), fatto. Da https://github.com/MicrosoftDocs/windowsserverdocs * [nuovo ramo]
1106-conflitto -> origine / 1106-conflitto * [nuovo ramo]
FromPrivateRepo -> origin / FromPrivateRepo * [nuovo ramo]
PR183 -> origin / PR183 * [nuova filiale]
conflittofix -> origine / conflittofix * [nuovo ramo]
eross-msft-patch-1 -> origine / eross-msft-patch-1 * [nuovo ramo]
master -> origine / master * [nuovo ramo] patch-1
-> origin / patch-1 * [nuovo ramo] repo_sync_working_branch -> origin / repo_sync_working_branch * [nuovo ramo]
shortpatti-patch-1 -> origin / shortpatti-patch-1 * [nuovo ramo]
shortpatti-patch-2 -> origin / shortpatti -patch-2 * [nuovo ramo]
shortpatti-patch-3 -> origin / shortpatti-patch-3 * [nuovo ramo]
shortpatti-patch-4 -> origin / shortpatti-patch-4 * [nuovo ramo]
shortpatti-patch -5 -> origin / shortpatti-patch-5 * [nuovo ramo]
shortpatti-patch-6 -> origin / shortpatti-patch-6 * [nuovo ramo]
shortpatti-patch-7 -> origin / shortpatti-patch-7 * [nuovo ramo]
shortpatti-patch-8 -> origin / shortpatti-patch-8

C: \ Users \ nome utente \ Desktop \ ms-server-essentials-docs> git config core.sparseCheckout true

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

C: \ Users \ nome utente \ Desktop \ ms-server-essentials-docs> git pull origin master
Da https://github.com/MicrosoftDocs/windowsserverdocs
* branch master -> FETCH_HEAD

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.