2009-12-30 15 views
9

sbaglio ho creato impegna per "sconosciuto" nel mio repository, e ho deciso di provare a eseguire un comando da here:Git - Duplicate commettere problema

git filter-branch --commit-filter ' 
     if [ "$GIT_COMMITTER_NAME" = "unknown" ]; 
     then 
       GIT_COMMITTER_NAME=".."; 
       GIT_AUTHOR_NAME=".."; 
       GIT_COMMITTER_EMAIL="..."; 
       GIT_AUTHOR_EMAIL="..."; 
       git commit-tree "[email protected]"; 
     else 
       git commit-tree "[email protected]"; 
     fi' HEAD 

In un primo momento ho pensato che tutto andava bene, fino a quando ho notato in gitk che ogni commit prima di eseguire questo è stato duplicato, non semplicemente modificato come inizialmente pensavo.

E 'possibile pulire questo?

EDIT: OK, gitk sta mostrando sia i vecchi commit (quelle con i commiters "sconosciute" mescolati) e il nuovo commit (quelli riscritti), contempla a un certo punto intorno a metà strada. Pensa a una serie di commit, quindi duplicati (e con le modifiche) e impilati sopra quelli originali. Quello che voglio fare è se possibile, rimuovere quelli originali.

+1

Vediamo se sto ottenendo questo: hai un albero di commit che assomiglia a '...-- a - b - c - (*) - a '- b' - c '--d - e', dove '(*)' è il commit su cui è stato eseguito il comando bad, '[abc]'' sono erroneamente duplicati commit che vuoi eliminare, e '[de]' ti impegna vuoi mantenere? –

+1

Beh, è ​​più complicato a causa della ramificazione, ma fondamentalmente come hai detto tu, ma voglio mantenere i '' 'come hanno i campi dell'autore corretti. – unrelativity

+1

Ok, quindi vuoi cancellare [abc], ma mantenere [abc] '? –

risposta

7

La risposta era i file in .git/refs/original e come il comando che ho trovato non avrebbe dovuto terminare in HEAD ma invece con --tag-name-filter cat -- --all.

Cheers to _Vi e wereHamster dal canale #git per l'aiuto.

1

Se si conosce l'ultima buona commettere, salvare la pancetta con questo:

git reset <last_good_commit> # Warp back to a good state. 
git push -f master    # Push the changes up (you need -f to force it to 
           # obliterate old commits). 

Se si vuole percorrere con più attenzione (per esempio, se ci sono buoni e cattivi commit mescolato dopo <last_good_commit>), l'uso git rebase -i per scegliere i migliori che dovrebbero rimanere indietro.

+0

Non ho molta familiarità con la riga di comando, e non sono sicuro di cosa siano il cherry picking o il rebasing ... inoltre, ho aggiunto un chiarimento su cosa voglio fare. – unrelativity

Problemi correlati