2012-12-01 10 views
5

Voglio eseguire il checkout di un singolo file da un repository git in una posizione diversa (diversa dalla directory di lavoro) e lasciare la mia directory di lavoro corrente così com'è. E voglio dare un'occhiata al mio file con terminazioni di linea corrette.Come posso conservare le terminazioni di riga quando controllo un singolo file in una posizione diversa con git?

Lavoro su Windows ma ho lo stesso problema anche in Linux.

Ecco il mio piano d'azione (Win7 64-bit):

prima mi assicuro che git converte CRLF a LF sul impegnarsi e LF in CRLF sulla cassa:

git config --local core.autocrlf true 

Poi crea un file chiamato crlf.txt con fine riga CRLF e commetterlo:

git add crlf.txt 
git commit -m "File with crlf" 

a cambiare qualcosa in crlf.txt e commetterlo:

git add crlf.txt 
git commit -m "Change in crlf.txt" 

Ora voglio ottenere crlf.txt come se fosse il primo commit:

git show HEAD~1:crlf.txt > "/home/user/crlf_like_in_head-1.txt" 

Il file "crlf_like_in_head-1.txt" non contiene CRLF ma LF. Penso che git show sia corretto perché mostra il contenuto del file come se fosse nel repository (core.autocrlf = true converte CRLF in LF). Lo so dalla documentazione e ho provato lo stesso con core.autocrlf = false. Con core.autocrlf = false "crlf_like_in_head-1.txt" contiene CRLF. So che posso convertire facilmente LF in CRLF, ma devo assicurarmi che il file dei risultati sia lo stesso come è stato estratto con git.

So che posso anche checkout un unico file con git checkout:

git checkout HEAD~1 crlf.txt 

Ma sovrascrive il contenuto corrente del crlf.txt nella directory di lavoro (anche se crlf.txt era in uno stato sporco) e non posso controllarlo in una cartella diversa con git checkout.

risposta

1

Hai capito bene - git show ti mostra solo cosa c'è nel repository - nessuna magia di pagamento in corso.

È possibile ottenere quello che vuoi modificando temporaneamente la posizione della vostra directory di lavoro per il checkout

git --work-tree=/home/user checkout HEAD~1 crlf.txt 

Ciò estrarre il file a /home/user/crlf.txt. Nota: Se si esegue il checkout di un file in una sottodirectory, tale directory verrà creata anche nella cartella di destinazione. Non puoi impedirlo, né specificare il nome del file di destinazione. Se questo è un problema, dovresti scrivere uno script di shell a due righe che faccia il checkout in una directory temporanea e poi sposti il ​​file estratto.

+0

Grazie per la risposta. Ma questo non funziona con Win32. Restituisce il seguente errore: "errore: pathspec 'hallo.txt' non corrisponde a nessun file noto per git." Ho anche provato con l'opzione core.worktree. Funziona se eseguo il checkout di un intero ramo o di una revisione (git --work-tree =/home/user checkout HEAD ~ 1) – fernsehkind

+0

Ho avuto lo stesso problema durante il test. Stai cercando di verificare un percorso che è un genitore del tuo repository? – Chronial

+0

Sì, l'ho fatto. Ma ho anche provato un altro percorso. Ma non funziona. – fernsehkind

Problemi correlati