Question

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

Nous avons ajouté un fichier à un référentiel Mercurial contenant 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?

Était-ce utile?

La solution

Non, vous ne pouvez pas. Lisez les modifications qui devraient avoir jamais été dans le livre rouge Mercurial à ce sujet; et en particulier le Qu'en est-il des changements sensibles qui échappent , qui contient ce paragraphe:

  

Mercurial ne fournit pas non plus de solution   faire un fichier ou un changeset complètement   disparaître de l'histoire, car il   est aucun moyen de faire respecter son   disparition; quelqu'un pourrait facilement   modifier leur copie de Mercurial à   ignorer de telles directives. En outre,   même si Mercurial fournissait 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 les robots sur le Web en visite à la   mauvais moment, sauvegardes de disque ou autre   mécanismes. En effet, pas distribué   système de contrôle de révision peut rendre les données   disparaître de manière fiable. Fournissant le   l'illusion d'un tel contrôle pourrait facilement   donner un faux sentiment de sécurité et être   pire que de ne pas le fournir du tout.

La méthode habituelle pour annuler les modifications validées est prise en charge par mercurial à l'aide de la commande backout (encore une fois, mercurial book: traiter les modifications validées ) mais les informations ne disparaissent pas du référentiel: vous ne savez jamais qui exactement. cloné votre référentiel, ce qui donnerait un faux sentiment de sécurité, comme expliqué ci-dessus.

Autres conseils

Il est exact que vous ne pouvez pas facilement supprimer un fichier particulier de Mercurial car cela perturbera tous les ID de jeu de modifications de votre référentiel. Lorsque vous modifiez les ID de jeu de modifications, tout le monde doit re-cloner le référentiel. Consultez la page Wiki sur la modification de l'historique pour obtenir des informations sur les conséquences de la modification de l'historique dans Mercurial.

Si cela vous convient (référentiel interne dans une entreprise), consultez le convertir l'extension . Il peut effectuer des conversions hg ? hg et possède un argument - filemap qui peut être utilisé pour exclure , entre autres choses.

Cela est possible localement, mais pas globalement, et cela change l'ID de chaque commit après le moment où le fichier a été ajouté. Pour que la modification soit respectée, vous devez avoir accès à chaque copie du référentiel, en particulier à celles qui sont extraites ou forcées.

Cela dit, j'ai suivi la séquence Modification de l'historique décrite sur le wiki Mercurial. supprimer un fichier de l’un de mes référentiels. Cette séquence suppose que la révision 1301: 5200a5a10d8b a ajouté le fichier chemin / à / badfile.cfg , qui n'a été modifié dans aucune révision ultérieure:

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

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

    hg pull
    
  3. Importez tout dans l'ajout du fichier dans MQ:

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

    hg qpush 1301.diff
    hg forget path/to/badfile.cfg
    hg qrefresh
    
  5. Convertissez les correctifs en nouvelles versions de Mercurial.

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

    hg push -f
    
  7. Sur le référentiel en amont et sur chaque copie, supprimez les anciennes révisions.

    hg strip 5200a5a10d8b
    

Avertissement : cette étape peut détruire le travail, à moins que vous ne soyez prudent. Si quelqu'un a commis quelque chose depuis la dernière fois que vous vous êtes retiré de l'amont, vous devrez alors rebaser ce travail avant de vous déshabiller. Malheureusement, l'extension rebase n'est pas utile ici; vous devrez à nouveau utiliser MQ pour convertir les nouveaux commits en correctifs que vous appliquerez sur le nouveau conseil.

Bonne chance.

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

Comment: utilisez hg convert comme décrit dans cet excellent guide . En gros, vous "convertissez" un référentiel Hg dans un nouveau référentiel 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

En ce qui concerne les conséquences ...

  • tous les identifiants de groupes de modifications après l'ajout des fichiers à exclure seront différents
  • le nouveau " nettoyer " le dépôt principal devra être mis manuellement à la place de celui existant
  • tous les membres de l'équipe devront créer de nouveaux clones du rapport principal
  • tout autre service pouvant s’intégrer à Hg peut requérir une attention particulière (par exemple, le suivi des problèmes, un système de révision de code, etc.)

greffe de mercure, puis bande de mercure

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top