Git rebase:通过 运行 命令修复

Git rebase: fixup by running command

我所在的分支在我的 develop 分支之前有很多提交(在历史的直线上),并且在每个提交消息中都是我正在处理的问题跟踪票的名称在。现在我想通过每次提交进行变基并将该票证的名称更改为不同的票证,概念上类似于:

perl -pi -e 's/BB-123/BB-456/' .git/COMMIT_EDITMSG

有没有办法告诉 rebase 的 reword 操作,我想 运行 消息文本上的命令而不是打开交互式编辑器?

我想出的最好办法是在每次提交 运行s git commit --amend 之后放置一个 exec 操作并将 $EDITOR 变量更改为高于命令之类的,但这太可怕了。

如果没有一个好的自动解决方案,我通常会在每次提交时使用 reword 操作来变基并手动编辑所有消息。

是:当交互式 rebase 打开编辑器时,它会根据不同的环境设置打开一个编辑器:

  • GIT_SEQUENCE_EDITOR 用于对 运行 的 命令,但是
  • GIT_EDITOR 用于 reword 操作。

(如果其中一个未设置,Git 会像往常一样退回到 sequence.editorcore.editor 或内置编辑器。您可以更改这些设置,也许是暂时的,但环境变量更容易。)

因此您可以使用:

GIT_SEQUENCE_EDITOR=script1 GIT_EDITOR=script2 git rebase -i <arguments>

其中 script1edit 替换为 reword,而 script2 会执行您想要的 s/BB-123/BB-456/,例如。

您可能正在寻找 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

因此,您拥有从 developwip/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 的副本将写入 refs/original,因此您仍然可以访问预过滤版本:

$ git log refs/original/logs/refs/heads/wip/T1234
... version with #1234 still in place

显然,您要在删除原件之前仔细检查重写!