Массовое переименование авторов Git? - PullRequest
2 голосов
/ 13 января 2012

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

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

Ответы [ 3 ]

5 голосов
/ 13 января 2012

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

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

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

2 голосов
/ 09 апреля 2015

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

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

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

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

    oldauthor = New Author <new@email>

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

  2. Зайдите в ваш конвертированный git-репозиторий и выполните

    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 минут в моем большом репозитории, а также оставляет исходный git-репозиторий без изменений - полезно, если что-то идет не так. И это только вершина айсберга, который является репохирургом ... Спасибо, Эрик!

0 голосов
/ 13 марта 2015

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

git filter-branch --commit-filter '
    if [ "$GIT_AUTHOR_NAME" = "old.address@domain.tld" ];
    then
        GIT_AUTHOR_NAME="New Name" \
        GIT_AUTHOR_EMAIL="new.address@domain.tld" \
        GIT_COMMITTER_NAME="New Name" \
        GIT_COMMITTER_EMAIL="new.address@domain.tld" \
        git commit-tree "$@";
    else
        git commit-tree "$@";
    fi' -f HEAD

Переписывает все коммиты, автор которых old.address@domain.tld, New Name <new.address@domain.tld>.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...