Nota: esta respuesta se trata de acortar la historia de todo un proyecto, en lugar de eliminar solo archivo de la historia más antigua cuál era la pregunta acerca!
La forma más sencilla para acortar la historia de un todo el proyecto utilizando git filter-branch sería utilizar injertos mecanismo de (ver repository layout documentación) para acortar la historia:
$ echo "$commit_id" >> .git/info/grafts
donde $commit_id
es una confirmación que desea que sea una raíz (primera confirmación) de un nuevo repositorio. Consulte usando "git log" o visor gráfico de historial, como gitk, que el historial se parece a lo que desea, y ejecute "git filter-branch --all"; el uso de injertos se describe en la documentación de git-filter-branch.
O puede usar clon superficial utilizando la opción --depth <depth>
de git clone.
Puede hacer uso de injertos para eliminar la historia parte de un único archivo (lo que se solicitó originalmente) utilizando pasos describen a continuación. Esta solución consta de más pasos que solution proposed by Dan Moulding, pero cada uno de los pasos es más simple, y puede verificar los pasos intermedios usando "git log" o visor de historial gráfico.
Primero seleccione el punto, en el que quieren tener el archivo eliminado, y marcar esas confirmaciones mediante la creación de sucursales en esos puntos. Por ejemplo, si usted quiere tener el archivo aparece por primera vez en comprometerse f020285b
y se lo retiren en todo lo que antepasados, marcarlo ancestro (suponiendo que esto es normal, no de combinación de cometer) usando
$ git branch cleanup f020285b^
En segundo lugar, retire el archivo de la historia que comienza con cleanup
(es decir f020285b^
) usando git-filter-branch, como se muestra en la sección "Ejemplos" de git-filter-branch página de manual:
$ git filter-branch --index-filter 'git rm --cached --ignore-unmatch big_manual.txt' cleanup
Si desea eliminar también todos los envíos que se había cambiado sólo para archivo eliminado también puede usar --prune-empty
opción para git-filter-branch.
A continuación, una parte de la historia reescrita con el resto de la historia usando el mecanismo de injertos:
$ echo $(git-rev-parse f020285b) $(git rev-parse cleanup) >> .git/info/grafts
A continuación, se puede examinar histry para comprobar si se une correctamente.
pasado, hacer injertos permanente (esto haría que todos los injertos permanente, pero supongamos que aquí no se utiliza injertos de otra manera) usando git-filter-branch,
$ git filter-branch cleanup..HEAD
y eliminar los injertos (como se que no se necesitan más), y la rama cleanup
$ rm .git/info/grafts
$ git branch -d cleanup
nota final: si se quita parte de la historia de algún archivo, es mejor asegurarse de que este proyecto sin archivo tiene sentido (y, por ejemplo, compila correctamente).
Creo que ayudaría si proporcionas más información sobre este archivo y lo que intentas hacer. ¿Va a ser un evento único o planea purgar el archivo y reescribir el historial del repositorio regularmente? ¿Por qué estás rastreando el archivo en git si no necesitas mantener su historial? ¿Qué tan grande es su repositorio desnudo y realmente es un problema si es grande? –
es un manual para mi programa, estoy escribiendo usando páginas de Apple (procesador de textos) e incluye muchas imágenes. Lo almaceno en GIT principalmente para poder compartirlo entre mi computadora estacionaria y mi computadora portátil, así que lo deshago en caso de que algo salga mal. El repositorio es actualmente de 450 MB. Dudo en trabajar con el archivo porque sé que el tamaño del repositorio aumenta. En lugar de replantear mi solución de respaldo, pensé que sería mejor deshacerse de las revisiones más antiguas. Tomo diariamente una instantánea completa del repositorio y lo cargo, pero la cuota del disco es de 3 gb. – neoneye
sí, estoy esperando que esto sea posible de vez en cuando. – neoneye