Eliminare tutto e ottenere una copia pulita dell'ultima revisione?


159

Sto spostando un processo di generazione per usare mercurial e voglio riportare la directory di lavoro allo stato della revisione del suggerimento. Le esecuzioni precedenti del processo di compilazione avranno modificato alcuni file e aggiunto alcuni file che non voglio impegnare, quindi ho modifiche locali e file che non sono stati aggiunti al repository.

Qual è il modo più semplice per scartare tutto ciò e ottenere una directory di lavoro pulita con l'ultima revisione?

Attualmente sto facendo questo:

hg revert --all
<build command here to delete the contents of the working directory, except the .hg folder.>
hg pull
hg update -r MY_BRANCH

ma sembra che ci dovrebbe essere un modo più semplice.

Voglio fare l'equivalente di eliminare il repository, fare un nuovo clone e un aggiornamento. Ma il repository è troppo grande per essere abbastanza veloce.


1
"(Elimina i contenuti ...)" è un commento al comando "ripristina - tutti" o un passaggio che esegui? Chiedo perché "hg update" aggiornerà solo i file modificati. Se rimuovi altri file prima dell'aggiornamento, non li riavrai a meno che non esegua l'aggiornamento a null-revision ( hg update 00) e quindi esegui il backup sul suggerimento. Perché non è hg revert --allsufficiente tornare a uno stato di cartella di lavoro coerente prima di estrarre e aggiornare?
Lasse V. Karlsen,

è un passaggio separato fatto con il mio software di compilazione. (Avrei potuto usare una cancellazione dalla riga di comando, ma non l'ho fatto.)
Rory,

1
Potresti trovare utile il archivecomando in futuro. Ad esempio, potresti hg archive ../newbuild, e una fotografia del tuo repository alla fine hg updateverrà posizionata lì. In genere lo faccio per build notturne solo per non rischiare di ingombrare il mio repository. Basta eliminare la directory di build quando non è più necessaria.
Tim Post

Risposte:


212

Tali passaggi dovrebbero poter essere abbreviati in:

hg pull
hg update -r MY_BRANCH -C

Il -Cflag indica al comando update di annullare tutte le modifiche locali prima dell'aggiornamento.

Tuttavia, ciò potrebbe comunque lasciare file non tracciati nel repository. Sembra che tu voglia sbarazzarti anche di quelli, quindi userei l' purgeestensione per questo:

hg pull
hg update -r MY_BRANCH -C
hg purge

In ogni caso, non esiste un solo comando a cui puoi chiedere a Mercurial di eseguire ciò che farà tutto ciò che desideri qui, tranne se cambi il processo in quel metodo "clone completo" che dici di non poter fare.


6
Grazie, era l '"eliminazione" di cui avevo bisogno. L'aggiornamento -C non elimina i file non monitorati, che è la cosa principale con cui stavo lottando.
Rory

4
Puoi anche usare TortoiseHg per eliminare. Devi solo attivare l'estensione nelle impostazioni del workbench (o modificare mercurial.ini).
Dave

18
Se l'estensione di eliminazione non è attivata, è anche possibile utilizzare il comando in questo modo: hg --config "extensions.purge=" purge --all
Samuel Delisle

6
@ csharptest.net hg purge --allmi ha dato un bel mal di testa, dato che ha anche cancellato le mie configurazioni locali, ovvero: utente / password del database ecc. :)
VMC,

@SamuelDelisle grazie bravo signore, non volevo apportare modifiche alla configurazione solo per questo comando una tantum nella mia sceneggiatura!
joonas.fi,

113
hg up -C

Ciò rimuoverà tutte le modifiche e aggiornerà all'ultima testina nel ramo corrente.

E puoi attivare l' estensione di eliminazione per poter rimuovere anche tutti i file non controllati.


Questo include file non tracciati? Ho avuto dei problemi con quelli in altri comandi che stavo provando. Ci proverò ora ...
Rory,

7
@Rory: no, hg purgeè per file senza versione.
zerkms,

10

Per eliminare senza tracciare * nix senza l'estensione di eliminazione che è possibile utilizzare

hg pull
hg update -r MY_BRANCH -C
hg status -un|xargs rm

Quale sta usando

update -r --rev REV review

update -C --clean elimina le modifiche non confermate (nessun backup)

status -u - sconosciuto mostra solo i file sconosciuti (non tracciati)

status -n --no-status nasconde il prefisso di stato


4

Se stai cercando un metodo facile , allora potresti provare questo.

Io stesso non riesco a ricordare le linee di comando per tutti i miei strumenti, quindi tendo a farlo usando l'interfaccia utente:


1. Innanzitutto, seleziona "commit"

Commettere

2. Quindi, visualizzare i file ignorati. Se hai delle modifiche non confermate, nascondile.

Mostra file ignorati

3. Ora, selezionali tutti e fai clic su "Elimina senzaversi".

Eliminali

Fatto. È una procedura che è molto più facile da ricordare delle cose da riga di comando.


Non sono sicuro (io uso SourceTree da solo), ma questi screenshot sembrano provenire da TortoiseHg Workbench. In generale, penso che le soluzioni basate sull'interfaccia utente siano utili, ma questa risposta richiede una migliore etichettatura. Inoltre, "nasconderli" mi sembra un po 'vago.
Jon Coombs,

3

hg status ti mostrerà tutti i nuovi file, e quindi potrai semplicemente rm .

Normalmente voglio sbarazzarmi di file ignorati e non controllati, quindi:

hg status -iu                          # to show 
hg status -iun0 | xargs -r0 rm         # to destroy

E poi seguilo con:

hg update -C -r xxxxx

che mette tutti i file con versione nello stato giusto per la revisione xxxx


Per seguire la tradizione Stack Overflow di dirti che non vuoi farlo, trovo spesso che questa "Opzione nucleare" abbia distrutto cose a cui tengo.

Il modo giusto per farlo è quello di avere un'opzione 'make clean' nel tuo processo di compilazione, e forse anche un 'rendere davvero pulito' e 'rendere distinto'.

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.