Git интерактивная перебазировка без открытия редактора

Git позволяет определенным командам создавать или изменять коммиты без предварительного открытия редактора, например:

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

Я установил rebase.autosquash в true, чтобы список задач для интерактивной перебазировки автоматически переупорядочивался. Есть ли способ немедленно выполнить перебазирование, не открывая сначала редактор, например:

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

person friederbluemle    schedule 17.03.2015    source источник
comment
Мне интересно, а почему вам не нужен редактор?   -  person Tim    schedule 17.03.2015
comment
@TimCastelijns Может быть, для пакетных операций на стороне сервера. Вопрос в том, почему --autosquash требует --interactive...   -  person musiKk    schedule 17.03.2015


Ответы (3)


TL;DR ответ: 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" '"$@"'
}

Таким образом, вам просто нужно настроить редактор последовательности на команду «редактировать», которая ничего не делает, а затем завершается успешно, например, встроенная в оболочку команда : или команда true.

(Для этого подойдет любой из $GIT_SEQUENCE_EDITOR, сконфигурированный sequence.editor или $GIT_EDITOR, хотя очевидно, что лучше всего использовать первый.)

person torek    schedule 17.03.2015
comment
Это останавливает его запуск, но это не эквивалентно запуску редактора и вводу :wq, то есть редактор не запускается, но перебазирование не завершается. Я запустил его в псевдониме git для функции оболочки, если это имеет значение: cadd = "!f() { git commit --fixup=$1; GIT_SEQUENCE_EDITOR=: git rebase -i --autosquash $1^; }; f" - person Jonah; 21.10.2016
comment
@Jonah: Странно... у тебя есть пример с подробностями? - person torek; 21.10.2016

В качестве иллюстрации torek решение (GIT_SEQUENCE_EDITOR=:) см. Git 2.21 (февраль 2019 г.):

При установке GIT_SEQUENCE_EDITOR команда неправильно запускалась при запуске режимов git rebase, которые неявно используют механизм для интерактивной перебазировки, что было исправлено.

См. commit 891d4a0 (28 января 2019 г.) от Филлип Вуд (phillipwood).
(объединено Хунио C Хамано -- gitster -- в commit 69dd6e5, 05 февраля 2019 г.)

неявная интерактивная перебазировка: не запускать редактор последовательности

Если установлено GIT_SEQUENCE_EDITOR, то rebase запускает его при выполнении неявных интерактивных переустановок, которые должны казаться неинтерактивными для пользователя.
Исправьте это, установив GIT_SEQUENCE_EDITOR=:, а не GIT_EDITOR=:.


Git 2.29 (4 квартал 2020 г.) документирует эту переменную среды.

См. commit 902a126 (31 августа 2020 г.) от Филипп Блен (phil-blain).
(объединено Хунио С. Хамано -- gitster -- в commit ed9d833, 03 сентября 2020 г.)

doc: упомяните GIT_SEQUENCE_EDITOR и 'sequence.editor' еще

Подписал: Филипп Блен

Переменная среды GIT_SEQUENCE_EDITOR и переменная конфигурации sequence.editor, которые были добавлены в 821881d88d. (rebase -i: поддержка специального редактора для редактирования листа insn, 17.10.2011), упоминаются на справочной странице [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 теперь включает в свою справочную страницу:

GIT_SEQUENCE_EDITOR:

Эта переменная среды переопределяет настроенный редактор Git при редактировании списка задач интерактивной перебазировки.
См. также git rebase и параметр sequence.editor в git config.

person VonC    schedule 03.03.2019

Вместо использования переменной среды GIT_SEQUENCE_EDITOR вы можете использовать -c для передачи конфигурации в git:

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

Хорошо работает для запуска ребаз без редактора из вашего редактора (например, с помощью команды fugitive :Git в vim).

person idbrii    schedule 19.06.2021