¿El Mercurial .hgignore es mi única opción para manejar cientos de files temporales generados durante la compilation?

He estado en todas partes de Google y TAMBIÉN busco a alguien que haya hecho esta pregunta, pero estoy llegando completamente vacío. Me disculparé por adelantado por la forma larga y prolongada de hacer la pregunta. (Si fuera capaz de descifrar cómo encapsular el problema, tal vez habría tenido éxito en encontrar una respuesta).

¿Cómo se gestionan los grandes proyectos en Mercurial, cuando el acto de build / comstackr genera cientos de files temporales para crear el resultado final? ¿Es .hgignore la única respuesta?

Ejemplo de escenario:

Tiene un proyecto que desea usar algún package de código abierto para alguna característica y necesita comstackr desde el origen. Así que ve a search el package. quítelo y colóquelo en su propio repository de Mercurial para que pueda comenzar a rastrear los cambios. Luego haces todos los cambios y ejecutas una compilation.

Usted testing su resultado final, está contento con los resultados y está listo para comprometerse con su clon local del repository. Así que haces un hg status para verificar tus cambios antes de comprometerte. Los resultados de hg status te hacen comenzar inmediatamente a usar todas esas palabras que avergonzarían a tu madre, porque ahora tienes pantallas y pantallas de "build cruxt".

Por el bien del argumento, este package es MySQL o Apache: algo que

  1. no controlas y cambiarás regularmente,
  2. deja una gran cantidad de rests en muchos lugares, y
  3. no hay garantía de que el cruft no cambie cada vez que obtenga una nueva versión de la fuente externa.

¿Wow Qué? El proyecto particular que causa esta angustia va a ser desarrollado por múltiples desarrolladores en múltiples ubicaciones físicas, por lo que debe ser lo más sencillo posible. Si hay demasiado involucrado, no lo harán, y tendremos un problema mayor en nuestras manos. (Lamentablemente, algunos perros viejos no están dispuestos a aprender nuevos trucos …)

Una solución propuesta era que tendrían que comprometer todo localmente antes de hacer una marca, para que tengan una "borrón y count nueva" de la que tendrían que clonar para hacer la construcción. Eso fue derribado como (a) demasiados pasos, y (b) no querer descomponer la historia con un grupo de sets de cambios "time para build ahora".

Alguien más ha propuesto que todo el rest se confíe en el repository de Mercurial. Estoy totalmente en contra de eso porque la próxima vez que aparezcan esos files aparecerán como "modificados" y, por lo tanto, se includeán en la list de files del set de cambios.

No es posible que seamos las únicas personas que se han encontrado con este problema. Entonces, ¿cuál es la solución "correcta"? ¿Es nuestro único recurso intentar crear un file .hginore masivamente inteligente? Esto me inquieta, porque si le digo a Mercurial que "ignore todo lo que hay en este directory del que no te he hablado", ¿qué sucederá si el siguiente parche aplicado agrega files a ese directory ignorado? (Mercurial nunca verá ese file nuevo, ¿verdad?)

Espero que esta no sea una pregunta completamente estúpida con una respuesta obvia. He comstackdo cosas de la fuente muchas veces antes, pero nunca he tenido que aplicar control de versiones además de eso. Además, somos nuevos en Mercurial.

Dos opciones:

  1. La mejor opción es hacer una construcción fuera de tree, si puedes. Esta es una compilation en la que coloca los files de object fuera del tree de origen. Algunos sistemas de compilation, como CMake , lo admiten directamente. Para otros sistemas, debe tener suerte ya que el proyecto original debe tener soporte adicional para esto en su Makefile o similar.

  2. Una opción más general es decirle a Mercurial que ignore types específicos de files , no directorys completos. Esto funciona bien en mi experiencia.

Para probar la segunda opción, quería comstackr Apache. Sin embargo, requiere APR, así que probé con eso en su lugar. Después de registrar una apr-1.3.8.tar.bz2 limpia apr-1.3.8.tar.bz2 lo hice ./configure; make ./configure; make y mirar la salida del hg status de hg status . Las primeras pattens fueron fáciles:

 syntax: glob

 * ~
 * .o
 * .lo
 *.la
 *.asi que
 .libs / *

Los files nuevos restantes parecen files específicos generados por el process de compilation. Es fácil agregarlos también:

 % hg status --unknown --no-status >> .hgignore

Eso también agregó .hgignore ya que aún no lo había progtwigdo para .hgignore . Eliminando eso terminé con este file .hgignore :

 syntax: glob

 * ~
 * .o
 * .lo
 *.la
 *.asi que
 .libs / *
 .make.dirs
 Makefile
 apr-1-config
 apr-config.out
 apr.exp
 apr.pc
 build / apr_rules.mk
 build / apr_rules.out
 build / pkg / pkginfo
 config.log
 config.nice
 config.status
 export_vars.c
 exports.c
 include / apr.h
 include / arch / unix / apr_private.h
 libtool
 testing / Makefile
 testing / interno / Makefile

Considero que esto es una forma bastante sólida de hacerlo en Mercurial o en cualquier otro sistema de control de revisión para el caso.

La mejor solución sería arreglar el process de compilation para que se comporte de una manera "agradable", es decir, permitiéndole especificar un directory separado para almacenar files intermedios (que luego podría ignorarse por completo a través de una input .hgignore muy simple. .. o ni siquiera dentro de la estructura de directorys controlada por versión.

Por lo que vale, he descubierto que en esta situación, un .hgignore inteligente es la única solución que me ha funcionado hasta ahora. Con la inclusión del soporte de expresiones regulares, es muy poderoso, pero también complicado, ya que un patrón que es cruzado en un directory puede ser fuente en otro.

Al less puedes registrar el .hgignore y compartirlo con tus desarrolladores. De esa manera, el trabajo solo se realiza una vez.

[Editar] Al less, sin embargo, es posible, como señaló Martin Geisler anteriormente, tener especificaciones de ruta completas en su file .hgignore; puede, por lo tanto, tener test/Makefile en .hgignore y aún tener Mercurial note un nuevo test2/Makefile

Su process para crear el file debería darle casi lo que desea, y puede sintonizarlo desde allí.

Una opción que tiene es limpiar su directory de trabajo después de verificar una compilation.

 make clean hg status 

Por supuesto, puede que no quieras limpiar tu proyecto si lleva más de unos minutos buildlo.

Si los files que desea rastrear ya son conocidos por hg, puede hgignorar todo. Luego debe usar la hg import para agregar el parche, y no solo usar el command de patch (ya que hg necesita saber si se deben rastrear algunos files nuevos).

¿Qué tal un script shell (o lo que sea) que recorre el directory de compilation recursivamente, encuentra todos los files creados después de que se haya iniciado su process de compilation y mueve todos estos files (por supuesto, puede especificar las excepciones) a un subdirectory cruft_dir . Luego puedes poner cruft_dir/* en .hgignorar.

EDITAR: Olvidé agregar, pero esto es bastante obvio, que este script de shell se ejecuta automáticamente tan pronto como termina su construcción. Tal vez incluso se llame como el último command en tu file Makefile / ant / whatever.