2010-02-24 17 views
6

Ho accidentalmente commesso log/test.log ma non l'ho mai spinto. Da allora ho fatto un tentativo per sbarazzarmene. Ma quando provo a spingere, sto ancora ricevendo un'enorme quantità di dati che tentano di essere trasferiti. Non dovrebbe il git rm risolvere questo problema. In caso contrario, come posso risolverlo?git push dopo la rimozione di file di grandi dimensioni

risposta

11

Non ripristinare il commit e quindi premere perché l'enorme file verrà comunque trasportato nella cronologia.

Dato che non si è ancora spinto e che il commit si vuole rifare è il più recente, rimuovere che commettono dalla cronologia:

$ git reset HEAD^

Questo restituirà l'indice di stato in cui era in sul commit padre (HEAD^). Ora hai un mulligan: aggiungi e commetti come volevi per la prima volta.

Se sono stati effettuati altri commit successivi, è necessario git rebase -i <commit> dove <commit> è lo SHA-1 del genitore del commit errato.

Per esempio (e notare l'SHA-1 sarà diverso nel vostro repo)

$ git rebase -i 57d0b28

vi porterà in un editor che assomiglia

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. 
#

Sostituire pick con edit sulla linea con il commit pesante

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

Salva ed esci il vostro editor per tornare alla shell, dove vedrete un messaggio del modulo

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

Da lì, cancellare il file incriminato (--cached rimuove il file da solo l'indice)

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

modificare il commit

$ git commit --amend

e finire il rebase

$ git rebase --continue
+0

Come si ottengono gli indirizzi SHA1 per i propri commit? – Daniel

+0

@Daniel Esegui 'git log' o' gitk', ad esempio. –

2

Se non è stato premuto, è possibile utilizzare git rebase -i per modificare la cronologia dei commit, rimuovere sia lo add che lo rm. L'unica avvertenza è che bisogna stare attenti a non modificare alcun commit già spinto.

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

Lei ha chiesto se si può ancora fare questo se ci sono altri cambiamenti nelle commit e altri commit seguito questo. Dipende. Dovresti essere in grado di modificare/rimuovere qualsiasi commit non premuto, non solo il più recente. Tuttavia, il rebase potrebbe non riuscire se le modifiche successive dipendevano in gran parte dalle modifiche nel commit cancellato (ad esempio, è stato aggiunto un file, quindi modificato in un commit successivo). Se elimini un commit, perderai tutte le modifiche in quel commit. Non conosco un modo per rimuovere una singola modifica da un commit. Se non si desidera perdere le altre modifiche nel commit test.rb, è possibile generare una patch (con git show <commitid> > /tmp/patch o con le funzioni incorporate git patch) prima di eliminare il commit. Quindi modifica il file di correzione per rimuovere il test.rb di grandi dimensioni, ma lascia le modifiche desiderate e riapplica la patch alla testa.

Se avete il problema che ho già detto in precedenza, dove rebase non riesce (o si pensa che fallirebbe), si potrebbe risparmiare patch per tutte dei tuoi commit dopo il problema commesso, li elimina, e riapplicare in ordine.

+0

Anche se non ho spinto, ho fatto diversi commit da allora. Rebase è ancora un'opzione? (Il commit con il log accidentale/test.rb conteneva un sacco di file) – Daniel

Problemi correlati