2009-12-30 16 views
9

ich von „unbekannt“ in meinem Repository versehentlich Commits erstellt und beschlossen, von here läuft einen Befehl, um zu versuchen:Git - Duplizieren Ausgabe begehen

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 

ich Anfangs dachte alles war in Ordnung, bis ich in gitk bemerkt dass jedes Commit vor dem Ausführen dupliziert wurde, nicht einfach bearbeitet wurde, wie ich ursprünglich dachte.

Ist es möglich, dies zu bereinigen?

EDIT: OK, gitk zeigt sowohl die alten Commits (die mit dem „unbekannt“ Committer gemischt) und die neuen Commits (die neu geschrieben ist), an einem bestimmten Punkt auf halbem Weg aufgeteilt. Denken Sie eine Reihe von Commits, dann dupliziert (und mit den Änderungen), und gestapelt auf die ursprünglichen. Was ich tun möchte ist, wenn möglich, die ursprünglichen zu entfernen.

+1

Mal sehen, ob ich das bekomme: hast du einen Commit-Baum, der wie folgt aussieht: ... - a - b - c - (*) - a '- b' - c '--d - e', wobei '(*)' das Commit ist, auf dem du den bad Befehl ausgeführt hast, '[abc]'' fälschlicherweise duplizierte Commits, die du löschen willst, und '[de]' werden dir übergeben behalten wollen? –

+1

Nun, es ist komplizierter wegen der Verzweigung, aber im Grunde wie du gesagt hast, aber ich möchte die '' 'einbehalten, da sie die Autorenfelder haben. – unrelativity

+1

Okay, also möchtest du [abc] löschen, aber [abc] 'behalten? –

Antwort

7

Die Antwort war die Dateien in .git/refs/original, und wie der Befehl, den ich gefunden habe, hätte nicht in HEAD enden sollen, sondern stattdessen mit --tag-name-filter cat -- --all.

Prost auf _Vi und werHamster aus dem #git Kanal für die Hilfe.

1

Wenn Sie die letzte gute wissen begehen, speichern Sie Ihre Speck mit diesem:

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

Wenn Sie mehr sorgfältig treten (zum Beispiel, wenn es gute und schlechte in nach <last_good_commit> gemischt Commits), Nutzung git rebase -i, um die guten auszuwählen, die zurückbleiben sollten.

+0

Ich bin nicht sehr vertraut mit der Befehlszeile, und ich bin mir nicht sicher, was Rosinenpickerei oder Rebasing sind ... auch, ich habe eine Erklärung hinzugefügt, was ich tun möchte. – unrelativity