2010-08-24 32 views
13

Entiendo cómo remove an entire changeset del historial, pero no está claro cómo eliminar un subconjunto.Mercurial: Eliminar archivo de todos los conjuntos de cambios

Por ejemplo, ¿cómo elimino todos los archivos DLL de un conjunto de cambios existente mientras dejo solo el código fuente?

+0

¿Existen las DLL en el conjunto de cambios más reciente o en un conjunto de cambios anterior (o conjuntos de cambios)? –

+0

Las DLL existen en un conjunto de cambios anterior – Gili

Respuesta

17

Dado que los ID de revisión (por ejemplo, a8d7641f ...) se basan en un hash del conjunto de cambios, en realidad no es posible eliminar un subconjunto de un conjunto de cambios del historial.

Sin embargo, es posible crear un nuevo repositorio con un historial paralelo, excepto por un cierto conjunto de archivos, mediante la extensión Convert. Va a convertir un repo de Mercurial en un repo de Mercurial, utilizando el mapa de archivos para excluir los archivos que no desea al agregar exclude s. Esto creará un repositorio nuevo, no relacionado, lo que significa que los clones que las personas tengan ya no podrán extraer de él, y tendrán que volver a clonar desde este nuevo repositorio.

+0

¿No hay otra manera? Digamos que estás en un equipo de 100 personas. Alguien revisa accidentalmente el material con derechos de autor. O tal vez revisen algunos datos del usuario por error como parte de una prueba. Pedirle a todos los desarrolladores que vuelvan a clonar parece una no arranca pero necesita deshacerse de los datos. ¿No hay otra opción? – gman

+1

No. Con un equipo tan grande, uno esperaría que haya algún tipo de proceso de revisión involucrado. – Ringding

13
  1. Asegúrese de que todos sus compañeros de equipo han empujado a sus cambios locales al repositorio central de (si lo hay)
  2. copia de seguridad de su repositorio
  3. Crear un archivo "MAP.TXT" con el siguiente contenido:
    # this filemap is used to exclude specific files 
    exclude "subdir/filename1.ext" 
    exclude "subdir/filename2.ext" 
    exclude "subdir2"
  4. Ejecute este comando:
    hg convert --filemap map.txt c:/oldrepo c:/newrepo
    NOTA: Debe usar "barra diagonal" en las rutas, incluso en Windows.
  5. Esperar y ser paciente
  6. Ahora usted tiene una nueva operación en c:\newrepo pero sin los archivos

PS. En el repositorio "superior" debe eliminar todos los conjuntos de cambios y volver a presionar su nuevo repositorio.

PPS. De hecho, escribí un blog post acerca de esto que tiene más detalles (incluida la eliminación del changeest en Bitbucket, etc.

+2

A medida que se agregan nuevos miembros del equipo, sospecho que probablemente haremos esto una vez al año para mantener el repositorio de todos los commit de novatos. –

+0

Mi cofundador ha comprometido accidentalmente toda la biblioteca de PhoneGap en el repositorio (18 megabytes), así que tuve que aprender esto de la manera difícil, jeje – Alex

+0

¿Qué tal si se excluyen todos los archivos de cierto tipo? Intenté '" exclude * .bak "' excluir todos los archivos de copia de seguridad de todos los commits (olvidé incluirlos en .hgignore), no funcionó. –

Cuestiones relacionadas