Mercurial Rimuovi cronologia

C’è un modo in mercuriale per rimuovere i vecchi changeset da un database? Ho un repository di 60 GB e questo rende piuttosto doloroso fare un clone. Vorrei tagliare tutto prima di una certa data e mettere via l’enorme database per raccogliere la polvere.

Puoi farlo, ma così facendo invalidi tutti i cloni là fuori, quindi generalmente non è saggio farlo a meno che tu non stia lavorando interamente da solo.

Ogni changeset in mercurial è identificato univocamente da un hashcode, che è una combinazione di (tra le altre cose) le modifiche al codice sorgente, i metadati e gli hash dei suoi uno o due genitori. Quei genitori devono esistere nel repo fino all’inizio del progetto. (Non avere questa restrizione potrebbe avere cloni superficiali, che non sono disponibili (ancora)).

Se stai bene cambiando gli hash dei nuovi changeset (che di nuovo rompono tutti i cloni là fuori in the wild) puoi farlo con i comandi;

hg export -o 'changeset-%R.patch' 400:tip # changesets 400 through the end for example cd /elsewhere hg init newrepo cd newrepo hg import /path/to/the/patches/*.patch 

Probabilmente dovrai fare un po ‘di lavoro per gestire i changeset di unione, ma questa è l’idea generale.

Si potrebbe anche farlo usando hg convert con tipo hg sia come sorgente sia come destinazione e usando una splicemap , ma questo è probabilmente ancora più splicemap .

La domanda più ampia è: come si scrivono 60 GB di codice sorgente o si aggiungono file generati contro ogni consiglio. 🙂

Non esiste un modo semplice / consigliato per farlo direttamente a un repository esistente.

Puoi comunque “convertire” il tuo repo mercuriale in un nuovo repository mercuriale e scegliere una revisione da cui includere la cronologia in poi tramite l’opzione convert.hg.startrev

 hg convert --config convert.hg.startrev=1234   

Il nuovo repository conterrà tutto dal repository originale meno la cronologia precedente alla revisione iniziale.

Avvertenza: il nuovo repository avrà completamente nuovi ID di changeset, cioè non è in alcun modo correlato al repository originale. Dopo aver creato il nuovo repository, ogni sviluppatore deve clonare il nuovo repository ed eliminare i propri cloni dal repository originale.

L’ho usato per ripulire i vecchi repository utilizzati internamente all’interno della nostra azienda – combinato con l’opzione –filemap per rimuovere anche i file indesiderati.