Изменение автора/почты для определенных коммитов

У меня есть репозиторий на битбакете, который выровнен с онлайн-репозиторием (происхождением), при этом используя 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/*'

Здесь полное руководство.

Спасибо всем, кто указал мне правильное направление.


person Liquid Core    schedule 29.05.2018    source источник
comment
Это может помочь: stackoverflow.com/a/32914963/2020827   -  person sergej    schedule 29.05.2018
comment
@phd Нет, это не так.   -  person Liquid Core    schedule 29.05.2018


Ответы (1)


Не существует «простого» способа сделать это. Информация об авторе и коммиттере является частью коммита; их изменение изменяет идентификатор фиксации. Изменение идентификатора коммита означает, что родительская информация последующих коммитов должна измениться, а это изменяет идентификаторы этих коммитов. Другими словами, чтобы изменить его, вам нужно переписать историю.

Перезапись истории не представляет особой сложности, но она сопряжена со значительными затратами, когда затронутые коммиты уже были опубликованы (или, может быть, точнее, когда «старая» версия затронутого коммита будет удалена из уже общей истории). филиала).

Чтобы сделать такой рерайт, необходимо согласовать его со всеми, кто уже получил «старые» коммиты. Я часто слышу, как люди говорят, что это было бы слишком обременительно из-за того, что у многих людей есть репо. В этом случае вы не можете позволить себе переписать. Если вы проигнорируете этот совет, скорее всего, кто-то другой, пытаясь «исправить» полученную ошибку, отменит ваше переписывание, и тогда у вас будет по-настоящему раздробленный репозиторий, который никому не нужен, пока не будет создан еще более крупный скоординированный репозиторий. усилия по его очистке завершены.

Учитывая все вышесказанное, если вы по-прежнему хотите переписать историю только для очистки адресов электронной почты нескольких коммитов, проверьте git filter-branch с параметром --env-filter.

person Mark Adelsberger    schedule 29.05.2018
comment
Я единственный назначенный ресурс для этого проекта, так что это не будет проблемой. - person Liquid Core; 29.05.2018
comment
@LiquidCore - Хорошо. Я имею в виду, вам не нужно убеждать меня. Как я уже сказал: если вы все еще хотите переписать историю только для очистки адресов электронной почты нескольких коммитов, проверьте git filter-branch с опцией --env-filter. - person Mark Adelsberger; 29.05.2018
comment
Я нашел это: stackoverflow.com/questions/38588584/ Не могли бы вы помочь мне создать команду? Как бы мне перейти на смену почты и имени/фамилии - person Liquid Core; 29.05.2018
comment
Я попробовал сценарий здесь: stackoverflow.com/questions/32910842/ Но он создал еще одну новую ветку с переименованиями, параллельными неправильной ветке истории - person Liquid Core; 29.05.2018
comment
git filter-branch создает резервные ссылки на случай, если новая история неверна. Поскольку это очень мощная команда, она хочет убедиться, что вы можете избежать ошибок. Если вновь созданная история верна, а старая история, как я предполагаю, имеет имя что-то вроде original/refs/heads/master, то операция сработала, и вам просто нужно очистить ненужные резервные ссылки. - person Mark Adelsberger; 29.05.2018
comment
оказывается, что команда очистки: git push --force --tags origin 'refs/heads/*' - person Liquid Core; 29.05.2018
comment
Запустив этот скрипт и выполнив эту последнюю команду, я исправил репо. - person Liquid Core; 29.05.2018
comment
@sergej сделал, но ответ неполный, так как очистка не указана и ее нужно искать в документации - person Liquid Core; 29.05.2018
comment
@sergej Если вы хотите поспорить, я предлагаю вам сделать это в чате, а не в комментариях. - person Liquid Core; 29.05.2018
comment
@LiquidCore - Ответы, включающие filter-branch, появляются много, и я думаю, что тем из нас, кто пишет эти ответы снова и снова, будет более разумно ожидать, что люди прочитают документацию по команде, чем для тех, кто задает вопросы, ожидающие от нас повторения снова и снова того, что уже есть в документации. Если его ответ указал вам правильное направление, вам, вероятно, следует проголосовать за, а не против. Но, в конце концов, вы используете свои голоса так, как считаете нужным. Я проголосовал, так как Сергей безубыточен по баллам и впереди по репутации от этой биржи. - person Mark Adelsberger; 29.05.2018
comment
@LiquidCore - и если вы хотите по мелочиться, помните, что вопросы также можно голосовать. - person Mark Adelsberger; 29.05.2018
comment
@MarkAdelsberger Ваш ответ указал мне правильное направление. Затем мне пришлось пробовать/ошибаться со сценарием, документацией и подсказками через интернет. Так что ответ Сергея неполный и не правильный. Ваше объяснение было ясным и побудило меня исследовать и найти решение. Что касается остального, я думаю, что ответ должен содержать весь код, необходимый для решения проблемы, если только вам не нужно публиковать огромный код, что не так. - person Liquid Core; 29.05.2018
comment
@sergej Я дал более подробное объяснение выше. Если хочешь вести себя как ребенок, делай это, для меня это не имеет значения. Мы взрослые люди со своим мнением. - person Liquid Core; 29.05.2018