【问题标题】:Git interactive rebase without opening the editorGit 交互式 rebase 无需打开编辑器
【发布时间】:2015-05-19 14:47:22
【问题描述】:

Git 允许某些命令在不先打开编辑器的情况下创建或修改提交,例如:

git commit --amend --no-edit
git commit --fixup=HEAD^

我已将rebase.autosquash 设置为true,因此交互式变基的待办事项列表会自动重新排序。有没有办法在不先打开编辑器的情况下立即执行变基,例如:

git rebase -i --no-edit HEAD~3

【问题讨论】:

  • 我很好奇,你为什么不想要编辑器?
  • @TimCastelijns 也许用于服务器端的批处理操作。问题是,为什么--autosquash 需要--interactive...

标签: git rebase git-rebase


【解决方案1】:

TL;博士回答:GIT_SEQUENCE_EDITOR=: git rebase -i HEAD~3

您无法阻止git rebase --interactive 运行“序列编辑器”(即“序列文件”上的编辑命令,其中包含各种选择等命令)。但是,如果您检查交互式变基脚本:

$ vim $(git --exec-path)/git-rebase--interactive

你会在第 230 行左右找到这样的代码:

git_sequence_editor () {
    if test -z "$GIT_SEQUENCE_EDITOR"
    then
        GIT_SEQUENCE_EDITOR="$(git config sequence.editor)"
        if [ -z "$GIT_SEQUENCE_EDITOR" ]
        then
            GIT_SEQUENCE_EDITOR="$(git var GIT_EDITOR)" || return $?
        fi
    fi

    eval "$GIT_SEQUENCE_EDITOR" '"$@"'
}

因此,您只需将序列编辑器设置为不执行任何操作然后成功的“编辑”命令,例如 shell 内置的: 命令或true 命令。

$GIT_SEQUENCE_EDITOR、配置的sequence.editor$GIT_EDITOR 中的任何一个都足够了,尽管显然最好使用第一个。)

【讨论】:

  • 这会阻止它运行,但并不等同于运行编辑器并输入:wq——也就是说,编辑器没有运行,但是rebase 没有完成。我在一个 shell 函数的 git 别名中运行它,如果这很重要:cadd = "!f() { git commit --fixup=$1; GIT_SEQUENCE_EDITOR=: git rebase -i --autosquash $1^; }; f"
  • @Jonah:奇怪……你有详细的例子吗?
【解决方案2】:

作为 toreksolution (GIT_SEQUENCE_EDITOR=:) 的说明,请参阅 Git 2.21(2019 年 2 月):

当设置GIT_SEQUENCE_EDITOR 时,当“git rebase”模式运行隐式使用机器进行交互式变基时,命令启动错误,已更正。

参见 Phillip Wood (phillipwood)commit 891d4a0(2019 年 1 月 28 日)。
(由 Junio C Hamano -- gitster -- 合并到 commit 69dd6e5,2019 年 2 月 5 日)

隐式交互式变基:不要运行序列编辑器

如果设置了GIT_SEQUENCE_EDITOR,那么 rebase 会在执行时运行它 应该出现的隐式交互式变基 对用户不具有交互性。
通过设置GIT_SEQUENCE_EDITOR=: 而不是GIT_EDITOR=:. 来解决此问题


Git 2.29(2020 年第四季度)记录了该环境变量。

参见Philippe Blain (phil-blain)commit 902a126(2020 年 8 月 31 日)。
(由 Junio C Hamano -- gitster -- 合并于 commit ed9d833,2020 年 9 月 3 日)

doc:提及 GIT_SEQUENCE_EDITOR 和 'sequence.editor' 更多

签字人:Philippe Blain

821881d88d中添加的环境变量GIT_SEQUENCE_EDITOR和配置变量'sequence.editor'(“rebase -i”:支持专用编辑器编辑insn表,2011-10-17) , 在 [git config](https://github.com/git/git/blob/902a126eca2d46b34dab822f1a1861bc2ce3cf48/Documentation/git-config.txt)<sup>([man](https://git-scm.com/docs/git-config))</sup> 手册页中提到,但在其他任何地方都没有提到。

GIT_SEQUENCE_EDITOR添加到git的环境变量列表中。

git 现在包含在其man page 中:

GIT_SEQUENCE_EDITOR:

此环境变量会覆盖配置的 Git 编辑器 编辑交互式变基的待办事项列表时。
另请参阅git rebasegit config 中的sequence.editor 选项。

【讨论】:

    【解决方案3】:

    您可以使用-c 将配置传递给git,而不是使用GIT_SEQUENCE_EDITOR 环境变量:

    git -c sequence.editor=: rebase --autosquash --interactive origin/master
    

    适用于从编辑器中触发无编辑器变基(即,在 vim 中使用逃犯的 :Git 命令)。

    【讨论】:

      猜你喜欢
      • 2021-01-24
      • 1970-01-01
      • 1970-01-01
      • 2013-06-26
      • 1970-01-01
      • 2015-04-24
      • 2015-01-29
      • 2011-09-23
      • 1970-01-01
      相关资源
      最近更新 更多