git: как автоматизировать интерактивную перебазировку / замену эквивалентными командами git

Мне нужно автоматизировать интерактивную перебазировку или заменить ее другими командами. Просто позвольте мне объяснить мою текущую ситуацию:

При переходе svn-> git мне нужно переустановить только что созданный репозиторий git, чтобы исправить «отсечки истории», сделанные во время SVN. Вот мой ручной рабочий процесс по устранению проблемы.

branchNEW: containing history from SOMEDAY until now
branchOLD: containing history from past to SOMEDAY

ИЗМЕНИТЬ или ascii:

branchNEW:        Y - Z
branchOLD: W - X

Обе ветки не имеют общих коммитов.

Основная идея теперь состоит в том, чтобы просто переназначить branchNEW на branchOLD. К сожалению, СЕГОДНЯ был проведен некоторый рефакторинг: некоторые файлы были перемещены в другой каталог. Результатом перебазирования является то, что каждый перемещенный файл существует в обоих местах.

ИЗМЕНИТЬ

some file exist in X 
the (nearly) same files also exist in Y, just on another path

branchNEW: W - X - Y - Z
(after rebase)

После перебазирования HEAD теперь содержит файлы X и Y. Я также попытался добавить новую фиксацию в branchOLD, которая удаляет старые файлы. После перебазирования SVN-HEAD и git-HEAD бинарно идентичны, но «git log --follow» не работает.

Теперь к основной проблеме: я могу исправить это, используя вторую интерактивную перестановку:

git rebase -i SHA

SHA - это sha-id старой корневой фиксации в branchNEW. Теперь в редакторе мне нужно изменить «выбрать» на «редактировать» для самого верхнего коммита. После выхода из редактора мне теперь нужно удалить не те файлы

git rm -f fileA fileB
git commit --amend
git rebase --continue

После этого HEAD git становится двоичным, идентичным заголовку SVN, и, кроме того, git имеет полную историю, а также "git log --follow" работает для перемещенных файлов.

Поскольку этот шаг - лишь небольшая часть огромного перехода на VCS в будущем, мне нужно написать сценарий всего процесса. Но как автоматизировать описанные выше действия?

(я знаю, что SHA не останется прежним, но я могу получить требуемый SHA из svn-id, который встроен в каждое сообщение фиксации)


person Henning    schedule 19.09.2014    source источник
comment
Я не уверен, но, возможно, git filter-branch мог бы вам помочь.   -  person jub0bs    schedule 19.09.2014


Ответы (2)


Я нашел возможное решение:

git rebase --interactive отправляет "список коммитов rebase" (список, в котором вы можете выбирать, хранить, редактировать и т. д.) редактору. Какой редактор можно настроить. Таким образом, решение состоит в том, чтобы настроить альтернативный «редактор» только для этой интерактивной перебазировки. Это можно сделать с помощью переменной окружения GIT_SEQUENCE_EDITOR:

GIT_SEQUENCE_EDITOR="command" git rebase -i SHA

command может быть сценарием оболочки или просто sed:

GIT_SEQUENCE_EDITOR="sed -i 's/^pick ce5efdb /edit ce5efdb /;/^pick ce6efdb /d'" git rebase -i SHA

Важно: «Список коммитов перебазирования» передается в виде файла команде. Таким образом, команда должна принимать имя файла в качестве параметра и записывать результат в тот же файл. «sed -i» именно это и делает.

person Henning    schedule 19.09.2014
comment
Мне нужно автоматизировать сжатие нескольких исторических коммитов в репозитории, чтобы создать сценарий, который будет выполнять все необходимые операции для миграции с svn в качестве доказательства концепции, которую другие участники проекта могут использовать полностью воспроизводимым образом для проверки что миграция правильная. Это просто идеально. - person Irfy; 19.05.2016

expect также может вам помочь. Хотя это не совсем то, что вам нужно сделать, вы должны иметь возможность использовать что-то подобное для автоматизации своего процесса:

#!/usr/bin/env expect
spawn git rebase -i HEAD~2

# change the second "pick" to "squash"
# jump to top (if not there), down, delete word, insert 's' (for squash), Escape, save and quit
send "ggjdwis \033:wq\r"

expect "# This is a"

# skip past first commit message (assumed to be one line), delete rest of file
# down 4, delete 3 lines, save and quit
send "4j3d:wq\r"

interact
person erwaman    schedule 06.02.2018