2010-04-21 15 views
51

C'è un modo in mercurial 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.Mercurial Rimuovi cronologia

+0

Quali file sono grandi? – tonfa

+1

Com'è diventato così grande per cominciare? – Santa

+12

Se Jake ha dei file binari (che a volte sono necessari ... non tutti i file binari sono generati dal sorgente), quindi ogni piccola modifica a quel file si traduce in una nuova copia fatta nel repository. A seconda delle dimensioni del file o della frequenza delle modifiche, qualcosa come 60 GB potrebbe non richiedere molto tempo. – bobpaul

risposta

27

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 in modo univoco 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 natura) 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 dovrete fare un po 'di lavoro per gestire i changeset di unione, ma questa è l'idea generale.

Uno potrebbe anche farlo utilizzando hg convert con tipo hg come entrambi i tipi di origine e destinazione e utilizzando un splicemap, ma questo è probabilmente ancora più coinvolto.

La domanda più grande è, come si digita 60 GB di codice sorgente o si stavano aggiungendo file generati contro ogni consiglio. :)

+0

Risposta molto più dettagliata della mia risposta (cancellata). +1 – VonC

+0

Sto importando da un altro sistema di controllo sorgente un progetto che include binari generati. Stiamo cercando di estrarre le DLL dal controllo del codice sorgente in questo momento. Grazie per l'aiuto! –

+2

La risposta contiene un errore di battitura. Il nome del file deve contenere minuscolo% r (numeri con riempimento a zero), altrimenti i file non verranno elaborati nell'ordine corretto al momento dell'importazione. – Gili

44

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

È possibile però "convertire" il tuo repo Mercurial per un nuovo repo Mercurial e scegli una revisione, da dove per includere la storia in poi tramite l'opzione convert.hg.startrev

hg convert --config convert.hg.startrev=1234 <source-repository> <new-repository-name> 

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

Avvertenza: Il nuovo repository avrà ID di changeset completamente nuovi, vale a dire che 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 utilizzato per ripulire i vecchi repository utilizzati internamente all'interno della nostra azienda, combinato con l'opzione --filemap per rimuovere anche i file indesiderati.

+0

Quindi, in che modo questa soluzione è diversa dalla semplice rimozione della sottodirectory .hg/e facendo hg dentro? – grzaks

+0

Siamo spiacenti, non capisco il tuo commento. Che cosa hanno a che fare la directory locale .hg e una hg init con la rimozione dei changeset da un repository? –

+4

@Gaks, il tuo approccio distrugge l'intero repository e ne crea uno nuovo, l'approccio di Gerd distrugge selettivamente il repository da una certa revisione. Entrambi gli approcci sono utili a seconda delle circostanze. L'approccio di Gerd mi è utile in questo momento mentre sto per rendere pubblico un repository privato e voglio mantenere le revisioni dell'ultimo mese, ma non prima di questo. – lsh

Problemi correlati