¿Hay alguna solución alternativa al límite de tamaño de file de GitHub de 100 MB para files de text?

Tengo un file de text plano de 190 MB del que quiero realizar un seguimiento en github.

El file de text es un file de léxico de pronunciación para nuestro motor de conversión de text a voz. Regularmente agregamos y modificamos líneas en los files de text, y los diffs son bastante pequeños, por lo que es perfecto para git en ese sentido.

Sin embargo, GitHub tiene un estricto límite de tamaño de file de 100 MB. He probado el service de Almacenamiento de files grandes de GitHub, pero eso carga una nueva versión de todo el file de 190 MB cada vez que cambia, por lo que crecerá rápidamente a muchos gigabytes si sigo ese path.

Me gustaría mantener el file como un solo file en lugar de dividirlo porque así es como nuestro flujo de trabajo es actualmente y requeriría alguna encoding para permitir múltiples files de text como input / salida en nuestras herramientas (y no tenemos muchos resources de desarrollo) .

Una idea que he tenido es que tal vez es posible configurar algunos ganchos antes y después de la confirmación para dividir y concatenar el file grande automáticamente. ¿Sería eso posible?

¿Otras ideas?

Editar : Soy consciente de la limitación de tamaño de file de 100 MB descrita en las preguntas similares aquí en StackOverflow, pero no considero que mi pregunta sea un duplicado porque estoy preguntando por el caso específico donde las diferencias son pequeñas y frecuentes (I ' m no estoy tratando de cargar un file ZIP grande ni nada). Sin embargo, tengo entendido que git-lfs solo es apropiado para files que raramente cambian, y que el git normal sería el ajuste perfecto para el tipo de file que estoy describiendo; excepto que GitHub tiene una restricción de tamaño de file.

Actualización : Pasé ayer experimentando con la creación de un pequeño progtwig multiplataforma que divide y une files en files más pequeños utilizando git hooks. Funciona, pero no es realmente satisfactorio. Tendrá que tener su file de text grande excluido por .gitignore, lo que hace que Git no sepa si ha cambiado o no. Los files divididos no se detectan inicialmente por el git status o la git commit y conducen al mismo problema descrito en esta pregunta de SO, que es bastante molesto: el script de precompilation crea el file mysqldump, pero "no hay nada que confirmar (directory de trabajo limpio)" ? Configurar un trabajo cron (Linux) y una tarea progtwigda (Windows) para regenerar automáticamente los files divididos con regularidad podría solucionarlo, pero no es fácil de configurar automáticamente, puede causar problemas de performance en la computadora del usuario y simplemente no es muy elegante solución. Algunas soluciones hacky, como la modificación dinámica de .gitignore, también pueden ser necesarias, y de ninguna manera se obtendría una diferencia de los files de text reales, solo los files divididos (aunque eso podría ser aceptable ya que serían muy similares).

Entonces, habiéndome dormido, hoy creo que el enfoque de git hook no es una buena opción, ya que tiene demasiados caprichos. Como ha sugerido @PyRulez, creo que tendré que search otros services además de GitHub (desafortunadamente, ya que me encanta github). Sería preferible una solución alojada para evitar tener que administrar nuestro propio server. También me gustaría que esté disponible públicamente …

Actualización 2 : he analizado algunas alternativas a GitHub y actualmente me inclino por usar GitLab. Me puse en contacto con el soporte de GitHub sobre la posibilidad de boost el límite de 100 MB, pero si no lo hacen, cambiaré a GitLab para este proyecto en particular.

Solutions Collecting From Web of "¿Hay alguna solución alternativa al límite de tamaño de file de GitHub de 100 MB para files de text?"

Limpiar y manchar

Puede usar clean y smudge para comprimir su file. Normalmente, esto no es necesario, ya que git lo comprimirá internamente, pero como gitHub está actuando de forma extraña, puede ser útil. Los commands principales serían como:

 git config filter.compress.clean gzip git config filter.compress.smudge gzip -d 

GitHub verá esto como un file comprimido, pero en cada computadora, parecerá ser un file de text.

Consulte https://git-scm.com/book/en/v2/Customizing-Git-Git-Attributes para get más detalles.

Alternativamente, puede tener una publicación limpia en un pastebin en línea y una extracción de manchas del pastebin, como http://pastebin.com/ . Muchas otras combinaciones son posibles con limpieza y difuminado.

Una muy buena solución será usar:

https://git-lfs.github.com/

Es una fuente abierta diseñada para trabajar con files grandes.

Puede crear un script / progtwig en cualquier idioma para dividir o unir files.

Aquí un ejemplo para dividir un file escrito en Java (utilicé Java porque me siento más cómodo en Java que en cualquier otro, pero cualquier otro funcionaría, algunos serán mejores que Java también).

 public static void main(String[] args) throws Exception { RandomAccessFile raf = new RandomAccessFile("test.csv", "r"); long numSplits = 10; //from user input, extract it from args long sourceSize = raf.length(); long bytesPerSplit = sourceSize/numSplits ; long remainingBytes = sourceSize % numSplits; int maxReadBufferSize = 8 * 1024; //8KB for(int destIx=1; destIx <= numSplits; destIx++) { BuffenetworkingOutputStream bw = new BuffenetworkingOutputStream(new FileOutputStream("split."+destIx)); if(bytesPerSplit > maxReadBufferSize) { long numReads = bytesPerSplit/maxReadBufferSize; long numRemainingRead = bytesPerSplit % maxReadBufferSize; for(int i=0; i<numReads; i++) { readWrite(raf, bw, maxReadBufferSize); } if(numRemainingRead > 0) { readWrite(raf, bw, numRemainingRead); } }else { readWrite(raf, bw, bytesPerSplit); } bw.close(); } if(remainingBytes > 0) { BuffenetworkingOutputStream bw = new BuffenetworkingOutputStream(new FileOutputStream("split."+(numSplits+1))); readWrite(raf, bw, remainingBytes); bw.close(); } raf.close(); } static void readWrite(RandomAccessFile raf, BuffenetworkingOutputStream bw, long numBytes) throws IOException { byte[] buf = new byte[(int) numBytes]; int val = raf.read(buf); if(val != -1) { bw.write(buf); } } 

Esto costará casi nada (time / dinero).

Editar: puede crear un ejecutable Java y agregarlo a su repository, o incluso más fácil, crear un script de Python (o cualquier otro idioma) para hacer esto y savelo como text sin formatting en su repository.