¿Cómo puedo almacenar en caché archivos sin seguimiento (binarios) asociados a una rama?

Supongamos que soy uno de los muchos desarrolladores que trabajan con git en un gran proyecto de código, que tiene un tiempo de compilación increíblemente largo.

Ahora, mis cambios personales diarios suelen ser limitados y la base de código es bastante modular, lo que significa que, en lo que respecta a mi del uso el trabajo se refiere, compilar desde cero es un precio que solo hay que pagar una vez. Después, puedo recompilar solo los módulos que modifiqué.

Por otra parte, Frecuentemente tengo que corregir errores en (al menos dos) ramas que reflejan estados del código base completamente distintos de la rama en la que trabajo. Esas dos ramas son, de hecho, el resultado del trabajo de todo el equipo de desarrollo y, a menudo, tienen módulos completos reescritos o agregados. Haber compilado todo antes de enviar una corrección de errores es obligatorio.

Mi primer enfoque fue cambiar de mi rama de desarrollo cada vez que se necesitaba una corrección de errores, luego limpiar, corregir errores, volver a compilar desde cero, empujar, volver a la rama original, limpiar de nuevo, volver a compilar. la demora por hacer esto es intolerable.

luego me mudé a mantener tres pagos separados de la base de código en mi máquina. Esto resuelve el "recopilación costosa" problema (mis cambios en cada rama son incrementales nuevamente), pero hace que la pregunta "¿en qué estoy desarrollando ahora mismo?" sea más compleja de responder (ya que depende del directorio actual), y hace que la sincronización de estas tres copias complejo (multiplica toda la rutina push/remote update/pull comandos que tengo que hacer por tres).

Una solución más sencilla sería tener la capacidad de guardar el estado de un directorio (sin seguimiento, donde genero archivos compilados) cada vez que mi checkout "sale" de una sucursal, y recordar el estado de ese directorio, si existe, cada vez que "entro" (verificar) una rama.

  • ¿Hay comandos de git que me ayudarían a lograr este comportamiento?
  • Si no, ¿hay alguna herramienta que me permita hacer eso?
  • Si no es así, ¿git proporciona ganchos de pago que podrían ayudarme a escribir este comportamiento?

preguntado el 12 de junio de 12 a las 10:06

Una solución no tan elegante es añadir, por ejemplo, el nombre de la rama a la carpeta de salida de la compilación y cambiarle el nombre cuando esté trabajando en esa rama. -

@nhahtdh: creo que esa es la solución más elegante, siempre que todas esas carpetas estén dentro de una carpeta común para que no sature la carpeta de origen raíz con esas carpetas. -

3 Respuestas

Sugeriría usar alijos, están bastante cerca de lo que necesitas.

En versiones recientes de git, puede ocultar archivos sin seguimiento con el --include-untracked opción. También puede enviar mensajes a sus alijos y recuperarlos, de modo que pueda verificar qué alijo se debe aplicar después de revisar una sucursal.

#before leaving branch
git stash save --include-untracked "compiled stuff for my_branch"
git checkout another_branch
#what stash contains compiled stuff for another_branch?
git stash list
git stash pop stash@{n}

Puedes escribir un poco para hacer las cosas más prácticas...

Respondido el 12 de junio de 12 a las 15:06

Muchas gracias ! muy buena sugerencia! Creo que tienes que poner el --include-untracked después de el save aunque comando. - francois g

Me temo que no tengo respuestas exactas ya que no tuve que lidiar con un caso como el suyo, pero de todos modos me gustaría brindar una posible pista: Git puede usar varios árboles de trabajo distintos "conectados" a un solo repositorio (leer más en esta respuesta por ejemplo), por lo que en lugar de mantener múltiples pagos, puede usar múltiples árboles de trabajo con un solo repositorio.

Debo agregar que me gusta más la solución de @CharlesB (conceptualmente) pero, por otro lado, mediría: supuestamente git stash efectivamente copia sus archivos al convertirlos en blobs para almacenar en el alijo, lo que a) duplicaría temporalmente el espacio ocupado por esos archivos enormes en el sistema de archivos; b) tener un efecto desconocido de larga data en el tamaño de la base de datos de objetos de Git.

contestado el 23 de mayo de 17 a las 12:05

Mis 2 centavos: realizar un seguimiento del directorio de compilación como un submódulo - pero como aún no he usado esta función de git, solo puedo señalarte la página del documento...

Respondido el 12 de junio de 12 a las 12:06

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.