2010-07-28 2 views
5

У меня есть репозиторий Git, первоначально импортированный из Subversion. Части информации автора/коммиттера неверны, что не является ошибкой Git, но в основном из-за неаккуратной фиксации с Subversion.Использование git filter-branch для перезаписи авторов/коммиттеров и фиксации сообщений одновременно

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

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

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

ответ

4

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

В Баше, было бы что-то вроде этого:

message=$(read_from_stdin) 

modify_env_vars "$message" 

echo "$message" | git commit-tree "[email protected]" 

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

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

+0

Спасибо, Jefromi, я сделаю этот снимок! Кроме того, хороший момент о заказе --env-filter и -msg-filter: я подумал о том, чтобы оставить временные файлы позади, как вы предлагаете, но понял, что он не будет работать в том порядке, который я хотел. –