我位于develop
分支之前有很多提交(沿历史直线)的分支上,并且在每个提交消息中都是我正在处理的问题跟踪票证的名称。现在,我想在每次提交时重新设置基础,并将该票证的名称更改为其他票证,概念上类似于:
perl -pi -e 's/BB-123/BB-456/' .git/COMMIT_EDITMSG
有没有办法告诉rebase的reword
操作,而不是打开交互式编辑器,而是要对消息文本运行命令?
我想出的最好办法是,在每次运行exec
的提交并将git commit --amend
变量更改为上述命令之类的内容后,放置一个$EDITOR
动作,但这就是太可怕了。
在没有好的自动解决方案的情况下,我通常会在每次提交时以reword
操作为基础,并手动编辑所有消息。
答案 0 :(得分:2)
是的:交互式资源库打开编辑器时,它会根据不同的环境设置打开一个:
GIT_SEQUENCE_EDITOR
用于运行命令,但是GIT_EDITOR
用于 reword 操作。(如果未设置其中之一,则Git会像往常一样退回到sequence.editor
或core.editor
或内置编辑器。您可以临时更改这些设置,但环境变量更容易)
因此您可以使用:
GIT_SEQUENCE_EDITOR=script1 GIT_EDITOR=script2 git rebase -i <arguments>
例如,script1
用edit
替换reword
,而script2
执行您想要的s/BB-123/BB-456/
。
答案 1 :(得分:1)
您可能正在寻找git filter-branch
。假设您的日志如下所示:
* commit 7534b4609b84b87232ad933c83d5b802adfe2814 (HEAD -> wip/T1234)
|
| More work on ticket #1234
|
* commit e23ef0941b7a52dbb46876db4c985a1c30ec5e16
|
| Some work on ticket #1234
|
* commit b660a05e4d90fc8ae61b7d39e716ee3cdcc382ec (develop)
|
| Current develop branch head
|
* commit 1b67c0b8b1b4f4c22ddc38ba78c499dde749006f
Initial commit
因此,您具有从develop
到wip/T1234
的直线提交历史记录。您意识到票证应该读为#1236,因此您可以运行:
$ git filter-branch --msg-filter 'sed -e s/1234/1236/g' \
> develop..wip/T1234
Rewrite 7534b4609b84b87232ad933c83d5b802adfe2814 (2/2) (0 seconds passed,
remaining 0 predicted)
Ref 'refs/heads/wip/T1234' was rewritten
$
现在提交已被重写:
* commit c30e8becea1221d563d2be0e5a8c048c2c5bf608 (HEAD -> wip/T1234)
|
| More work on ticket #1236
|
* commit 0417b49944b3c9311031a657bc8be3c8bf05b54d
|
| Some work on ticket #1236
|
* commit b660a05e4d90fc8ae61b7d39e716ee3cdcc382ec (develop)
|
| Current develop branch head
|
* commit 1b67c0b8b1b4f4c22ddc38ba78c499dde749006f
Initial commit
原始裁判的副本将被写入refs/original
,因此您仍然可以访问预先过滤的版本:
$ git log refs/original/logs/refs/heads/wip/T1234
... version with #1234 still in place
很显然,您要在删除原稿之前仔细检查重写内容!