Перед публикацией проекта я хотел бы очистить хранилище, что означает:

  • удаление всех коммитов старше определенного тега (но остальная часть истории и текущая версия остаются без изменений)
  • изменение имени автора и коммиттера и адреса электронной почты на что-то значимое

Дерево довольно простое, есть только одна ветвь (кроме другой, которая меня не интересует). Но есть следующие осложнения:

  • У меня есть теги (с описаниями), которые я хочу сохранить (но и здесь имя тегера и адрес электронной почты должны быть изменены при сохранении отметки времени)
  • У меня есть ссылки (сообщения коммита типа «исправляет ошибку, введенную в коммите X»), которые необходимо адаптировать
  • У меня есть заметки (например, «оказалось, что это привело к ошибке, исправленной в коммите Y»), которую я хочу сохранить

Я нашел этот ответ, чтобы обрезать историю:

$ git checkout --orphan temp <newroot-sha1>
$ git commit -C <newroot-sha1>
$ git commit --ammend
$ git rebase --onto temp <newroot-sha1> master
$ git checkout master
$ git branch -d temp

Хотя это обрезает начало по желанию, оно создает новую историю без тегов и заметок, и ссылки не обновляются. Я пробовал git rebasetags, но он не хранит описания тегов и присваивает тегам неправильный коммит, если два коммита имеют одно и то же сообщение. Это не касается вопроса заметок и ссылок.

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

$ git filter-branch --env-filter '
WRONG_EMAIL="old-email"
NEW_NAME="new-name"
NEW_EMAIL="new-email"

if [ "$GIT_COMMITTER_EMAIL" = "$WRONG_EMAIL" ]
then
    export GIT_COMMITTER_NAME="$NEW_NAME"
    export GIT_COMMITTER_EMAIL="$NEW_EMAIL"
fi
if [ "$GIT_AUTHOR_EMAIL" = "$WRONG_EMAIL" ]
then
    export GIT_AUTHOR_NAME="$NEW_NAME"
    export GIT_AUTHOR_EMAIL="$NEW_EMAIL"
fi
' --tag-name-filter cat -- --branches --tags

Как я могу обрезать историю и изменить имя и адрес электронной почты всех коммитов и тэгов, сохраняя при этом тэги и заметки (и их временные метки), и обновлять шейд-идентификаторы коммитов, упомянутые в сообщениях и коммитах коммитов? (Я не вижу возможности показать автора заметки. Есть ли заметки у автора? Если так, я бы тоже хотел это изменить.)

0