Использование git filter-branch для перезаписи авторов / коммиттеров и одновременной фиксации сообщений - PullRequest
5 голосов
/ 28 июля 2010

У меня есть Git-репозиторий, изначально импортированный из Subversion.Часть информации автора / коммиттера неверна, что не является ошибкой Git, но в основном из-за небрежной фиксации с Subversion.

Я хотел бы использовать git filter-branch, чтобы переписать историюхранилище, исправление информации о коммиттере и авторе.

Проблема в том, что ... мне нужно убрать информацию об авторе из коммита сообщений .Насколько я могу судить, git filter-branch позволяет вам фильтровать и изменять информацию об авторе (с помощью --env-filter) и / или фильтровать сообщения о фиксации (с помощью --msg-filter), но не , чтобы сделатьоба одновременно, с информацией, разделяемой между различными фильтрами.

Так что я немного озадачен тем, как это сделать ... лучшее, что я могу придумать, это сделать это за несколько проходов: во-первых, собрать allllllсообщения о коммите, затем создайте сценарий для прохождения и отфильтруйте всю информацию об авторе / коммиттере.Это кажется довольно элегантным и подверженным ошибкам, поэтому мне интересно, нашел ли кто-нибудь еще, как выполнить эту работу более плавно.

1 Ответ

4 голосов
/ 29 июля 2010

Единственное, что я могу придумать, чтобы сделать это за один проход, - это использовать фильтр фиксации. Как и фильтр сообщений, он принимает сообщение журнала на stdin, поэтому вы сможете проанализировать его и выяснить, что вам нужно. Затем вы можете сами установить соответствующие переменные и сами вызвать git commit-tree. (Фильтр фиксации, по сути, является заменой дерева коммитов, принимая те же аргументы и выводя одинаковый результат.)

В bash это будет примерно так:

message=$(read_from_stdin)

modify_env_vars "$message"

echo "$message" | git commit-tree "$@"

Я никогда не пробовал этого, но я не понимаю, почему это не сработает, если вы напишите эти две функции оболочки правильно!

(И просто небольшая заметка - это не так уж и то, что --env-filter и --msg-filter не могут влиять друг на друга, это то, что они всегда работают в таком порядке. Итак, первый фильтр может оставить позади эффекты в файлах или окружении, чтобы другие могли их видеть, но они находятся в том порядке, который мешает вам делать то, что вы хотите.)

...