Смена автора / почты на конкретный коммит / ы - PullRequest
0 голосов
/ 29 мая 2018

У меня есть репозиторий в bitbucket, который выровнен с онлайн-репозиторием (origin), и в то же время использую Atlassian Sourcetree в качестве инструмента для управления им.

Допустим, он имеет 20 коммитов.

Sourcetreeпо какой-то причине у него есть доля забавного изменения настроек проекта, и я ошибочно нажал 2 коммита (скажем, коммит 15 и 16, как какой-то другой коллега, который тоже использует машину.

Я хочу поместить свое имя и почту в этикоммиты.

Давайте представим дерево вот так (без веток, просто мастер)

Номер коммита -> комментарий -> идентификатор коммита -> автор / почта

  • 18 -> зафиксировать комментарий, блабла -> 29huh23 -> me me@mycompany.com
  • 17 -> совершить 17 функцию XYZ -> abs2881 -> me me@mycompany.com
  • 16 ->функция фиксации 16 KWZ -> anu2716 -> кто-то другой@othercompany.com
  • 15 -> функция фиксации 15 IHZ -> 11suhs2 -> кто-то другой@othercompany.com
  • 14 -> фиксация 14функция UYZ -> 1uuhw87 -> меня me@mycompany.com

кто-то другой@othercompany.com должен стать мной.

Я являюсь администратором репо.

Как это сделать простым способом?Это возможно из Sourcetree?Должен ли я сделать это из терминала?

Может ли это быть реальным решением вручную изменить файлы в папке .git, создать новый репозиторий и зафиксировать там?

Вопрос не является дублирующим, как предлагаетсяповторяющиеся ответы не работают.

РЕДАКТИРОВАТЬ - ПРАВИЛЬНАЯ ПРОЦЕДУРА ДЛЯ ЛЮБОГО СМОТРЕТЬ КАК ЭТО СДЕЛАТЬ БЕЗ СЛИШКОМ ИССЛЕДОВАНИЯ

Поскольку все отмечают это как дубликат, а это не так, так как другие процедуры НЕПОЛНЕНЫ и оставляют кого-то (такого как я), который не очень крут с git, проблемами и вопросами, правильная процедура:

Из SourceTree, запустите терминал с терминаломкнопка в правом верхнем углу, когда репо открыто.

Затем вставьте это и выполните с заменами, подходящими для вашего случая

    #!/bin/sh

git filter-branch --env-filter '

OLD_EMAIL="your-old-email@example.com"
CORRECT_NAME="Your Correct Name"
CORRECT_EMAIL="your-correct-email@example.com"

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/*'

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

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

1 Ответ

0 голосов
/ 29 мая 2018

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...