我进行了一个交互式的变基,直到提交abcdef
。
git rebase -i abcdef
在编辑器 Vim 中,我使用以下命令将所有代码行 pick hash
更改为
reword hash PREFIX:原提交信息
%s/pick \(\w\{7}\)/reword \1 PREFIX:/
但接下来 git 会提示我为每个提交编辑消息。是否有简单的方法批处理此过程?
GIT_EDITOR='sed -i "1s/^/PREFIX: /"' GIT_SEQUENCE_EDITOR=vim \
git rebase -i abcdef
git -c core.editor='sed -i "1s/^/PREFIX: /"' \
-c sequence.editor=vim \
rebase -i abcdef
如果您不想使用环境覆盖,则可以不使用。
如果您知道您将要重新编写它们,甚至可以使用sed序列:GIT_SEQUENCE_EDITOR='sed -i "s/^pick/reword/"'
。
使用只有git
的替代答案:
git rebase -i --exec 'git commit --amend -m "PREFIX: $(git show -s --format=%s)"' origin/master
您也可以非交互式地执行此操作(不使用-i
标志)。 然后在交互窗口中,您可以在每个应不应用前缀的提交之后删除执行指令。
说明:
使用rebase --exec
,您可以为每个提交执行一个命令,这在很多情况下都很有用。
使用git commit --amend -m <MESSAGE>
,您可以更改当前提交的消息。
使用git show -s --format=%s
,您可以显示当前提交消息。
将它们组合起来:
要添加消息前缀,我们必须获取当前消息(3),并使用修改(2)更改当前消息,即git commit --amend -m "PREFIX: $(git show -s --format=%s)"
。 双引号很重要,这样命令就会在消息字符串内执行。
要对重新设置基础(此处基于您的origin/master
分支)中的每个提交执行此操作,您可以在每个提交上执行(4),使用单引号,否则每个提交都将获取上一个提交的消息,然后您就可以得到上面的命令。
git commit --amend
;对于块重排、合并省略和轻度重写,使用git rebase -i
;对于批量处理而不是块重排且重定位开销开始变得重要的情况,使用git filter-branch
。 - jthillsed -i "1s/^/PREFIX: /"
,如上所述。 - jthodges