Как запустить git rebase -interactive в неинтерактивном режиме?

Можно ли сделать следующее?

  • Сделайте git rebase --interactive только для вывода стандартного шаблона в файл, а затем для вывода в файл и открытия его в редакторе.
  • Позвольте пользователю отредактировать файл.
  • Позвольте пользователю повторно запустить git rebase с именем редактируемого файла.
  • Продолжайте с обычным процессом переадресации.

Usecase: скриптовая перезагрузка, конечно. См. как, например, переупорядочить коммит в Git не интерактивно.

Ответ 1

После некоторых размышлений и исследований ответ оказался тривиальным: git rebase -i берет имя редактора из хорошо известных переменных среды EDITOR/VISUAL, так что переопределение, указывающее на неинтерактивный скрипт, делает свою работу.

Тем не менее, EDITOR/VISUAL безразлично применяется к списку коммитов, коммитов при переписывании и всего остального. Итак, начиная с http://git.kernel.org/?p=git/git.git;a=commit;h=821881d88d3012a64a52ece9a8c2571ca00c35cd, существует специальная переменная среды GIT_SEQUENCE_EDITOR, которая применяется только к списку коммитов.

Итак, рецепт для переупорядочения или сглаживания коммитов:

Выполнить: GIT_SEQUENCE_EDITOR=<script> git rebase -i <params>. Ваш <script> должен принять один аргумент: путь к файлу, содержащему стандартный список фиксации rebase. Следует переписать его на месте и выйти. Обычная обработка rebase происходит после этого.

Ответ 2

Добавляя к @pfalcon ответ, вы можете использовать sed как ваш GIT_SEQUENCE_EDITOR. Например, я хотел отредактировать каждую фиксацию, поэтому я сделал следующее:

GIT_SEQUENCE_EDITOR="sed -i -re 's/^pick /e /'" git rebase -i

Ответ 3

Расширение ответа pfalcon:

Запустите GIT_SEQUENCE_EDITOR=<script> git rebase -i <params>. <script> должен принимать единственный аргумент - путь к файлу, содержащему стандартный список фиксации переадресации. script должен переписать его на место и выйти. После этого происходит обычная обработка переадресации.

Если у вас есть переменная среды, которая содержит нужное содержимое:

GIT_SEQUENCE_EDITOR='echo "$REBASE_DATA" >' git rebase -i [<additional params>]

Также будет работать ссылка на файл:

GIT_SEQUENCE_EDITOR='cat rebase_data_file >' git rebase -i [<additional params>]

Ответ 4

Я использую этот script (в добавлении он позволяет упростить фиксацию фиксации):

#!/bin/bash

ACTION=$1
COMMIT=$(git rev-parse --short $2)
[[ "$COMMIT" ]] || exit 1
CORRECT=
for A in p pick r reword e edit s squash f fixup x exec d delete t split; do
     [[ $ACTION == $A ]] && CORRECT=1
done 
[[ "$CORRECT" ]] || exit 1
if [[ $ACTION == "delete" || $ACTION == "d" ]]; then
    GIT_SEQUENCE_EDITOR="sed -i -e '/^pick $COMMIT/d'" git rebase -i $COMMIT^^
elif [[ $ACTION == "split" || $ACTION == "t" ]]; then
    GIT_SEQUENCE_EDITOR="sed -i -e 's/^pick $COMMIT/edit $COMMIT/'" git rebase -i $COMMIT^^ || exit 1
    git reset --soft HEAD^
    echo "Hints:"
    echo "  Select files to be commited using 'git reset', 'git add' or 'git add -p'"
    echo "  Commit using 'git commit -c $COMMIT'"
    echo "  Finish with 'git rebase --continue'"
else
    GIT_SEQUENCE_EDITOR="sed -i -e 's/^pick $COMMIT/$1 $COMMIT/'" git rebase -i $COMMIT^^
fi

Добавьте псевдоним в ваш .gitconfig:

[alias]
  autorebase = ! path_to_your_script

Ответ 5

интерактивные режимы запускают заданный редактор для работы с.
используемый редактор можно получить с помощью:

git config --get core.editor

Итак, если вы установите неинтерактивный редактор - это редактор, который принимает команды на stdin, вы можете работать с --interactive неинтерактивным способом:)
Я точно знаю, что vim принимает команды, а также стандартный редактор ed, конечно.

поэтому держите интерактивный редактор (если хотите)

$ ied="$(git config --get core.editor)"

установить неинтерактивный редактор

$ git config --unset-all core.editor
$ git config --add core.editor ed

и работать с ним.

$ printf '%s\n' "some-ed-cmd" "another-ed-cmd" "wq" | git rebase -i HEAD~5

и восстановить редактор (если требуется)

$ git config --unset-all core.editor
$ git config --add core.editor "$ied"

Ответ 6

Вы можете использовать touch в качестве редактора, который коснется файла, поэтому он будет изменен. Например

GIT_SEQUENCE_EDITOR=touch git rebase -i [commit]

Чтобы псевдоним, данный baseline как тег, я хочу переустановить

git config alias.baseline '!GIT_SEQUENCE_EDITOR=touch git rebase -i baseline'

Псевдоним работает под Windows, потому что исполняемая оболочка bash not cmd.

Ответ 7

Как уже упоминалось, вам нужно предоставить пользовательское значение GIT_SEQUENCE_EDITOR, которое изменит файл интерактивной перебазировки. Если вы просто хотите выполнить действие с одним коммитом, вы можете сделать это следующим образом:

# Runs "edit" on HEAD~3
GIT_SEQUENCE_EDITOR="sed -i -ze 's/^pick/edit/'" git rebase -i HEAD~3

В качестве альтернативы, здесь есть функция для обобщения этого:

# Usage: git-rebase-custom edit HEAD~3
git-rebase-custom() {
    local action=$1
    shift

    GIT_SEQUENCE_EDITOR="sed -i -ze 's/^pick/$action/'" git rebase -i "[email protected]"
}

Ответ 8

Я нашел решение. Вы можете использовать:

$ GIT_SEQUENCE_EDITOR=true git rebase -i --autosquash $COMMIT_HASH~1

Ответ 9

На основе ответа Jezz, Я создал оболочку-агностик script (GitReb) который работает с изменениями с несколькими аргументами, :/<text>, root commit, а также выполняет некоторые проверки работоспособности.

Я также упростил и удалил действие t/split и deletedrop которые ИМО выходят из этой области script.