更改特定提交的提交消息

注:与此类似的问题,但有一些重要的变化。

给定提交ID,我有以下函数来重写提交的日期:

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/"
}

我试图实现类似的函数rewrite-commit-message来更改提交消息。 我想要的是:

  • 函数rewrite-commit-message接受两个参数: commit_idnew_commit_message
  • 没有必要知道旧的提交消息:拥有commit_id足以知道要更改哪个提交
  • 没有git commit --amend ,因为这涉及到旧的提交(不一定是最近的提交)
  • 不用担心重写历史记录和主回购:我正在一个功能分支,我被允许做git push -f
  • 我想为此使用filter-branch ,但我不确定如何:
  • 将更改应用于特定的提交:在env-filter使用了rewrite-commit-date函数中使用的test ,但我不打算在这里执行env-filter ,因为我不想更改与提交相关的任何内容环境,但提交消息。
  • 如何强制提交消息? --msg-filter需要原始的提交消息。 我不关心最初的提交信息。 是否有--force-msg-filter或类似的?
  • 我正在寻找的是类似的,但有一些注意事项:

  • 不要将更改应用于一系列提交,而应用于特定的提交
  • 我不关心最初的提交信息,因为我想完全覆盖它

  • 这个小小的脚本有以下注意事项:

  • 这将重写您的历史从提交到分支的提示。 因为你在问题中提到这不是问题,那么这就是合格的。

  • 您的提交包含在master分支中。 您可以通过将分支名称作为另一个参数来轻松更改此分支,但最好在分支中提交。 你应该建立一些验证,也许使用git rev-parse --abbrev-ref HEAD或者git branch --all --contains <commit>

  • 无需再费周折:

    #!/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
    
    }
    

    演示

    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
    
    链接地址: http://www.djcxy.com/p/19513.html

    上一篇: Change commit message for specific commit

    下一篇: Get the name of the current git branch with PowerShell