首页 > 解决方案 > 基于消息的壁球提交

问题描述

在我的本地开发环境中使用推送部署系统会产生大量提交,我不想将其推送到上游。

我想要一种更快、更自动的方法来将已自动生成的提交压缩到尚未自动生成的提交中。当我的日志看起来像这样时:

<<sha1>> (HEAD -> feature/in-development) Complete feature
<<sha2>> AUTO_COMMIT
<<sha3>> Add function foo()
<<sha4>> AUTO_COMMIT
<<sha5>> AUTO_COMMIT
<<sha6>> Remove function bar()

我想用AUTO_COMMIT消息压缩每一个提交,以实现:

<<sha-1>> (HEAD -> feature/in-development) Complete feature
<<sha-2>> Add function foo()
<<sha-3>> Remove function bar()

在“真实”提交之间存在可变数量(1-20 左右)的AUTO_COMMIT提交。

我一直在通过手动变基来做到这一点。git rebase --autosquash看起来这几乎是我想要的,但我自动生成的提交消息不包含所需的....

有没有更快的方法来压缩自动提交,还是我坚持手动变基?

标签: git

解决方案


git rebase -i命令会打开您的编辑器来编辑各种pick命令。好的,您已经知道这一点,这没什么大不了的,但也不是对您的问题有用的答案,对吧?好吧,这就是诀窍:它实际上很有用。

有用的方式是,在命令上git rebase -i打开的编辑器与 Git 的所有其他编辑器设置分开设置。具体来说,Git 使用or (如果设置了则首选后者,否则首选前者)。它只是在充满命令的文件上运行设置为的任何命令。(如果这两个都没有设置,Git 会退回到通常的//内置默认的,可能是 -编辑器。)picksequence.editor$GIT_SEQUENCE_EDITORpick$GIT_EDITORcore.editorvim

因此,您可以使用您喜欢的任何语言编写自己的脚本,并将其放入GIT_SEQUENCE_EDITORor sequence.editor

#! /usr/bin/env python
"""
python script to automate replacing `pick <<hash>> AUTO_COMMIT`
with `fixup ...`
"""

或者:

#! /bin/sh
# shell script to automate replacing ...

现在,您必须编写程序来执行此操作。它只需要打开名称是程序参数的文件,但是,在适当的时候pickfixuporsquash或您想要的任何内容替换,然后将其写回文件并退出。

然后,运行:

GIT_SEQUENCE_EDITOR=that_script git rebase -i ...

而不是运行vim或您的编辑器在pick命令上的任何内容,它运行您的脚本,替换正确的脚本并关闭它。如果您为任何替换选择了“squash”或“edit”,那不是“sequence editor”操作的一部分,因此它使用常规的 Git 编辑器并且仍然运行vim或其他。

为自己创建一个小别名或脚本,以这种方式运行 rebase,一切就绪。


推荐阅读