Come eseguire il checkout di un solo file dal repository git (‘sparse checkout’)?

Come posso effettuare il checkout di un solo file da un repository git?

Come menzionato nelle altre risposte:

  • puoi usare git archive (vedi la risposta di Jared Forsyth e la risposta di Robert Knight ), dal git1.7.9.5 (marzo 2012) :

    git archive --remote=git://git.foo.com/project.git HEAD:path/to/directory filename | tar -x 

Ciò salverà una copia di ” filenameHEAD del repository remoto nella directory corrente.

La parte :path/to/directory è facoltativa. Se escluso, il file recuperato verrà salvato su /path/to/directory/filename .

Fizer Khan menziona sotto specificando esplicitamente il formato tar:

 git archive --format=tar --remote=origin HEAD --  | tar xf - 

È simile alla risposta di Paul Brannan :

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

Come commentato da Doron Gold , per git archive --remote=xxx per funzionare, DEVI prima eseguire questo all’interno della directory del tuo repository sul tuo server git (dove git demone gira):

 git config daemon.uploadarch true 

Vedi il commento di patthoyts della risposta di Jakub Narębski del 2009 su ” git: Recupera un singolo file da un repository “.

In alternativa puoi fare quanto segue se hai una copia locale del repository nudo come menzionato in questa risposta ,

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

  • oppure è necessario clonare prima il repository, ovvero ottenere la cronologia completa:

    • nel repository .git
    • nell’albero di lavoro.
  • Ma poi puoi fare un checkout sparse (se stai usando Git1.7 +) ,:

    • abilita l’opzione sparse checkout ( git config core.sparsecheckout true )
    • aggiungendo quello che vuoi vedere nel file .git/info/sparse-checkout
    • rileggendo l’albero di lavoro per visualizzare solo ciò di cui hai bisogno

Per rileggere l’albero di lavoro:

 $ git read-tree -m -u HEAD 

In questo modo, si finisce con un albero di lavoro che include esattamente ciò che si desidera (anche se si tratta di un solo file)

Prima clonate il repository con l’opzione -n, che sopprime il checkout predefinito di tutti i file, e l’opzione –depth 1, che significa che ottiene solo la revisione più recente di ciascun file

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

Quindi controlla solo il file che desideri in questo modo:

 cd the_repo git checkout HEAD name_of_file 

Se hai già una copia del repository git, puoi sempre eseguire il checkout di una versione di un file usando un git log per scoprire l’hash-id (per esempio 3cdc61015724f9965575ba954c8cd4232c8b42e4) e poi scrivi semplicemente:

 git checkout hash-id path-to-file 

Ecco un esempio reale:

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

Normalmente non è ansible scaricare un solo file da git senza scaricare l’intero repository come suggerito nella prima risposta. È perché Git non memorizza i file come credi (come fa CVS / SVN), ma li genera in base all’intera storia del progetto.

Ma ci sono alcune soluzioni alternative per casi specifici. Vedi sotto:

GitHub

Se questo file è su github.com, prova ad esempio:

 wget https://raw.githubusercontent.com/user/project/master/README 

gitweb

Se utilizzi Git sul server – GitWeb , puoi provare ad esempio (cambiarlo nel percorso corretto):

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

GitWeb su drupalcode.org

Esempio:

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

googlesource.com

C’è una funzione non documentata che ti permette di scaricare versioni codificate in base 64 di file raw:

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

In altri casi, controlla se il tuo repository Git utilizza qualsiasi interfaccia web.

Se non utilizza alcuna interfaccia web, puoi prendere in considerazione di inviare il tuo codice a servizi esterni come GitHub , Bitbucket , ecc . e usarlo come uno specchio.

Se non hai installato wget , prova a curl -O (url) alternativa.

git checkout branch_or_version – percorso / file

esempio: git checkout HEAD -- main.c

Guida minima

git checkout --


Rif: https://git-scm.com/docs/git-checkout

Dup: annullare le modifiche di copia di lavoro di un file in Git?

Lavorare in GIT 1.7.2.2

Ad esempio, hai un remote_remote con branch branch1 , branch32

quindi per il checkout di un file specifico chiami questo comando:

 git checkout remote/branch path/to/file 

ad esempio sarà qualcosa di simile

 git checkout some_remote/branch32 conf/en/myscript.conf git checkout some_remote/branch1 conf/fr/load.wav 

Questo comando di checkout copierà l’intera struttura di file conf / en e conf / fr nella directory corrente in cui vengono chiamati questi comandi (ovviamente presumo che tu abbia eseguito git init ad un certo punto prima)

Ora possiamo! Poiché questo è il primo risultato su google, ho pensato di aggiornarlo all’ultima posizione. Con l’avvento di git 1.7.9.5, abbiamo il comando git archive che ti permetterà di recuperare un singolo file da un host remoto.

 git archive --remote=git://git.foo.com/project.git HEAD:path/to/directory filename | tar -x 

Vedere la risposta per intero qui https://stackoverflow.com/a/5324532/290784

Molto semplice:

 git checkout from-branch-name -- path/to/the/file/you/want 

Questo non eseguirà il checkout del from-branch-name . Rimarrai su qualsiasi ramo in cui ti trovi e solo quel singolo file verrà estratto dal ramo specificato.

Ecco la parte rilevante della pagina di manuale per git-checkout

 git checkout [-p|--patch] [] [--] ... When  or --patch are given, git checkout does not switch branches. It updates the named paths in the working tree from the index file or from a named  (most often a commit). In this case, the -b and --track options are meaningless and giving either of them results in an error. The  argument can be used to specify a specific tree-ish (ie commit, tag or tree) to update the index for the given paths before updating the working tree. 

Punta di cappello per Ariejan de Vroom che mi ha insegnato questo da questo post sul blog .

Puoi farlo da

 git archive --format=tar --remote=origin HEAD | tar xf - git archive --format=tar --remote=origin HEAD  | tar xf - 

In git non esegui il checkout dei file prima di aggiornarli : sembra che questo sia ciò che stai cercando.

Molti sistemi come clearcase, csv e così via richiedono di “estrarre” un file prima di poter apportare modifiche ad esso. Git non ha bisogno di questo. Cloni un repository e poi apporti modifiche nella tua copia locale del repository.

Una volta aggiornati i file puoi fare:

 git status 

Per vedere quali file sono stati modificati. Aggiungi quelli che vuoi impegnare a index prima con (l’ index è come un elenco da verificare):

 git add . 

o

 git add blah.c 

Quindi lo git status ti mostrerà quali file sono stati modificati e quali sono in index pronti per essere confermati o controllati.

Per trasferire file alla tua copia del repository fai:

 git commit -a -m "commit message here" 

Vedere il sito Web git per i collegamenti a manuali e guide.

Due varianti su ciò che è già stato dato:

 git archive --format=tar --remote=git://git.foo.com/project.git HEAD:path/to/directory filename | tar -O -xf - 

e:

 git archive --format=zip --remote=git://git.foo.com/project.git HEAD:path/to/directory filename | funzip 

Questi scrivono il file sullo standard output.

Dì che il nome del file è 123.txt, questo funziona per me:

 git checkout --theirs 123.txt 

Se il file si trova in una directory A, assicurati di specificarlo correttamente:

 git checkout --theirs "A/123.txt" 

Sembra che tu stia cercando di trasferire un’idea dal controllo della versione centralizzata, che per sua natura non è git – è distribuito. Se vuoi lavorare con un repository git, lo cloni. Poi hai tutti i contenuti dell’albero di lavoro e tutta la cronologia (beh, almeno tutto ciò che porta al vertice del ramo corrente), non solo un singolo file o un’istantanea da un singolo commit.

  git clone /path/to/repo git clone git://url/of/repo git clone http://url/of/repo 

Se hai solo bisogno di scaricare il file, non è necessario effettuare il check-out con Git.

GitHub Mate è molto più facile da fare, è un’estensione di Chrome, consente di fare clic sull’icona del file per scaricarlo. anche open source

Se hai bisogno di un file specifico da un ramo specifico da un repository Git remoto, il comando è:

 git archive --remote=git://git.example.com/project.git refs/heads/mybranch path/to/myfile |tar xf - 

Il resto può essere ricavato dalla risposta di @ VonC:

Se hai bisogno di un file specifico dal ramo principale è:

 git archive --remote=git://git.example.com/project.git HEAD path/to/myfile |tar xf - 

Se hai bisogno di un file specifico da un tag è:

 git archive --remote=git://git.example.com/project.git mytag path/to/myfile |tar xf - 

Se hai modificato una versione locale di un file e desideri ripristinare la versione originale gestita sul server centrale, questa operazione può essere facilmente realizzata utilizzando Git Extensions .

  • Inizialmente il file verrà contrassegnato per il commit, poiché è stato modificato
  • Selezionare (fare doppio clic) sul file nel menu della struttura dei file
  • L’albero di revisione per il singolo file è elencato.
  • Seleziona la parte superiore / HEAD dell’albero e fai clic con il pulsante destro del mouse su Salva come
  • Salvare il file per sovrascrivere la versione locale modificata del file
  • Il file ora ha la versione corretta e non sarà più contrassegnato per il commit!

Facile!