Какой самый быстрый способ редактировать сотни сообщений Git?

У меня довольно большой репозиторий Git с тысячами коммитов, первоначально импортированных из SVN. Прежде чем я сделаю свою публикацию репо, я хотел бы очистить несколько сотен сообщений фиксации, которые не имеют смысла в моем новом репо, а также удалить весь этот git -svn информационный текст, который был добавлен.

Я знаю, что я могу использовать 'git rebase -i', а затем 'git commit -amend' для редактирования каждого отдельного сообщения фиксации, но с сотнями сообщений для редактирования, что огромная боль в вы знаете что.

Есть ли более быстрый способ редактировать все эти сообщения? В идеале у меня было бы каждое сообщение фиксации, перечисленное в одном файле, где я мог бы редактировать их все в одном месте.

Спасибо!

Ответы

Ответ 1

Это легко сделать следующим образом:

  • Выполните первый импорт.
  • Экспортировать все коммиты в текст:

    git format-patch -10000
    

    Число должно быть больше, чем сумма. Это создаст множество файлов с именем NNNNN-commit-description.patch.

  • Отредактируйте эти файлы с помощью script. (Ничего не трогайте в них, кроме верхней части с сообщениями фиксации).
  • Скопируйте или переместите отредактированные файлы в пустой git репозиторий или ветвь.
  • Импортировать все отредактированные записи:

    git am *.patch
    

Это будет работать только с одной ветвью, но работает очень хорошо.

Ответ 2

Это старый вопрос, но, поскольку нет упоминания о git filter-branch, я просто добавляю свои два цента.

Недавно мне пришлось массово заменить текст в сообщении фиксации, заменив блок текста на другой, не изменяя остальные сообщения фиксации. Например, мне пришлось заменить Refs: #xxxxx на Refs: # 22917.

Я использовал git filter-branch как этот

git filter-branch --msg-filter 'sed "s/Refs: #xxxxx/Refs: #22917/g"' master..my_branch
  • Я использовал параметр --msg-filter для редактирования только сообщения фиксации, но вы можете использовать другие фильтры для изменения файлов, редактирования полной информации о комплинге и т.д.
  • Я ограничил filter-branch, применив его только к коммитам, которые не были в master (master..my_branch), но вы можете применить его на всей ветки, опуская диапазон коммитов.

Как указано в документе, попробуйте это на копии своего ветки. Надеюсь, что это поможет.


Источники, используемые для ответа

Ответ 3

Большой и простой способ сделать это - использовать git filter-branch --msg-filter "" с python script.

python script будет выглядеть примерно так:

import os
import sys
import re

pattern = re.compile("(?i)Issue-\d{1,4}")


commit_id = os.environ["GIT_COMMIT"]
message   = sys.stdin.read()

if len(message) > 0:

    if pattern.search(message):
        message = pattern_conn1.sub("Issue",message)

print message

Вызов командной строки, который вы бы сделали, это git filter-branch -f --msg-filter "python /path/to/git-script.py"

Ответ 4

Вы можете использовать git rebase -i и заменить pick на reword (или просто r). Затем git перезагрузка останавливается при каждой фиксации, что дает вам возможность редактировать сообщение.

Единственными недостатками являются то, что вы не видите сразу все сообщения и что вы не можете вернуться при обнаружении ошибки.

Ответ 5

В качестве альтернативы рассмотрите возможность пропуска импорта всего репозитория. Я бы просто проверил, очистил и зафиксировал важные моменты в истории.