Domanda

Penso di conoscere già la risposta a questa domanda, ma ho pensato di chiedere comunque:

Abbiamo un file che è stato aggiunto a un repository Mercurial con informazioni sensibili al suo interno. Esiste un modo per rimuovere quel file insieme alla cronologia delle modifiche senza rimuovere l'intero repository?

È stato utile?

Soluzione

No, non puoi. Leggi le le modifiche che dovrebbero avere mai stato la sezione del mercuriale libro rosso a riguardo; e in particolare il che dire dei cambiamenti sensibili che sfuggono , che contiene questo paragrafo:

  

Mercurial inoltre non fornisce un modo   per creare un file o un changeset completamente   scompare dalla storia, perché lì   non c'è modo di far valere la propria   scomparsa; qualcuno potrebbe facilmente   modificare la loro copia di Mercurial in   ignorare tali direttive. Inoltre,   anche se Mercurial ha fornito tale a   capacità, qualcuno che semplicemente non l'aveva fatto   ha tirato un "fai sparire questo file"   il changeset non ne risentirebbe,   né i web crawler visitano il   momento sbagliato, backup del disco o altro   meccanismi. Anzi, non distribuito   il sistema di controllo di revisione può creare dati   svanire in modo affidabile. Fornire il   l'illusione di tale controllo potrebbe facilmente   dare un falso senso di sicurezza ed essere   peggio che non fornirlo affatto.

Il solito modo per ripristinare le modifiche impegnate è supportato da mercurial tramite il comando backout (di nuovo, mercurial book: gestione delle modifiche apportate ) ma le informazioni non scompaiono dal repository: poiché non si sa mai chi esattamente clonato il tuo repository, ciò darebbe un falso senso di sicurezza, come spiegato sopra.

Altri suggerimenti

È corretto che non è possibile rimuovere facilmente un determinato file da Mercurial, nel senso che farlo interromperà tutti gli ID di changeset nel proprio repository. Quando si modificano gli ID del changeset, tutti devono ripetere la clonazione del repository. Consulta la pagina Wiki sulla modifica della cronologia per informazioni sulle conseguenze della modifica della cronologia in Mercurial.

Se per te va bene (repository interno in un'azienda), dai un'occhiata al converti estensione . Può fare hg & # 8594; hg conversioni e ha un argomento --filemap che può essere utilizzato per escludere i file, tra le altre cose.

È possibile localmente, ma non globalmente, e cambia l'ID di ciascun commit dopo il punto in cui è stato aggiunto il file. Affinché la modifica si attacchi, dovrai accedere a ogni singola copia del repository, in particolare a quelle che vengono estratte o spinte.

Detto questo, ho seguito la sequenza Storia dell'editor descritta nel wiki Mercurial per rimuovere un file da uno dei miei repository. Questa sequenza presuppone che la revisione 1301: 5200a5a10d8b abbia aggiunto il file path / to / badfile.cfg , che non è stato modificato in nessuna revisione successiva:

  1. Abilita l'estensione MQ nel tuo .hgrc :

    [extensions]
    mq =
    
  2. Estrai le modifiche recenti dall'upstream.

    hg pull
    
  3. Importa tutto dall'aggiunta di file in poi in MQ:

    hg qimport -r 1301:tip
    hg qpop -a
    
  4. Rimuovi il file dal commit che lo ha aggiunto.

    hg qpush 1301.diff
    hg forget path/to/badfile.cfg
    hg qrefresh
    
  5. Converti le patch in nuove revisioni Mercurial.

    hg qpush -a
    hg qfinish -a
    
  6. Sposta le nuove revisioni a monte.

    hg push -f
    
  7. Nel repository a monte e ogni altra copia, rimuovi le vecchie revisioni.

    hg strip 5200a5a10d8b
    

Avviso : questo passaggio potrebbe distruggere il lavoro, a meno che tu non stia attento. Se qualcuno ha commesso qualcosa dall'ultima volta che hai estratto da monte, dovrai rifare il lavoro prima di mettere a nudo. Sfortunatamente, l'estensione rebase non è utile qui; dovrai usare nuovamente MQ, convertendo i nuovi commit in patch che applichi al nuovo suggerimento.

Buona fortuna.

Può essere eseguito in meno di 10 minuti. in un unico repository, anche se ci sono conseguenze.

Come: utilizzare hg convert come descritto in questa eccellente guida . Fondamentalmente, tu " converti " un repository Hg in un nuovo repository Hg, ma è possibile specificare un elenco di file da escludere durante la conversione. Questo è un estratto dei passaggi chiave:

Make sure all your teammates have pushed their local changes to the central repo (if any)
Backup your repository
Create a "map.txt" file:

# this filemap is used to exclude specific files
exclude "subdir/filename1.ext"
exclude "subdir/filename2.ext"
exclude "subdir2"

Run this command:
hg convert --filemap map.txt c:/oldrepo c:/newrepo
NOTE: You have to use "forward-slash" in paths, even on windows.
Wait and be patient
Now you have a new repo at c:\newrepo but without the files

Per quanto riguarda le conseguenze ...

  • tutti gli ID di changeset dopo l'aggiunta dei file che si desidera escludere saranno diversi
  • il nuovo " clean " il repository principale dovrà essere messo manualmente al posto di quello esistente
  • tutti i membri del team dovranno creare nuovi cloni del repository principale
  • qualsiasi altro servizio che si integri con Hg potrebbe richiedere attenzione (ad esempio il tracker dei problemi, un sistema di revisione del codice ecc.)

hg trapianto, quindi hg strip

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top