#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; это должен быть пробел. В остальном все сработало отлично. Спасибо!