git, cómo eliminar un file grande usando git hooks

Estúpidamente compré un file inútil de 200 + M en mi repository hace un mes, ahora todo mi compañero de trabajo (internacionalmente) tiene el file grande ahora. Me pregunto si hay una buena manera de purgar este file grande para todos de forma transparente utilizando git hooks.

Puedo usar bfg o git filter-branch en el gancho git para eliminar el file grande, pero parece que se requiere un empuje de fuerza después, lo cual es riesgoso para el repository. ¿Alguien ha hecho esto antes? ¿Cómo se ve todo el flujo de trabajo y la configuration?

¿Hay una mejor idea que usar git hook?

¡Gracias por adelantado!

La respuesta simple es no, no hay forma de reescribir la historia sin un esfuerzo de queueboración de todos. Los ganchos del lado del server no modificarán sus clones locales. Independientemente de si puede automatizar cualquier cosa con ganchos del lado del cliente, no debería hacerlo. Tendría que manejar todos los casos posibles de actualización de cambios locales sin propulsión y sucursales adicionales, etc.

La conclusión es que todos tendrán que actualizar su repository local a un tree completamente nuevo (al less nuevo comenzando con la confirmación donde se introdujo el file y todo lo que sigue). Un file de 200 MB es molesto, pero probablemente no sea tan molesto como que todos tengan que reescribir su historial local para eliminarlo. Si no puede guiar individualmente a cada miembro del equipo, no hay ramificación de security y no está causando problemas de locking (como el repository ahora excede el límite de tamaño de su host y evita más bashs), probablemente debería confirmar la eliminación de un file ( por lo que ya no se verificará en el disco) y deje el historial solo.

Si el compromiso que lo introdujo es muy reciente, puede considerar la creación de una nueva twig, pero solo si puede lograr que todos se cambien sin problemas. Eso no suena como el caso de su pregunta.

Otra alternativa sería si puede hacer que todos clonen un nuevo repository después de modificar el historial. Pero esto requeriría que todos transfirieran sus cambios a una nueva copy del repository.

Cambiar la historia viene con mucho dolor, aquí hay algunas maneras en que puede eliminar el file de su historial usando git filter-branch

Nota: Todos necesitarán actualizar su trabajo para reflejar sus cambios revisados

git filter-branch --tree-filter "rm -f yourfilename.ext" -- --all

En lo anterior, reemplace su nombre de yourfilename.ext con su file como tutorial.mp4 Lo que esto hará es iricamente a través de cada confirmación en su repository y eliminar el file yourfilename.ext .

-- --all se asegurará de que el command aplicado pasará por todas las twigs.

Alternativamente, puede ejecutar un command similar pero con --index-filter lugar. Lo que hace es simplemente que en lugar de verificar cada confirmación a través del directory de trabajo, hará el trabajo pesado en el área de preparación (simplemente ejecutando el command sin verificar el contenido de la confirmación). Este método puede ser más rápido.

 git filter-branch --index-filter "git rm --cached --ignore-unmatch filename.ext" -- --all 

Como se mencionó anteriormente, solo asegúrese de replace filename.ext con su nombre de file + extensión.

Espero eso ayude

Si desea ir por la ruta del gancho, hay ganchos del lado del server descritos en https://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks . Puede tratar de acceder a estos para examinar las confirmaciones realizadas y verificar que el file grande anterior no esté presente allí. Mire el file .git / hooks / update.sample. Chacon también tiene una buena reseña en su libro, vea https://git-scm.com/book/en/v2/Customizing-Git-An-Example-Git-Enforced-Policy .

Dado lo que dicen los demás, parece que no se puede garantizar que las personas no lo arruinen y repunten el file (u otro file grande) y, por lo tanto, un gancho sería el único seguro contra esto volviendo a su repo. .