Обратно исправлять авторов с помощью Git SVN? - PullRequest
52 голосов
/ 25 декабря 2008

У меня есть репозиторий, который у меня уже , клонированный из Subversion. Я работал над этим репозиторием в форме Git, и я бы не хотел потерять эту структуру, снова клонировав.

Однако, когда я первоначально клонировал репозиторий, мне не удалось правильно указать свойство svn.authors (или семантически подобный параметр).

Можно ли как-то указать сопоставления авторов SVN, когда репозиторий полностью Git-ified?

Предпочтительно, я хотел бы исправить всех старых авторов коммитов, чтобы они представляли автора Git, а не необработанное имя пользователя SVN.

Ответы [ 3 ]

57 голосов
/ 25 декабря 2008

Начните с того, что вы должны очистить:

git shortlog -s

Для каждого из этих имен создайте в скрипте запись, которая выглядит следующим образом (при условии, что вы хотите, чтобы все авторы и коммиттеры были одинаковыми):

#!/bin/sh

git filter-branch --env-filter '

n=$GIT_AUTHOR_NAME
m=$GIT_AUTHOR_EMAIL

case ${GIT_AUTHOR_NAME} in
        user1) n="User One" ; m="user1@example.com" ;;
        "User Two") n="User Two" ; m="user2@example.com" ;;
esac

export GIT_AUTHOR_NAME="$n"
export GIT_AUTHOR_EMAIL="$m"
export GIT_COMMITTER_NAME="$n"
export GIT_COMMITTER_EMAIL="$m"
'

Это в основном сценарий, который я недавно использовал для большого переписывания , очень похожего на то, что вы описали (за исключением того, что у меня было большое количество авторов).

edit Использование π указало на проблему с цитированием в моем скрипте. Спасибо!

11 голосов
/ 25 декабря 2008

git filter-branch можно использовать для переписывания больших кусков истории.

В этом случае вы, вероятно, сделаете что-то вроде (полностью непроверенного):

git filter-branch --env-filter '
    GIT_AUTHOR_NAME=`echo "${GIT_AUTHOR_NAME}" | sed -e "s/svnname1/Right Name/; s/svnname2/Correct Name/"`
    GIT_COMMITTER_NAME=`echo "${GIT_COMMITTER_NAME}" | sed -e "s/svnname1/Right Name/; s/svnname2/Correct Name/"`
    GIT_AUTHOR_EMAIL=`echo "${GIT_AUTHOR_EMAIL}" | sed -e "s/svnname1/m@i.l/; s/svnname2/correct.name@e.mail/"`
    GIT_COMMITTER_EMAIL=`echo "${GIT_COMMITTER_EMAIL}" | sed -e "s/svnname1/m@i.l/; s/svnname2/correct.name@e.mail/"`
'

Как всегда, применяется следующее: чтобы переписать историю, вам нужен заговор .

3 голосов
/ 25 декабря 2008

Возможно, вы захотите посмотреть на git-filter-branch, а именно на --commit-filter. Эта команда является мощной цепной пилой, которая может переписать всю историю вашего хранилища, изменяя все, что вы захотите изменить.

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

...