Est-il un moyen de supprimer l'historique d'un fichier unique dans Mercurial?

Je pense que je connais déjà la réponse à cela mais je pensais que je demanderais quand même:

Nous avons un fichier qui a été ajouté à un référentiel Mercurial avec des informations sensibles. Existe-t-il un moyen de supprimer ce fichier avec son historique de modification sans supprimer tout le dépôt?

47
demandé sur Martin Geisler 2009-06-23 01:24:51

5 réponses

Non, vous ne pouvez pas. des changements qui n'auraient jamais dû être section du livre rouge mercurial à ce sujet; et en particulier le qu'en est il des changements sensibles qui s'échappent sous-section, qui contient ce paragraphe:

Mercurial ne fournit pas non plus un moyen pour faire un fichier ou un ensemble de modifications complètement disparaître de l'histoire, car il y aucun moyen de faire valoir ses disparition; quelqu'un pourrait facilement modifier leur copie de Mercurial à ignorez ces directives. Outre, même si Mercurial a fourni un tel capacité, quelqu'un qui n'avait tout simplement pas tiré un " faire disparaître ce fichier" changeset ne serait pas affecté par cela, ni web robots en visite au mauvais moment, sauvegardes de disque ou autre mécanisme. En effet, pas distribué le système de contrôle de révision peut faire des données fiable disparaître. En fournissant les illusion d'un tel contrôle pourrait facilement donner un faux sentiment de sécurité, et être pire que de ne pas le fournir à tout.

La manière habituelle d'annuler les modifications validées est prise en charge par mercurial via la commande backout (encore une fois, Mercurial book: faire face aux changements engagés) mais les informations ne disparaissent pas du référentiel: puisque vous ne savez jamais qui a exactement cloné votre référentiel, cela donnerait un faux sentiment de sécurité, comme expliqué ci-dessus.

22
répondu Nicolas Dumazet 2009-06-23 03:07:47

Il est correct que vous ne pouvez pas facilement supprimer un fichier particulier de Mercurial dans le sens où cela perturbera tous les ID de changeset dans votre référentiel. Lorsque vous modifiez les ID de changeset, tout le monde doit re-cloner le référentiel. Consultez la page Wiki sur l'édition de l'Historique pour plus d'informations sur les conséquences de la modification de L'historique dans Mercurial.

Si cela vous convient (référentiel interne dans une entreprise), jetez un oeil à l'extension convert. Il peut faire hg → hg conversions et a un --filemap argument qui peut être utilisé pour exclure fichiers, entre autres choses.

58
répondu Martin Geisler 2009-06-23 09:09:14

C'est possible localement, mais pas globalement, et il change l'ID de chaque commit après le point auquel le fichier a été ajouté. Pour que le changement s'en tienne, vous aurez besoin d'accéder à chaque copie du référentiel, en particulier celles qui sont extraites ou expulsées.

Cela dit, j'ai suivi la Séquencehistorique D'édition décrite sur le Wiki Mercurial pour supprimer un fichier de l'un de mes dépôts. Cette séquence suppose que la révision 1301: 5200a5a10d8b ajout du fichier path/to/badfile.cfg, qui n'a pas été modifié lors d'une révision ultérieure:

  1. Activez L'extension MQ dans votre .hgrc:

    [extensions]
    mq =
    
  2. Tirer les modifications récentes de l'amont.

    hg pull
    
  3. Importez tout à partir de l'ajout de fichier dans MQ:

    hg qimport -r 1301:tip
    hg qpop -a
    
  4. Supprimez le fichier du commit qui l'a ajouté.

    hg qpush 1301.diff
    hg forget path/to/badfile.cfg
    hg qrefresh
    
  5. Convertissez les correctifs en nouvelles révisions Mercurial.

    hg qpush -a
    hg qfinish -a
    
  6. Pousser les nouvelles révisions en amont.

    hg push -f
    
  7. Sur le référentiel amont et sur toutes les autres copies, supprimez les anciennes révisions.

    hg strip 5200a5a10d8b
    

Avertissement : cette étape peut détruire le travail, à moins que vous soyez prudent. Si quelqu'un a commis quelque chose depuis la dernière fois que vous avez tiré de l'amont, alors vous devrez rebaser ce travail avant de le décaper. Malheureusement, l'extension rebase n'est pas utile ici; vous devrez à nouveau utiliser MQ, en convertissant le nouveaux commits dans les correctifs que vous appliquez sur la nouvelle astuce.

Bonne chance.

7
répondu eswald 2016-06-30 13:56:36

Cela peut être fait en moins de 10 min. dans un seul référentiel, bien qu'il y ait des conséquences.

Comment: utilisez HG convert comme décrit dans cet excellent guide . Fondamentalement, vous "convertissez" un repo Hg en un nouveau repo HG, mais vous devez spécifier une liste de fichiers à exclure lors de la conversion. Voici un extrait des étapes clés:

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

Quant aux conséquences...

  • tous les ID de changeset après l'ajout des fichiers que vous souhaitez exclure seront différents
  • le un nouveau référentiel principal" propre " devra être mis manuellement à la place de l'existant
  • tous les membres de l'équipe devront faire de nouveaux clones du repo principal
  • tous les autres services qui s'intègrent à Hg peuvent nécessiter une attention particulière (par exemple, le suivi des problèmes, un système de révision de code, etc.)
6
répondu Tomislav Nakic-Alfirevic 2015-09-04 10:18:14

Greffe de Hg, puis bande de Hg

-2
répondu evilbloodydemon 2009-06-23 06:30:22