Git rebase: исправление с помощью команды - PullRequest
0 голосов
/ 27 августа 2018

Я нахожусь на ветке, которая много коммитов (по прямой истории) опережает мою ветку develop, и в каждом сообщении о коммитах есть имя заявки на отслеживание проблем, над которой я работаю. Теперь я хочу пройти через каждый коммит и изменить имя этого тикета на другой тикет, концептуально что-то вроде:

perl -pi -e 's/BB-123/BB-456/' .git/COMMIT_EDITMSG

Есть ли способ сообщить действию rebase reword, что вместо открытия интерактивного редактора я хочу вместо этого запустить команду для текста сообщения?

Лучшее, что я придумал, - это помещать действие exec после каждого коммита, который запускает git commit --amend и заменяет переменную $EDITOR на указанную выше команду или что-то в этом роде, но это довольно ужасно.

Без хорошего автоматического решения я обычно перезагружаюсь с действием reword на каждый коммит и редактирую все сообщения вручную.

Ответы [ 2 ]

0 голосов
/ 27 августа 2018

Вы, вероятно, ищете git filter-branch. Предположим, ваш журнал выглядит так:

* commit 7534b4609b84b87232ad933c83d5b802adfe2814 (HEAD -> wip/T1234)
|
|     More work on ticket #1234
|
* commit e23ef0941b7a52dbb46876db4c985a1c30ec5e16
|
|     Some work on ticket #1234
|
* commit b660a05e4d90fc8ae61b7d39e716ee3cdcc382ec (develop)
|
|     Current develop branch head
|
* commit 1b67c0b8b1b4f4c22ddc38ba78c499dde749006f

      Initial commit

Итак, у вас прямая история коммитов от develop до wip/T1234. Вы понимаете, что в билете должно быть написано # 1236, поэтому вы запускаете:

$ git filter-branch --msg-filter 'sed -e s/1234/1236/g' \
>    develop..wip/T1234
Rewrite 7534b4609b84b87232ad933c83d5b802adfe2814 (2/2) (0 seconds passed,
remaining 0 predicted)
Ref 'refs/heads/wip/T1234' was rewritten
$

и теперь коммиты переписаны:

* commit c30e8becea1221d563d2be0e5a8c048c2c5bf608 (HEAD -> wip/T1234)
|
|     More work on ticket #1236
|
* commit 0417b49944b3c9311031a657bc8be3c8bf05b54d
|
|     Some work on ticket #1236
|
* commit b660a05e4d90fc8ae61b7d39e716ee3cdcc382ec (develop)
|
|     Current develop branch head
|
* commit 1b67c0b8b1b4f4c22ddc38ba78c499dde749006f

      Initial commit

Копия оригинальных ссылок будет записана в refs/original, поэтому вы все равно сможете получить доступ к предварительно отфильтрованной версии:

$ git log refs/original/logs/refs/heads/wip/T1234
... version with #1234 still in place

Очевидно, что вы хотите тщательно проверить переписанные тексты перед удалением оригиналов!

0 голосов
/ 27 августа 2018

Да: когда интерактивный ребаз открывает редактор, он открывает его на основе различных настроек среды:

  • GIT_SEQUENCE_EDITOR используется для команд для запуска , но
  • GIT_EDITOR используется для reword операций.

(Если один из них не задан, Git возвращается к sequence.editor или core.editor или к встроенному редактору как обычно. Вы можете изменить эти настройки, возможно, временно, но переменная среды проще.)

Следовательно, вы можете использовать:

GIT_SEQUENCE_EDITOR=script1 GIT_EDITOR=script2 git rebase -i <arguments>

, где script1 заменяет edit на reword, а script2 делает, например, s/BB-123/BB-456/, который вы хотите.

...