Come ottenere una versione specifica di un file in Mercurial?


114

Sono nuovo su Mercurial. Non riesco a trovare il comando giusto. Ho provato l'aggiornamento / checkout senza fortuna. Sto usando il repository locale. Grazie


@ Onnifario: ho eseguito il commit di una versione stabile di un file. Poi ho continuato a lavorare sul file ma presto ho capito che avevo bisogno dell'ultima versione "buona". Questo può essere fatto aggiornando in svn ma quando provo a hg update, dice "0 files ..."
Codism

Risposte:


153

Penso che tu voglia hg revert -r<rev> <file>(questo cambierà il file in modo che sia com'era nella revisione data).


Sì, è esattamente quello che vuole. :-)
Omnifarious

9
o semplicemente hg ripristina <nomefile> se vuoi scartare le tue modifiche attuali e ottenere l'ultima che è stata confermata
BlackTigerX

@BlackTigerX Senza la revisione un file non modificato non verrà ripristinato a nulla, anche se non è la versione più recente. A volte lo uso per selezionare i file tra le revisioni, quindi è importante.
user2864740

83

Come detto da djc revertaltera un file in posizione per corrispondere a una revisione precedente. Se vuoi che non sia a posto puoi usare hg cat -r revisionid filename(sostituendo revisionid e nome file ovviamente) che produrrà il file in stdout, adatto per il reindirizzamento ovunque tu voglia.


4
purrrfect, esattamente quello che desideravo.
yota

Fantastico, è sempre bello sentire qualcosa del genere.
Ry4an Brase

24

hg revertrisolve effettivamente questo problema. Ma penso che tu sia confuso su una gamma più ampia di cose rispetto alla semplice risposta alla tua domanda e vuoi provare a rispondere in modo più completo.

hg updateè un intero comando di repository e non funzionerà su singoli file. È diverso dalla sovversione svn updatein questo modo. Se lo fai hg --help updatepuoi vedere che questo è il caso perché il comando non accetta argomenti di file. Può essere utilizzato per spostare l'intero repository su una particolare istantanea, ma non può essere utilizzato per farlo su un solo file.

Se digiti hg --help visualizzato un elenco di comandi. È un elenco piuttosto ampio e un po 'scoraggiante, ma se lo leggi, troverai questa riga:

revert       restore individual files or directories to an earlier state

Ora, se vuoi solo l'ultimo stato a scopo di confronto, c'è un altro comando a cui potresti essere interessato, e questo è hg cat. Ciò ti consentirà di stampare il contenuto di un file in qualsiasi revisione particolare. È quindi possibile reindirizzare il suo output in un altro file. Quindi puoi avere la precedente versione valida nota del tuo file e la vecchia versione da confrontare fianco a fianco.

Il motivo per cui Mercurial ha un updatecomando separato è che è possibile fare qualcosa in Mercurial che è impossibile in Subversion. È possibile updatepassare a una versione precedente, apportare modifiche, quindi eseguire il commit. Questo creerà un ramo. Il updatecomando ha l'effetto di cambiare anche la revisione genitore della directory di lavoro corrente così come cambiare il contenuto di tutti i file in quella directory alle versioni di quella revisione genitore.

Ciò significa che revertcambia il contenuto di un file (o anche l'intero repository se si danno al comando gli argomenti giusti) ma lascia la revisione genitore della copia di lavoro corrente lo stesso.

È possibile scoprire la revisione padre (o le revisioni nel caso di una fusione) della copia di lavoro corrente utilizzando il hg parentscomando.

In Subversion le revisioni sono una progressione strettamente lineare. Mercurial crea rami in un batter d'occhio e sono quasi altrettanto facili da unire. Le revisioni formano un DAG, non una progressione strettamente lineare.


13

Per estrarre una revisione specifica di un file specifico puoi farlo su Windows:

hg cat "<FileToBeExtractedPath>" -r 9 > "<ExtractionPath>"

Qui, 9 è il numero di revisione.

O ancora meglio:

hg cat "<FileToBeExtractedPath>" -r 9 -o "<ExtractionPath>"

1

Sono venuto qui cercando di ottenere la versione precedente, quindi ecco il comando esatto:

hg revert -r .~1 <file>
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.