Pregunta

Creo que ya sé la respuesta a esto, pero pensé en preguntar de todos modos:

Tenemos un archivo que se agregó a un repositorio de Mercurial con información confidencial. ¿Hay alguna forma de eliminar ese archivo junto con su historial de cambios sin eliminar todo el repositorio?

¿Fue útil?

Solución

No, no puedes. Lea los cambios que deberían tener nunca ha sido la sección del libro rojo mercurial al respecto; y particularmente el ¿qué pasa con los cambios sensibles que escapan subsección, que contiene este párrafo:

  

Mercurial tampoco proporciona una manera   hacer un archivo o conjunto de cambios completamente   desaparecer de la historia, porque hay   no hay forma de hacer cumplir su   desaparición; alguien podría fácilmente   modificar su copia de Mercurial a   ignorar tales directivas. Adicionalmente,   incluso si Mercurial proporcionara tal   capacidad, alguien que simplemente no tenía   sacó un "hacer que este archivo desaparezca"   changeset no se vería afectado por ello,   ni los rastreadores web que visitan el   hora incorrecta, copias de seguridad del disco u otro   mecanismos. De hecho, no distribuido   sistema de control de revisión puede hacer datos   desaparecer de manera confiable. Proporcionando el   la ilusión de tal control podría fácilmente   dar una falsa sensación de seguridad y ser   peor que no proporcionarlo en absoluto.

Mercurial admite la forma habitual de revertir los cambios confirmados mediante el comando backout (de nuevo, mercurial book: manejo de cambios comprometidos ) pero la información no desaparece del repositorio: ya que nunca se sabe exactamente quién clonado su repositorio, eso daría una falsa sensación de seguridad, como se explicó anteriormente.

Otros consejos

Es correcto que no pueda eliminar fácilmente un archivo en particular de Mercurial en el sentido de que hacerlo alterará todas las ID de conjunto de cambios en su repositorio. Cuando cambia las ID del conjunto de cambios, todos tienen que volver a clonar el repositorio. Consulte la página Wiki sobre la edición del historial para obtener información sobre las consecuencias de modificar el historial en Mercurial.

Si le parece bien (repositorio interno en una empresa), eche un vistazo a convertir extensión . Puede hacer hg & # 8594; hg y tiene un argumento --filemap que puede usarse para excluir archivos, entre otras cosas.

Es posible localmente, pero no globalmente, y cambia la ID de cada confirmación después del punto en el que se agregó el archivo. Para que el cambio se mantenga, necesitará acceso a todas las copias del repositorio, en particular las que se extraen o empujan.

Dicho esto, he seguido la secuencia Edición del historial descrita en el wiki de Mercurial para eliminar un archivo de uno de mis repositorios. Esta secuencia supone que la revisión 1301: 5200a5a10d8b agregó el archivo ruta / a / badfile.cfg , que no se modificó en ninguna revisión posterior:

  1. Habilite la extensión MQ en su .hgrc :

    [extensions]
    mq =
    
  2. Extraiga los cambios recientes de aguas arriba.

    hg pull
    
  3. Importa todo desde la adición del archivo en adelante en MQ:

    hg qimport -r 1301:tip
    hg qpop -a
    
  4. Elimine el archivo del commit que lo agregó.

    hg qpush 1301.diff
    hg forget path/to/badfile.cfg
    hg qrefresh
    
  5. Convierta los parches en nuevas revisiones de Mercurial.

    hg qpush -a
    hg qfinish -a
    
  6. Empuje las nuevas revisiones hacia arriba.

    hg push -f
    
  7. En el repositorio ascendente y todas las demás copias, elimine las revisiones anteriores.

    hg strip 5200a5a10d8b
    

Advertencia : este paso puede destruir el trabajo, a menos que tenga cuidado. Si alguien ha cometido algo desde la última vez que se retiró de aguas arriba, tendrá que modificar ese trabajo antes de eliminarlo. Desafortunadamente, la extensión rebase no es útil aquí; tendrás que usar MQ nuevamente, convirtiendo las nuevas confirmaciones en parches que apliques en la nueva sugerencia.

Buena suerte.

Se puede hacer en menos de 10 min. en un solo repositorio, aunque hay consecuencias.

Cómo: use hg convert como se describe en esta excelente guía . Básicamente, usted '' convierte '' un repositorio de Hg en un nuevo repositorio de Hg, pero puede especificar una lista de archivos para excluir durante la conversión. Este es un extracto de los pasos clave:

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 cuanto a las consecuencias ...

  • todas las ID de conjunto de cambios después de que se agregaron los archivos que desea excluir serán diferentes
  • el nuevo " limpio " el repositorio principal deberá colocarse manualmente en lugar del existente
  • todos los miembros del equipo tendrán que hacer nuevos clones del repositorio principal
  • cualquier otro servicio que se integre con Hg puede requerir atención (por ejemplo, el rastreador de problemas, un sistema de revisión de código, etc.)

trasplante de hg, luego tira de hg

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top