tag git git-rewrite-history

tag - git commit--amend



¿Cómo borrar el antiguo historial de git? (2)

Tengo un repositorio git con muchos, muchos (2000+) confirmaciones, por ejemplo:

l-- m -- n / a -- b -- c -- d -- e -- f -- g -- h -- i -- j -- k / x -- y -- z

y quiero truncar el historial de registro anterior: eliminar todas las confirmaciones del historial de registro a partir de (por ejemplo) cometer "f" pero como el principio del repositorio.

¿Cómo hacerlo?


Para no perder alguna historia; mejor primero toma una copia de tu repositorio :). Aquí vamos: ( <f> es el sha del commit f que desea que sea el nuevo root commit)

git checkout --orphan temp <f> # checkout to the status of the git repo at commit f; creating a branch named "temp" git commit -m "new root commit" # create a new commit that is to be the new root commit git rebase --onto temp <f> master # now rebase the part of history from <f> to master onthe temp branch git branch -D temp # we don''t need the temp branch anymore

Si tiene un control remoto en el que desea tener el mismo historial truncado; Puedes usar git push -f . Advertir que este es un comando peligroso; ¡No uses esto a la ligera! Si desea asegurarse de que su última versión del código sigue siendo la misma; Puede ejecutar git diff origin/master . Eso no debería mostrar cambios (ya que solo el historial cambió, no el contenido de sus archivos).

git push -f

Los siguientes 2 comandos son opcionales: mantienen su repo de git en buena forma.

git prune --progress # delete all the objects w/o references git gc --aggressive # aggressively collect garbage; may take a lot of time on large repos


--shallow-since proporciona una posible solución para su problema usando la opción --shallow-since . Si solo hay un pequeño número de confirmaciones desde f y no hay problemas para contarlas, puede usar la opción --depth .

La segunda opción ( --depth ) clona solo la rama especificada. Si necesita sucursales adicionales, puede agregar el repositorio original como control remoto y usar git fetch para recuperarlos.

Cuando esté satisfecho con el resultado, elimine el repositorio anterior y cambie el nombre del nuevo para reemplazarlo. Si el repositorio anterior es remoto, vuelva a crearlo después de la eliminación y presione el nuevo repositorio.

Este enfoque tiene la ventaja de tamaño y velocidad. El nuevo repositorio solo contiene las confirmaciones que desea y no es necesario ejecutar git prune o git gc para eliminar los objetos antiguos (porque no están allí).