Какой самый быстрый способ редактировать сотни сообщений 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
В качестве альтернативы рассмотрите возможность пропуска импорта всего репозитория. Я бы просто проверил, очистил и зафиксировал важные моменты в истории.