代码之家  ›  专栏  ›  技术社区  ›  simont basooli

挤压基于消息的提交

git
  •  2
  • simont basooli  · 技术社区  · 7 年前

    在本地开发环境中使用push-to-deploy系统会生成大量提交,我不想将其推到上游。

    我想要一种更快、更自动的方法,将自动生成的提交压缩到没有自动生成的提交中。当我的日志看起来像:

    <<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左右)的 自动提交 在“实际”提交之间提交。

    我一直在通过手动重新平衡来实现这一点。 git rebase --autosquash 看起来这几乎是我想要的,但是我自动生成的提交消息不包含 ... .

    有没有一种更快的方法来消除自动提交,还是我一直在手动重新平衡?

    1 回复  |  直到 7 年前
        1
  •  3
  •   torek    7 年前

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

    有用的方法是编辑 Git ReBase-Ⅰ 打开的 挑选 命令被设置 分别地 来自Git的所有其他编辑器设置。具体来说,Git使用 sequence.editor $GIT_SEQUENCE_EDITOR (如果已设置,则优先选择后者,否则优先选择前者)。它只需在文件中运行设置为的任何命令, 挑选 命令。(如果这两个都没有设置,Git就会恢复正常 $GIT_EDITOR / core.editor /内置默认值,可能- vim 编辑。

    因此,您可以用您喜欢的任何语言编写自己的脚本,并将其放入 GIT_SEQUENCE_EDITOR 顺序编辑器 :

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

    或:

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

    现在,你 必须编写程序才能执行此操作。它只需要打开文件,文件名是程序的参数,但是,替换 挑选 具有 fixup squash 或者在适当的时候,写回文件并退出。

    然后,运行:

    GIT_SEQUENCE_EDITOR=that_script git rebase -i ...
    

    而不是跑步 vim 或者你的编辑在 挑选 命令,它运行您的脚本,替换正确的脚本并关闭它。如果您已经为任何替换选择了“squash”或“edit”,那么这不是“sequence edit or”操作的一部分,因此使用常规的git编辑器仍然可以运行 vim 或者什么。

    做一个小别名或脚本以这种方式运行REBASE,您就一切就绪了。