Подтвердить что ты не робот

Ретроактивно исправить авторов с помощью Git SVN?

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

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

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

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

4b9b3361

Ответ 1

Начните с просмотра того, что вам нужно очистить:

git shortlog -s

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

#!/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="[email protected]" ;;
        "User Two") n="User Two" ; m="[email protected]" ;;
esac

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

В основном script, который я использовал для

Ответ 2

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/[email protected]/; s/svnname2/[email protected]/"'
    GIT_COMMITTER_EMAIL='echo "${GIT_COMMITTER_EMAIL}" | sed -e "s/svnname1/[email protected]/; s/svnname2/[email protected]/"'
'

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

Ответ 3

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

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