Импорт истории из SVN в Git — изменить информацию о коммиттере

#svn #git #git-svn

#svn #git #git-svn

Вопрос:

Я работаю над преобразованием некоторых репозиториев Subversion в Git с помощью инструмента git-svn. Я заметил, что, хотя информация об авторе импортируется правильно, информация о коммиттере не соответствует информации об авторе (например, дата коммиттера — это дата / время, когда я запустил инструмент git-svn).

Есть ли способ привести информацию о коммиттере в соответствие с информацией об авторе при импорте из Subversion? Если нет, то как я могу использовать git-filter-branch для перезаписи коммитов, чтобы исправить это (т. Е. скопировать информацию об авторе в информацию о коммиттере для каждого коммита)?

Спасибо!

—ОБНОВИТЬ—

Git-svn не является причиной этой проблемы, это я! Я переназначил историю Subversion, и это меняет дату коммиттера. Итак, кто-нибудь знает, как использовать git-filter-branch, чтобы изменить это (т. Е. Скопировать информацию об авторе в информацию о коммиттере для каждого коммита)?

Комментарии:

1. Черт возьми, я тоже использую git-svn, и для меня он ведет себя иначе. Информация о коммиттере и авторе всегда совпадает.

2. Я понял, что происходит — я переустанавливал историю SVN, и это меняет дату коммиттера.

3. Поскольку с git-svn это не проблема, кто-нибудь знает, как скопировать информацию об авторе в информационное поле коммиттера, используя ветвь фильтра?

Ответ №1:

Вы ищете --env-filter режим ветвления фильтра. Соответствующими переменными среды являются GIT_AUTHOR_NAME , GIT_AUTHOR_EMAIL , GIT_AUTHOR_DATE GIT_COMMITTER_NAME , GIT_COMMITTER_EMAIL GIT_COMMITTER_DATE , ,,и,,,.

Ваша команда будет выглядеть примерно так:

 git filter-branch --env-filter '
export GIT_COMMITTER_EMAIL="$GIT_AUTHOR_EMAIL"
export GIT_COMMITTER_NAME="$GIT_AUTHOR_NAME"
export GIT_COMMITTER_DATE="$GIT_AUTHOR_DATE"' -- --all
  

--all указывает, что это должно работать во всех ветвях. Ваши исходные ссылки будут сохранены в пространстве имен refs / original на случай, если вы что-то напутаете.

И, конечно, я не могу опубликовать что-либо подобное без предупреждения об опасностях для любого, кто может с этим столкнуться. Из man git-filter-branch:

ВНИМАНИЕ! Перезаписанная история будет иметь разные имена объектов для всех объектов и не будет совпадать с исходной ветвью. Вы не сможете легко протолкнуть и распространить переписанную ветвь поверх исходной. Пожалуйста, не используйте эту команду, если вы не знаете всех последствий, и в любом случае избегайте ее использования, если простого одиночного коммита будет достаточно для решения вашей проблемы. (Дополнительную информацию о перезаписи опубликованной истории см. в разделе «ВОССТАНОВЛЕНИЕ ПОСЛЕ ПЕРЕБАЗИРОВАНИЯ вышестоящего уровня» в git-rebase(1).)

Комментарии:

1. Это был правильный ответ, однако произошла небольшая опечатка: вы не можете поместить символ ‘=’ после —env-filter; это должен быть пробел. В остальном все сработало отлично. Спасибо!