Git: ¿Hay una forma segura de eliminar una twig, incluyendo todas las confirmaciones / historial de la misma para restaurar el tamaño del repository original?

Tengo una request de alguien para usar Git para transferir un file binary grande como un trabajo de una sola vez (para transferir files entre 2 personas). Está teniendo problemas de networking que le impiden usar herramientas estándar (como Dropbox, GDrive, Ftp, etc.), pero tiene conectividad completa con mi repository de Git.

Mi mayor preocupación al permitirle hacer esto es que boostá el tamaño de mi repository. Incluso si crea una nueva bifurcación, realiza una confirmación con el file binary y elimina la bifurcación una vez que la otra parte la haya retirado con éxito, ¿no conservará el informe el historial asociado con esa confirmación?

Si el file es bastante grande (100M), ¿mi repository no crecerá en esa cantidad, incluso si se elimina la twig? ¿Qué tendría que hacer para volver a networkingucir el repo al tamaño precompromiso?

Una vez que todas las references a alguna (s) confirmación (es) y su (s) file (s) asociado (s) -realmente, los objects Git subyacentes (los treees y blobs que acompañan a esas confirmaciones) desaparecen, los objects se vuelven elegibles para la recolección de basura. Sin embargo, en realidad no se recostackrán hasta que algo ejecute git gc (o git prune ) y sean al less tan antiguos como el "time de la poda".

El time de secado pnetworkingeterminado es de dos semanas, pero puede disminuirlo con, por ejemplo, git gc --prune=yesterday o --prune=10.minutes.ago o similar. Si hace que este time sea muy pequeño, asegúrese de que nadie esté creando nuevos objects dentro del repository.

Deshacerse de todas las references a varios objects Git puede ser más difícil de lo que parece. Los más obvios son nombres de twigs y tags. Estos nombres de reference también suelen tener reflogs , y hay un reflog adicional para HEAD ; todos estos reflogs contienen references, que luego mantienen vivos los objects. Al eliminar el nombre de la sucursal (actualmente), se borra el reflog de la sucursal, pero permanecen los que están en el reflog de HEAD .

Las inputs de reflog expiran, de manera pnetworkingeterminada, en 90 días para objects alcanzables y 30 días para inalcanzables , con esta accesibilidad determinada por el valor actual de la reference correspondiente. Si la única reference a una confirmación está en el reflecto HEAD y HEAD no está separada, esa reference de reflog apunta a un compromiso inalcanzable (por definición: si HEAD está conectado a una twig, HEAD solo contiene un nombre de twig, y ​​nosotros ya dijo que ningún nombre de twig apunta al compromiso en sí, ni a un descendiente del compromiso), por lo que solo se aplica el vencimiento más corto. Puede acortarlo aún más con git reflog expire --expire-unreachable=... , usando la misma syntax que con git gc --prune=... , aunque, por supuesto, expirará todas las inputs de reflog inalcanzables a less que restrinja esto a HEAD (entonces solo seleccionará las inputs inalcanzables de HEAD ).

Además de estos, es posible tener una reference en uno de los nombres especiales *_HEAD ( ORIG_HEAD , MERGE_HEAD , CHERRY_PICK_HEAD , y así sucesivamente). Sin embargo, eso no es probable en este caso particular.