У меня есть репозиторий на битбакете, который выровнен с онлайн-репозиторием (происхождением), при этом используя Atlassian Sourcetree в качестве инструмента для управления им.
Допустим, у него 20 коммитов.
Sourcetree по какой-то причине имеет свою долю удовольствия, изменяя настройки проекта, и я ошибочно нажал 2 коммита (скажем, коммит 15 и 16, как какой-то другой коллега, который тоже использует машину.
Я хочу указать свое имя и почту в этих коммитах.
Представим дерево вот так (без веток, просто мастер)
Номер фиксации -> комментарий -> идентификатор фиксации -> автор/почта
- 18 -> комментарий фиксации blabla -> 29huh23 -> я [email protected]
- 17 -> зафиксировать 17 функцию XYZ -> abs2881 -> я [email protected]
- 16 -> зафиксировать 16 функцию KWZ -> anu2716 -> кто-то другой@othercompany.com
- 15 -> зафиксировать 15 функцию IHZ -> 11suhs2 -> кто-то другой@othercompany.com
- 14 -> зафиксировать 14 функцию UYZ -> 1uuhw87 -> я [email protected]
кто-то [email protected] должен стать мной.
Я администратор репозитория.
Как это сделать простым способом? Это возможно из Sourcetree? Должен ли я сделать это из терминала?
Может ли быть работоспособным решением вручную изменить файлы в папке .git, создать новый репозиторий и зафиксировать его там?
Вопрос не дублируется, так как дублирующиеся ответы не работают.
РЕДАКТИРОВАНИЕ — ПРАВИЛЬНАЯ ПРОЦЕДУРА ДЛЯ ЛЮБОГО, ЧТО ИЩЕТ, КАК ЭТО СДЕЛАТЬ БЕЗ СЛИШКОМ БОЛЬШИХ ИССЛЕДОВАНИЙ
Поскольку все помечают это как дубликат, а это не так, поскольку другие процедуры являются НЕПОЛНЫМИ и оставляют кого-то (например, меня), кто не очень хорошо разбирается в git, с проблемами и вопросами, правильная процедура такова:
Из SourceTree запустите терминал с помощью кнопки терминала вверху справа, когда репо открыто.
Затем вставьте это и выполните с заменами, подходящими для вашего случая.
#!/bin/sh
git filter-branch --env-filter '
OLD_EMAIL="[email protected]"
CORRECT_NAME="Your Correct Name"
CORRECT_EMAIL="[email protected]"
if [ "$GIT_COMMITTER_EMAIL" = "$OLD_EMAIL" ]
then
export GIT_COMMITTER_NAME="$CORRECT_NAME"
export GIT_COMMITTER_EMAIL="$CORRECT_EMAIL"
fi
if [ "$GIT_AUTHOR_EMAIL" = "$OLD_EMAIL" ]
then
export GIT_AUTHOR_NAME="$CORRECT_NAME"
export GIT_AUTHOR_EMAIL="$CORRECT_EMAIL"
fi
' --tag-name-filter cat -- --branches --tags
Это, однако, создаст вторичную «резервную» ветвь, потому что при переписывании истории это оставило у меня много сомнений.
Мне пришлось сделать этот дополнительный шаг, чтобы удалить ветку «резервное копирование» и фактически отправить новую историю в репо и найти новую историю с правильным именем/почтой:
git push --force --tags origin 'refs/heads/*'
Здесь полное руководство.
Спасибо всем, кто указал мне правильное направление.