47 votes

Existe-t-il un moyen de supprimer l'historique d'un seul fichier dans Mercurial?

Je pense que je connais déjà la réponse à cette question mais 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 ainsi que son historique des modifications sans supprimer l'ensemble du référentiel?

58voto

Martin Geisler Points 44779

Il est vrai que vous ne pouvez pas supprimer facilement un fichier particulier à partir de Mercurial, dans le sens que cela va perturber tout l'ensemble de modifications Id dans votre référentiel. Lorsque vous modifiez l'Id de révision, tout le monde a re-cloner le dépôt. Voir la page Wiki sur l'édition de l'histoire pour plus d'informations sur les conséquences de la modification de l'histoire de Mercurial.

Si c'est ok pour vous (référentiel interne dans une entreprise), alors jetez un oeil à les convertir extension. Il peut faire hg → hg conversions et a un --filemap argument qui peut être utilisé pour exclure des fichiers, entre autres choses.

22voto

NicDumZ Points 5566

Non, vous ne pouvez pas. Lisez les changements qui devraient avoir jamais été la section de l'mercurial rouge livre à ce sujet; et, particulièrement, les ce au sujet des changements sensibles qui échappent paragraphe, qui contient ce paragraphe:

Mercurial également ne pas fournir 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 pour ignorer de telles directives. En outre, même si Mercurial condition d'un tel la capacité, de quelqu'un qui n'avait pas tiré de "rendre ce fichier disparaître" la révision ne serait pas affectée par elle, ni web robots en visite au mauvais temps, les sauvegardes de disque, ou d'autres les mécanismes. En effet, aucune répartie révision du système de contrôle peut rendre les 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 ne fournissant pas du tout.

La façon habituelle de revenir commis des changements est pris en charge par mercurial grâce à l' backout commande (de nouveau, mercurial livre: traiter avec les commis des changements), mais l'information ne disparaît pas du référentiel: puisque vous ne savez jamais exactement qui cloné de votre dépôt, qui pourrait donner un faux sentiment de sécurité, comme expliqué ci-dessus.

7voto

eswald Points 3784

Il est possible localement, mais pas à l'échelle mondiale, et il change l'ID de chaque commit après le point à partir duquel le fichier a été ajouté. Pour que le changement de bâton, vous aurez besoin d'accéder à chaque copie du dépôt, en particulier celui qui a tiré ou poussé à partir.

Cela dit, j'ai suivi l' Édition de l'Histoire de la séquence décrite sur l'Mercurial wiki pour supprimer un fichier de l'un de mes dépôts. Cette séquence suppose que la révision 1301:5200a5a10d8b ajouté le fichier path/to/badfile.cfg, ce qui n'a pas été modifié pour la suite de la révision:

  1. Activer la MQ extension dans votre .hgrc:

    [extensions]
    mq =
    
  2. Tirez sur les changements récents de l'amont.

    hg pull
    
  3. Tout importer à partir du fichier de plus de correspondance en MQ:

    hg qimport -r 1301:tip
    hg qpop -a
    
  4. Supprimer le fichier à partir de la validation qui l'a ajouté.

    hg qpush 1301.diff
    hg forget path/to/badfile.cfg
    hg qrefresh
    
  5. Convertir les patchs en nouvelle Mercurial révisions.

    hg qpush -a
    hg qfinish -a
    
  6. Poussez le nouveau révisions en amont.

    hg push -f
    
  7. Sur l'amont du référentiel et tous les autres de copier, de supprimer les anciennes révisions.

    hg strip 5200a5a10d8b
    

Avertissement: Cette étape peut détruire le travail, sauf si vous êtes prudent. Si quelqu'un a commis quelque chose depuis la dernière fois que vous avez tiré de l'amont, alors vous aurez à rebase que le travail avant de se dénuder. Malheureusement, l' rebase extension n'est pas utile ici; vous devrez utiliser MQ encore une fois, la conversion de la nouvelle s'engage dans des correctifs que vous appliquez sur la nouvelle astuce.

Bonne chance.

-2voto

evilbloodydemon Points 520

greffe de hg, puis bande de hg

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X