2012-08-13 33 views
7

Quiero usar Git para rastrear los cambios micro (varios al día) en un directorio de trabajo grande (muchos conciertos). Los datos serán texto mixto binario/sin formato. Los datos binarios no cambiarán casi tanto como la información de texto. El acceso a las confirmaciones anteriores raramente será necesario y puede ser lento, mientras que el historial reciente debe ser rápido.Git-archive old commits

No quiero perder datos antiguos permanentemente, solo moverlos a un servidor de respaldo o algo así. ¿Hay algo en Git que permita archivar el historial anterior y mantener solo un cierto subconjunto en el repositorio local?

En caso negativo, ¿hay alguna herramienta más adecuada para este fin? Me gusta Git porque lo sé y quiero el control de versiones y diffs. No necesitaré ninguna de las características avanzadas de Git (como ramificación/fusión, no distribuida), por lo que cualquier otro VCS similar sería agradable.

+0

Varios cambios al día en la mayoría de los archivos de texto apenas cuentan como "micro", esa es la tasa de compromiso que cualquier proyecto anterior obtiene durante las fases más pesadas para corregir errores en lugar de nuevos desarrollos. Git * debería * ser capaz de manejar esto sin mucha hinchazón. ¿Su repositorio realmente está creciendo en tamaño tan rápido que necesita volcar parte de su historial fuera del sitio? – millimoose

+0

Excepto que el tamaño total de los datos podría ser> 100 GB. Incluso con la compresión inteligente, incluso cambios menores en la escala de más de 10.000 archivos varias veces al día agregarán significativamente a la memoria caché del repositorio localmente. Planeo volver a basar automáticamente, pero también hay un límite para esa utilidad. Realmente no es para lo que fue diseñado Git, así que me preguntaba si ya soportaba ese tipo de cosas antes de romper el cincel y reinventar la rueda. – tjameson

Respuesta

4

Si está aplicando parches con git format-patch, cree un clon superficial con git clone --depth <depth> y proceda. Sin embargo, lo más probable es que no lo sea, en cuyo caso probablemente encontrará this answer y this answer útiles. El segundo concluye que git checkout --orphan es quizás la mejor manera de obtener lo que desea. Por supuesto, igual tendrá que clonar el historial completo localmente una vez para crear una rama más pequeña.

Si te sientes aventurero, lo deseas mal y estás dispuesto a soportar un proceso de inserción más complicado, crear parches con git format-patch y aplicarlos a otro repositorio con git am no es difícil de ejecutar ni de script. Agregaría una capa adicional a su proceso de inserción, p. crear un parche en repo poco profundo, aplicar programáticamente a un repositorio completo, que sea local o en otro lugar, push desde este último. El tiempo y el problema probablemente no valen la pena, pero ciertamente es posible.

+0

Hmm. Tendré que mirar eso. No necesito una interfaz de usuario agradable, siempre que pueda obtener programáticamente los conjuntos de cambios y actualizar el otro repositorio. Planeo tener varias copias del repositorio para que esto suceda, por lo que necesitarían estar sincronizadas, pero eso solo aumenta la diversión. Preferiría una forma de cortar el historial de compromiso en un punto en el tiempo ... – tjameson

+0

Para aclarar, el historial de división es fácil. Empujar y tirar de esa historia en rodajas es difícil. Git no puede hacer suposiciones sobre dónde están los HEAD de los repositorios, ni [¿puede interpretar qué división tomó su repositorio poco profundo]. (Http://stackoverflow.com/a/6900428/877115) Si está dispuesto a escribir este script , el problema está más o menos resuelto. Pase 'git format-patch' en un repositorio poco profundo a los demás. Aplicar con 'git am'. Podrías guionar esto muy fácilmente, particularmente si no estás generando, digamos, fusiones por el camino. – Christopher

+0

Parece que puedo unirme de nuevo con mi caso de uso particular. Voy a aceptar esto una vez que leo más sobre clones poco profundos. ¡Gracias! – tjameson

Cuestiones relacionadas