2016-08-11 4 views
8

Hinweis: ähnliche Frage wie this one, aber mit einigen wichtigen Änderungen.Change Commit Nachricht für bestimmte Commit

Ich habe die folgende Funktion das Datum eines Commit neu zu schreiben, da die ID begehen:

rewrite-commit-date() { 
    local commit="$1" 
    local newdate="$2" 
    newdate="$(date -R --date "$newdate")" 
    echo ">>>> Rewriting commit $commit date: $newdate" 
    git filter-branch --env-filter \ 
     "if test \$GIT_COMMIT = '$commit' 
     then 
      export GIT_AUTHOR_DATE 
      export GIT_COMMITTER_DATE 
      GIT_AUTHOR_DATE='$newdate' 
      GIT_COMMITTER_DATE='$newdate' 
     fi" && 
    rm -fr "$(git rev-parse --git-dir)/refs/original/" 
} 

ich eine ähnliche Funktion zu implementieren versuchen rewrite-commit-message um die Nachricht begehen zu ändern. Was ich will, ist:

  1. Die Funktion rewrite-commit-message akzeptiert zwei Parameter: die commit_id und die new_commit_message
  2. Es gibt keine Notwendigkeit, die alte Commit-Nachricht zu wissen, ist: die commit_id mit genügt, um zu wissen, welche begehen
  3. ändern
  4. Nein git commit --amend, da dies zu einer alten Commits verwandt ist (nicht unbedingt auf die neueste Festschreibung)
  5. keine Sorgen über die Geschichte umzuschreiben und die Master-Repo: ich in einer Feature-Zweig arbeite, und ich darf tun git push -f
  6. Ich möchte filter-branch dafür verwenden, aber ich bin nicht sicher, wie man:
    • die Änderung zu einem bestimmten verpflichten gelten: die test in der in env-filter verwendet wird rewrite-commit-date Funktion verwendet wird, aber ich werde nicht zu tun Sie env-filter hier, da ich nichts in Bezug auf die Commit-Umgebung, sondern die Commit-Nachricht ändern möchte.
    • Wie erzwinge ich eine Commit-Nachricht? Die --msg-filter benötigt die ursprüngliche Commit-Nachricht. Die ursprüngliche Commit-Nachricht interessiert mich nicht. Gibt es eine --force-msg-filter oder ähnliches?

Was ich suche ist ähnlich this, aber mit einigen Einschränkungen:

  1. Sie die Änderung einer Reihe von Commits nicht anwenden, sondern auf eine bestimmte begehen
  2. I die ursprüngliche Commit-Nachricht nicht interessiert, da ich sie komplett überschreiben möchte

Antwort

3

Dieses kleine Skript funktioniert bei der folgenden ca veats:

  1. Dies wird Ihren Verlauf von der Festschreibung an die Spitze der Branche umschreiben. Weil Sie in der Frage angegeben haben, dass dies kein Problem ist, qualifiziert sich dies.

  2. Ihr Commit ist im Zweig master enthalten. Sie können dies leicht ändern, indem Sie den Zweignamen als weiteren Parameter übergeben, aber das Commit besser in der Verzweigung sein.Sie sollten wahrscheinlich in einigen Validierung für diese bauen, vielleicht mit git rev-parse --abbrev-ref HEAD oder vielleicht git branch --all --contains <commit>

Ohne weitere Umschweife:

#!/bin/bash 

change-commit-msg(){ 

    commit="$1" 
    newmsg="$2" 
    branch="master" 

    git checkout $commit 
    git commit --amend -m "$newmsg" 
    git cherry-pick $commit..$branch 
    git branch -f $branch 
    git checkout $branch 

} 

Demo

git init 
echo init > a && git add . && git commit -m "init" 
echo another > a && git commit -am "another" 
echo lastly > a && git commit -am "lastly" 
git log --graph --oneline --all --decorate 
* bca608c (HEAD -> master) lastly 
* 4577ab5 another 
* b3d018c init 
change-commit-msg 4577ab5 "something else" 
* c7d03bb (HEAD -> master) lastly 
* 3ec2c3e something else 
* b3d018c init 
Verwandte Themen