Переменная GIT_SEQUENCE_EDITOR
изначально использовалась для изменения редактора. В эту переменную можно передать сценарий, чтобы использовать git rebase -i
неинтерактивным образом. Итак, можно использовать:
GIT_SEQUENCE_EDITOR="sed -i -re 's/^pick 134567/e 1234567/'" git rebase -i 1234567^
Эта команда запустит sed
в файле, предоставленном git rebase -i
. Он изменит строку pick 134567
на e 1234567
(и, таким образом, отредактируйте фиксацию 1234567). Вы можете изменить e
с помощью r
(переработка), f
(исправление), s
(сквош) или d
(сброс) (последнее не поддерживается старыми версиями git
).
Исходя из этого, я написал скрипт, который автоматизирует эту задачу:
#!/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 d drop t split; do
[[ $ACTION == $A ]] && CORRECT=1
done
[[ "$CORRECT" ]] || exit 1
git merge-base --is-ancestor $COMMIT HEAD || exit 1
if [[ $ACTION == "drop" || $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
Первым аргументом должно быть одно действие. В сценарии используются те же имена действий, что и в git-rebase. Он также добавляет действие «split» (и позволяет использовать drop
со старыми версиями git).
Он также проверяет, является ли запрашиваемая вами фиксация предком HEAD. Это распространенная (и действительно досадная) ошибка с rebase -i
.
Второй аргумент - это фиксация, которую нужно отредактировать / удалить / разделить / перефразировать.
Затем вы добавляете псевдоним в свой .gitconfig:
[alias]
autorebase = ! path_to_your_script
person
Jérôme Pouiller
schedule
09.10.2013