2010-02-24 10 views
6

He cometido accidentalmente log/test.log pero nunca lo he pulsado. Desde entonces he hecho un truco para deshacerme de él. Pero cuando intento presionar, sigo recibiendo una gran cantidad de datos que intentan ser transferidos. ¿No debería el robot corregir ese problema? Si no, ¿cómo podría solucionarlo?git push después de eliminar el archivo grande

Respuesta

11

No revierte la confirmación y luego presione porque el archivo enorme aún se cargará en el historial.

Teniendo en cuenta que aún no se ha empujado y que el cometer desea volver a realizar es la más reciente, retire esa confirmación de su historia:

$ git reset HEAD^

Esto devolverá el índice para el estado en que se en la confirmación principal (HEAD^). Ahora tiene un mulligan: agregue y comprométase de la manera que pretendía la primera vez.

Si ha realizado otras confirmaciones posteriores, necesitará git rebase -i <commit> donde <commit> es el SHA-1 del padre del compromiso incorrecto.

Por ejemplo (y anote el SHA-1 serán diferentes en tu repositorio)

$ git rebase -i 57d0b28

te deja en un editor que se asemeja a

pick 366eca1 This has a huge file 
pick d975b30 delete foo 
pick 121802a delete bar 

# Rebase 57d0b28..121802a onto 57d0b28 
# 
# Commands: 
# p, pick = use commit 
# r, reword = use commit, but edit the commit message 
# e, edit = use commit, but stop for amending 
# s, squash = use commit, but meld into previous commit 
# 
# If you remove a line here THAT COMMIT WILL BE LOST. 
# However, if you remove everything, the rebase will be aborted. 
#

Reemplazar pick con edit en la línea con el commit pesado

edit 366eca1 This has a huge file 
pick d975b30 delete foo 
pick 121802a delete bar

Guardar y salir su editor para volver a su concha, donde puedes encontrar un mensaje de la forma

Stopped at 366eca1... This has a huge file 
You can amend the commit now, with 

    git commit --amend 

Once you are satisfied with your changes, run 

    git rebase --continue

A partir de ahí, se elimina el archivo infractor (--cached elimina el archivo de sólo el índice)

$ git rm --cached big-nasty-file 
rm 'big-nasty-file'

modificar la confirmación

$ git commit --amend

y terminar el rebase

$ git rebase --continue
+0

¿Cómo se obtienen las direcciones SHA1 para sus confirmaciones? – Daniel

+0

@Daniel Ejecute 'git log' o' gitk', por ejemplo. –

2

Si no ha pulsado, puede usar git rebase -i para editar su historial de confirmaciones, eliminando tanto el add como el rm. La única advertencia es que debe tener cuidado de no editar las confirmaciones que ya se han enviado.

http://blog.madism.org/index.php/2007/09/09/138-git-awsome-ness-git-rebase-interactive

Se preguntó si todavía se puede hacer esto si hay otros cambios en la confirmación y la otra confirmación siguientes éste. Depende. Debería poder editar/eliminar cualquier compromiso sin prisa, no solo el más reciente. Pero la rebase puede fallar si los cambios posteriores dependen en gran medida de los cambios en la confirmación eliminada (p. Ej., Usted agregó un archivo y luego lo editó en una confirmación posterior). Si elimina una confirmación, perderá todos los cambios en esa confirmación. No sé de una forma de eliminar un solo cambio de una confirmación. Si no desea perder los otros cambios en la confirmación test.rb, puede generar un parche (con git show <commitid> > /tmp/patch o con las funciones integradas git patch) antes de eliminar la confirmación. Luego edite su archivo de parche para eliminar el test.rb grande, pero deje los cambios deseados y vuelva a aplicar el parche a la cabeza.

Si usted tiene el problema que he mencionado antes, donde no rebase (o cree que sería un error), usted podría ahorrar parches para todo de sus confirmaciones después de que el problema se comprometen, eliminar a todos ellos, y volver a aplicar en orden.

+0

Aunque no he pulsado, he realizado varios commits desde entonces. ¿La rebase sigue siendo una opción? (La confirmación con el registro/prueba.rb accidental tenía un montón de archivos) – Daniel