ocean - ¿Existen soluciones adecuadas para el límite de tamaño de archivo de GitHub de 100 MB para archivos de texto?
git hooks made easy (3)
Tengo un archivo de texto plano de 190 MB que quiero rastrear en github.
El archivo de texto es un archivo de pronunciación de nuestro motor de texto a voz. Regularmente agregamos y modificamos líneas en los archivos de texto, y las diferencias son bastante pequeñas, así que es perfecto para git en ese sentido.
Sin embargo, GitHub tiene un estricto límite de tamaño de archivo de 100 MB. He probado el servicio de almacenamiento de archivos grandes de GitHub, pero eso carga una nueva versión del archivo completo de 190 MB cada vez que cambia, por lo que crecería rápidamente a muchos gigabytes si siguiera ese camino.
Me gustaría mantener el archivo como un solo archivo en lugar de dividirlo porque así es como está actualmente nuestro flujo de trabajo y requeriría algo de codificación para permitir múltiples archivos de texto como entrada / salida en nuestras herramientas (y no tenemos muchos recursos de desarrollo) .
Una idea que he tenido es que tal vez es posible configurar algunos enganches antes y después de la confirmación para dividir y concatenar el archivo grande automáticamente. ¿Sería eso posible?
¿Otras ideas?
Edit : Soy consciente de la limitación de tamaño de archivo 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 '' No estoy tratando de cargar un archivo ZIP grande o algo así. Sin embargo, mi entendimiento es que git-lfs solo es apropiado para archivos que rara vez cambian, y que git normal sería el ajuste perfecto para el tipo de archivo que estoy describiendo; excepto que GitHub tiene una restricción de tamaño de archivo.
Actualización : ayer pasé experimentando con la creación de un pequeño programa multiplataforma que divide y une los archivos en archivos más pequeños usando ganchos de git. Funciona pero no es realmente satisfactorio. Necesitará que su archivo de texto grande sea excluido por .gitignore, lo que hace que git no sepa si ha cambiado o no. Los archivos divididos no son detectados inicialmente por git status
o git commit
y lleva al mismo problema que se describe en esta pregunta SO, que es bastante molesto: el script de pre-commit crea el archivo mysqldump, pero "no hay nada que cometer (limpiar el directorio de trabajo)" ? Configurar un trabajo cron (linux) y una tarea programada (windows) para regenerar automáticamente los archivos divididos con regularidad puede solucionarlo, pero no es fácil de configurar automáticamente, puede causar problemas de rendimiento en la computadora de los usuarios y no es muy elegante solución. Algunas soluciones piratas como la modificación dinámica de .gitignore también podrían ser necesarias, y de ninguna manera obtendría una diferencia de los archivos de texto reales, solo los archivos divididos (aunque eso podría ser aceptable ya que serían muy similares).
Así que, después de haber dormido en él, hoy creo que el enfoque de gancho de git no es una buena opción, ya que tiene demasiadas peculiaridades. Como ha sugerido @PyRulez, creo que tendré que buscar otros servicios que no sean GitHub (desafortunadamente, ya que amo a github). Una solución alojada sería preferible para evitar tener que administrar nuestro propio servidor. También me gustaría que estuviera disponible públicamente ...
Actualización 2 : He visto algunas alternativas a GitHub y actualmente me estoy inclinando por usar GitLab. Me puse en contacto con el servicio de asistencia técnica de GitHub sobre la posibilidad de aumentar el límite de 100 MB, pero si no lo hacen, simplemente cambiaré a GitLab para este proyecto en particular.
Limpiar y difuminar
Puede utilizar limpiar y difuminar para comprimir su archivo. Normalmente, esto no es necesario, ya que git lo comprimirá internamente, pero dado que gitHub está actuando de manera extraña, puede ayudar. Los comandos principales serían como:
git config filter.compress.clean gzip
git config filter.compress.smudge gzip -d
GitHub verá esto como un archivo comprimido, pero en cada computadora aparecerá como un archivo de texto.
Consulte https://git-scm.com/book/en/v2/Customizing-Git-Git-Attributes para obtener más detalles.
Alternativamente, podría tener una publicación limpia en un pastebin en línea, y la búsqueda de manchas desde el pastebin, como http://pastebin.com/ . Muchas otras combinaciones son posibles con limpiar y manchar.
Puede crear un script / programa en cualquier idioma para dividir o unir archivos.
Aquí hay un ejemplo para dividir un archivo escrito en Java (utilicé Java porque me siento más cómodo con Java que con 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++) {
BufferedOutputStream bw = new BufferedOutputStream(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) {
BufferedOutputStream bw = new BufferedOutputStream(new FileOutputStream("split."+(numSplits+1)));
readWrite(raf, bw, remainingBytes);
bw.close();
}
raf.close();
}
static void readWrite(RandomAccessFile raf, BufferedOutputStream 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 (tiempo / dinero).
Editar: puede crear un ejecutable Java y agregarlo a su repositorio, o incluso más fácil, crear un script en Python (o cualquier otro idioma) para hacer esto, y guardarlo como texto sin formato en su repositorio.
Una muy buena solución será usar:
Es una fuente abierta diseñada para trabajar con archivos grandes.