Как запустить 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
и delete
→ drop
которые ИМО выходят из этой области script.