2012-01-13 5 views
2

Я использую svn2git для создания репозитория Git из существующего репозитория SVN. Я загрузил все это (все 10+ филиалов, теги 10+, 4000 коммитов) и в репозитории Git. Теперь, к сожалению, все авторы испорчены.Массовое переименование авторов Git?

У всех авторов нет адресов электронной почты или имен, и большинство авторов использовали несколько адресов электронной почты в течение всего срока действия проекта, поэтому я мог бы объединить их. Как я могу это сделать?

ответ

5

Инструмент, который вы хотите, это git-filter-branch. Это позволяет настроить «фильтр фиксации», который изменяет имена авторов для каждой фиксации в вашем репозитории.

Это шаг, который вы установили и запустили после после запуска svn2git. Это не то, что вы обычно хотели бы запустить в репозитории Git, к которому вы сделали дальнейшие коммиты.

Ваш вопрос указывает, что «у всех авторов нет адресов электронной почты или имен», что, по-видимому, указывает на то, что что-то в svn2git не совсем так, как предполагалось. Однако обратите внимание, что Git имеет два имен для каждой фиксации - «автор» и «коммиттер» (потому что они могут быть разными).

+0

svn не имеет (должен) иметь электронные письма для идентификаторов пользователей. Это может быть просто логин. –

+0

Это правда. Я бы сказал, что это «имя», просто не полное имя. –

+0

Не могли бы вы сослаться на «например» на то, что мне нужно было сделать? У меня около 10-15 пользователей за всю жизнь этого проекта, и я хотел бы переименовать их каждый из них; как их имена, так и их адреса электронной почты. –

0

Вот пример использования git filter-branch как предложено в предыдущем ответе:

git filter-branch --commit-filter ' 
    if [ "$GIT_AUTHOR_NAME" = "[email protected]" ]; 
    then 
     GIT_AUTHOR_NAME="New Name" \ 
     GIT_AUTHOR_EMAIL="[email protected]" \ 
     GIT_COMMITTER_NAME="New Name" \ 
     GIT_COMMITTER_EMAIL="[email protected]" \ 
     git commit-tree "[email protected]"; 
    else 
     git commit-tree "[email protected]"; 
    fi' -f HEAD 

Перезапись всех фиксаций которых автор [email protected] к New Name <[email protected]>.

1

Инструмент, который вы действительно хотите, это reposurgeon.

Как только вы доберетесь до своего размера проблемы (10 с авторами, 1000 коммитов) git filter-branch слишком медленный и неуклюжий. Он меняет только одного автора одновременно, итерации по всему репо, и весь процесс может занять несколько часов. У меня было 72 автора и 21000 коммитов, которые заняли бы 18 часов!

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

  1. Создание файла автор отображения (например authors.txt) аналогична той, которая требуется svn2git в любом случае, содержащий одну строку на SVN автора формы

    oldauthor = New Author <[email protected]>

    Здесь вы можете сопоставить несколько авторов SVN в один фактический автор, если хотите.

  2. Зайдите в переоборудованном репозиторий и сделать

    reposurgeon "verbose 1" "read" "authors read <../authors.txt" "write >../export"

  3. Теперь у вас есть быстрый файл экспорта в каталоге верхнего уровня.Преобразование это обратно в фактическое хранилище следующим образом:

mkdir ../new-repo && cd ../new-repo git init git fast-import < ../export git reset --hard HEAD # I needed this step for some reason

Вся процедура занимает менее 2 минут на моем большом хранилище, а также оставляет исходный репозиторий неповрежденным - полезно в случае, если что-то пойдет не так. И это всего лишь верхушка айсберга, который был реконструирован ... Спасибо, Эрик!

Смежные вопросы