更改特定提交的提交消息
Change commit message for specific commit
注意:与 this one 类似的问题,但有一些重要的变化。
我有以下函数来重写提交日期,给定提交 ID:
rewrite-commit-date () {
local commit=""
local newdate=""
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
,但我不确定如何:
- apply the change to a specific commit:
rewrite-commit-date
函数中使用的test
在env-filter
中使用,但我不打算在这里做env-filter
,因为我不想更改与提交环境相关的任何内容,而是更改提交消息。
- 如何强制提交消息?
--msg-filter
需要原始提交消息。我不关心原始提交消息。是否有 --force-msg-filter
或类似的?
我要查找的内容与 this 类似,但有一些注意事项:
- 不要将更改应用于一系列提交,而是应用于特定的提交
- 我不关心原始提交消息,因为我想完全覆盖它
考虑到以下注意事项,这个小脚本可以正常工作:
这将重写您从提交到分支顶端的历史记录。因为你在问题中说这不是问题,那么这就合格了。
您的提交包含在 master
分支中。您可以通过将分支名称作为另一个参数传递来轻松更改此设置,但该提交 better 位于分支中。您可能应该为此构建一些验证,也许使用 git rev-parse --abbrev-ref HEAD
or maybe
事不宜迟:
#!/bin/bash
change-commit-msg(){
commit=""
newmsg=""
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
注意:与 this one 类似的问题,但有一些重要的变化。
我有以下函数来重写提交日期,给定提交 ID:
rewrite-commit-date () {
local commit=""
local newdate=""
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
,但我不确定如何:- apply the change to a specific commit:
rewrite-commit-date
函数中使用的test
在env-filter
中使用,但我不打算在这里做env-filter
,因为我不想更改与提交环境相关的任何内容,而是更改提交消息。 - 如何强制提交消息?
--msg-filter
需要原始提交消息。我不关心原始提交消息。是否有--force-msg-filter
或类似的?
- apply the change to a specific commit:
我要查找的内容与 this 类似,但有一些注意事项:
- 不要将更改应用于一系列提交,而是应用于特定的提交
- 我不关心原始提交消息,因为我想完全覆盖它
考虑到以下注意事项,这个小脚本可以正常工作:
这将重写您从提交到分支顶端的历史记录。因为你在问题中说这不是问题,那么这就合格了。
您的提交包含在
master
分支中。您可以通过将分支名称作为另一个参数传递来轻松更改此设置,但该提交 better 位于分支中。您可能应该为此构建一些验证,也许使用git rev-parse --abbrev-ref HEAD
or maybe
事不宜迟:
#!/bin/bash
change-commit-msg(){
commit=""
newmsg=""
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