2013-10-28 9 views
7

Wie kann ich die Nachricht eines alten Commits, das bereits auf eine private Remote übertragen wurde, umschreiben? Ich möchte die Zeitstempel und Tags behalten.git filter-branch --msg-filter zum Umschreiben einer Push-Commit-Nachricht

ich diesen Befehl gefunden here:

git filter-branch -f --msg-filter \ 
'sed "s/<old message>/<new message>/g"' -- --all 

Um die Tags zu halten i hinzugefügt: --tag-name-filter cat

Wenn Sie den Befehl git Ausführung sagt mir: msg Filter fehlgeschlagen

Die Nachricht Ich möchte zu ändern ist eine fusionierte Nachricht "Merge branch 'release/...'" ist das das Problem?

+0

Scripting git rebase - Ich bin eine andere Option: http://stackoverflow.com/questions/12394166/how-do-irun-git-rebase-interactive-in-non-interactive-manner – MarcH

Antwort

11

Die Lösung war, den Schrägstrich in "release/..." mit einem Backslash zu entkommen. So ist der Befehl, den ich verwendet wurde:

git filter-branch -f --msg-filter \ 
'sed "s/release\/Version-[0-9].[0-9].[0-9]/develop/g"' \ 
--tag-name-filter cat -- --all 
1

Hier ist eine leicht verbesserte Version, die auch alle Referenzen aktualisiert Hashes zu begehen in Commit-Nachrichten im Fluge, wenn dabei Filterzweig:

rm -f /tmp/git; 
touch /tmp/git; 
git filter-branch \ 
    --subdirectory-filter <DIRECTORY> \ 
    --tag-name-filter cat \ 
    --commit-filter 'echo -n "s/${GIT_COMMIT}/" >>/tmp/git; \ 
        NEW=`git_commit_non_empty_tree "[email protected]"`; \ 
        echo "${NEW}/g" >> /tmp/git; echo ${NEW}' \ 
    --msg-filter 'sed -f /tmp/git' \ 
    -- --all