注意:与this one类似的问题,但有一些重要的更改。
在给定提交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_id
和new_commit_message
commit_id
足以知道要更改的提交git commit --amend
,因为这与旧提交相关(不一定与最近的提交相关)git push -f
filter-branch
,但我不知道如何:
test
功能中使用的rewrite-commit-date
在env-filter
中使用,但我不会在此处执行env-filter
,因为我不想更改与提交环境相关的任何内容,而是更改提交消息。 --msg-filter
需要原始提交消息。我不关心原始提交消息。是--force-msg-filter
还是类似?我正在寻找的内容类似于this,但有一些警告:
答案 0 :(得分:6)
这个小脚本的作用有以下几点:
这会将您的历史记录从提交重写到分支的顶端。因为您在问题中说明这不是问题,所以这符合条件。
您的提交包含在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