2012-12-07 1 views
6

Il testo della guida di Mercurial dice che "il comando striscia rimuove i changeset specificati e tutti i loro discendenti". Mi sembra molto simile alla riscrittura della cronologia e questo deve causare problemi se qualcuno ha basato il suo lavoro su uno dei changeset che viene rimosso improvvisamente. Ma il testo della guida dice anche che il comando "non è un'operazione di riscrittura della cronologia e può essere utilizzato sui changeset nella fase pubblica". Sono sicuro che la persona che ha scritto il testo di aiuto sapeva molto bene cosa stava facendo, quindi cosa mi manca per capire questo?Perché il comando di striscia di Mercurial non riscrive la cronologia?

risposta

1

Non posso dirlo con certezza, ma la mia ipotesi è che sia "grandfathered in". hg strip iniziato come parte di mq che precede l'aggiunta di fasi di almeno tre anni.

probabilmente migliore fraseggio sarebbe:

non è * considerata * un'operazione storia riscrittura e può essere utilizzato su gruppi di modifiche in fase di pubblico

Quando le fasi sono state aggiunte una quantità enorme di è stata presa cura di rompere il flusso di lavoro di nessuno. I commit iniziano nella fase di e diventano pubblico una volta inseriti. Qualsiasi comando consapevole della fase sa che dopo aver premuto la fase di commit è pubblico e non consentire la modifica se questo (a meno che la spinta fosse verso un repository non di pubblicazione ...).

Tuttavia, alcuni utenti utilizzavano già lo strip manualmente e negli script per rimuovere i changeset che erano stati inseriti, e se strip dopo un aggiornamento improvvisamente ha detto "Ehi, non si può escludere che sia pubblico!" allora quelle persone avrebbero avuto la loro promessa di compatibilità all'indietro spezzata.

Le fasi stanno lentamente crescendo in un sorprendente sistema evolve che sarà una scelta molto migliore di mq per quasi tutti i casi, ma dubito che otterremo mai Matt per rimuovere mq e strip - egli insiste ancora sul mantenimento una base di codice compatibile con Python 2.4 e che ha 9 anni!

Tl; Dr: Anche se strip era sempre un'estensione disattivata, troppe persone lo usano per cambiare il suo comportamento con l'avvento delle fasi.

+0

Grazie Ry4an. Apprezzo la correzione e la spiegazione. –

+1

Questo significa che 'strip' non _remove_ i pacchetti, ma solo _ li nasconde? Stavo cercando un modo per eliminare dal 100% i commit di _remove_ minor prima della pubblicazione.Questo è sicuro e una funzionalità molto importante, perché come sviluppatore dovresti fare spesso commit locali (questo è uno dei vantaggi di un DVCS, non è vero?), E unire un changeset "one commit per feature" nel master branch (questo è il modo in cui appaiono tutti i rami master, ad esempio quelli di Python, Sphinx ect.). C'è un modo per ottenerlo in modo chiaro con Mercurial usando "Phase"? – Iodnas

+0

Strip ** rimuove ** loro. Il mio punto era che lo fa al di fuori dei confini del sistema fasi perché lo precede di 3 anni. –

7

Il punto chiave è che se si spoglia un changeset pubblico e lo si tira di nuovo da qualche parte, non si sono verificati problemi. Hai appena ripristinato il changeset originale.

Se, ad esempio, si comprime due changeset pubblici e si estrae l'originale da qualche parte, ora si hanno due rami. Uno con i due changeset originali e uno con il changeset compresso, ma entrambi hanno le stesse modifiche. A quel punto si scatena l'inferno e il bambino che mangia i mostri si aggira per la terra.

Quindi la "riscrittura della storia" non è la stessa di "rimozione della cronologia".


davidmc24 rilevare this post da Matt Mackall (il padre di Mercurial) in cui dice fondamentalmente la stessa cosa

+0

Amo il bambino che mangia i mostri. –