2013-02-21 14 views
23

Ho una versione di un file .tex da un numero di commit fa che vorrei ottenere una copia di. Ho il valore di hash sha1 per il commit che ha la versione di quel file che voglio. Non voglio sostituire la versione corrente del file. Piuttosto, voglio solo ottenere una copia separata di esso che rifletta il suo stato nella versione precedente.Come ottenere una copia di una versione precedente di un file in un repository git?

Un sacco di domande simili suggeriscono di utilizzare git checkout <sha1> -- file.tex, ma questo continua a dare "errore: pathspec 'file.tex' non corrispondeva a nessun file noto per git."

Il file che mi interessa originariamente esisteva nella directory di livello superiore del repository. Sono attualmente in una sottodirectory del repository cercando di eseguire questo comando in modo da ottenere la versione precedente di file.tex nella sottodirectory.

È possibile? Come posso fare questo?

+0

Creare una copia del file corrente e quindi eseguire 'git checkout file.ext'? – adamdunson

+0

Il mio caso d'uso esatto. Saluti! –

risposta

39

È possibile utilizzare git cat-file per scaricare il contenuto del file sullo standard output e reindirizzare che nella vostra destinazione desiderata:

git cat-file -p <sha1>:./file.tex > wherever.tex 

Il ./ è necessaria se si è in una sottodirectory del repository, se si è nel livello più alto del repository potrebbe essere omesso. Inoltre, potrebbe non funzionare con versioni precedenti di git, nel qual caso sarà necessario fornire esplicitamente il percorso completo al file relativo alla radice del repository.

+0

Grazie, questa è esattamente la funzionalità che stavo cercando. – jbranchaud

+1

Si noti che, a differenza di molti altri comandi git, il nome file (qui "file.tex") deve essere il nome dalla radice del repository git; quindi se vuoi foo/file.tex e sei nella sottodirectory foo non puoi digitare quanto sopra, dovresti digitare : foo/file.tex nonostante tu sia già nel foo. – Daniel

+0

@Daniel, è vero. Ma, almeno con le versioni recenti di git, puoi sempre usare '.' per fare riferimento alla directory corrente. Ho aggiornato la mia risposta per riflettere questo. – qqx

5

Penso che la soluzione migliore sia quella di sovrascrivere temporaneamente il file. Nel vostro primo livello del repository:

git checkout <sha1> file.tex 
cp file.tex directory 
git checkout file.tex 
+0

questa è la soluzione migliore che ho visto finora. Sono ancora infastidito dal fatto che non ci sia un modo per prendere direttamente quel file. – jbranchaud

+3

L'ultimo comando dovrebbe essere 'git checkout HEAD file.tex'. Il primo comando di checkout avrebbe modificato l'indice e la copia dell'albero di lavoro, quindi il checkout senza specificare una revisione avrebbe comunque utilizzato la versione precedente. – qqx

Problemi correlati